接着上一篇《Let's free of jQuery!》,上一篇主要介绍 jQuery 中最常用的一些方法的原生解决方案,本篇则会介绍余下相对较少用到的内容。
11. form 表单序列化
在 jQuery 中,有一个 serialize() 方法,该可以通过序列化表单值,创建 URL 编码文本字符串,在 ajax 提交表单时很有用,下面介绍一下原生的方法:
function formToString(formObj){ var allStr = ''; if(formObj){ var elementsObj = formObj.elements; var obj; if( elementsObj ){ for(var i = 0; i < elementsObj.length; i += 1 ){ obj = elementsObj[i]; if( obj.name != undefined && obj.name != 'submit' && obj.name != '' ){ if( i == 0 ) allStr += obj.name + '=' + encodeURIComponent(obj.value); else allStr += '&' + obj.name + '=' + encodeURIComponent(obj.value); } } } else { alert('没有elements对象!'); return ; } } else { alert('form不存在!'); return ; } return allStr; } // 这里默认排除了 name 为 submit 的表单元素值,参数为一个 form 节点,最终得到的结果保持了与 serialize() 一致的形式,例如: var data = formToString(document.getElementsByTagName('form')[0]);
12. 动画
这里主要列出 jQuery 的 show(), hide(), slideUp(), slideDown() 的替代算法,关于动画的部分并不是这两篇文章介绍的重点,因此其中的原理就不再详述了,有兴趣的童鞋可以研究下面的源码:
// 动画构造 function animInit(obj, time, type, mode){ obj.style.overflow = 'hidden'; if( mode == 'show' ){ obj.style.height = 0; obj.style.display = 'block'; var resultH = 0; for( var i = 0; i < obj.childNodes.length; i++ ){ var temp = obj.childNodes[i].offsetHeight; if( temp != undefined ){ resultH = resultH + temp; } } if( type == 'slide' ){ var resultW = 'auto'; } else { var resultW = obj.offsetWidth; obj.style.width = 0; } } else { var resultW = obj.offsetWidth; var resultH = obj.offsetHeight; } var dataW = resultW, dataH = resultH; var piece = time / 10; var heightChange = dataH / piece; var widthChange = dataW / piece; return [dataW, dataH, widthChange, heightChange]; } // 动画执行 function show(obj, time, type, callback){ var data = animInit(obj, time, type, 'show'), dataW = data[0], dataH = data[1], widthChange = data[2], heightChange = data[3]; if( type != 'slide' ) var currentW = obj.style.width.replace('px', ''); var currentH = obj.style.height.replace('px', ''); var init = setInterval((function(){ if( currentH < dataH ){ if( type != 'slide' ){ currentW = parseFloat(currentW) + parseFloat(widthChange); obj.style.width = currentW + 'px'; } currentH = parseFloat(currentH) + parseFloat(heightChange); obj.style.height = currentH + 'px'; } else { clearInterval(init); obj.style.cssText = 'display: block'; if( callback != undefined ) callback(); } }), 10); } // 动画执行 function hide(obj, time, type, callback){ var data = animInit(obj, time, type, 'hide'), dataW = data[0], dataH = data[1], widthChange = data[2], heightChange = data[3]; if( type != 'slide' ) var currentW = dataW; var currentH = dataH; var init = setInterval((function(){ if( currentH > widthChange ){ if( type != 'slide' ){ currentW = parseFloat(currentW) - parseFloat(widthChange); obj.style.width = currentW + 'px'; } currentH = parseFloat(currentH) - parseFloat(heightChange); obj.style.height = currentH + 'px'; } else { clearInterval(init); obj.style.cssText = 'display: none'; if( callback != undefined ) callback(); } }), 10); }
本文由 Kayo Lee 发表,本文链接:https://kayosite.com/lets-free-of-jquery-part-two.html
评论列表
第11收了
@kn007 哈哈,欢迎欢迎,11也是我最常用的,每个项目都用得到!
animate()函数,嘻嘻
@Dolly 嗯,这个代替了animate()的一部分,但animate()的逻辑实际上比上面的要复杂,我更倾向于把不同的逻辑独立出来,方便调用!
博主用的什么代码高亮插件?
博主,我们交换个友情链接吧。
http://www.xuzefeng.com/links.html
我在这里加了博主的链接。
@Ken 高亮插件是SyntaxHighlighter Evolved
友链已加!
jq主要是兼容性较好。。
@大发 是的,jq考虑的情况灰常全面,而且功能齐全甚至很多时候我觉得有点过多了!
虽然jq很肿,但是好用啊233