更多详情请看http://blog.zhangbing.club/%E...javascript
下面例举了平常前段开发中遇到的场景,解决方案有不少,但从开发阶段就进行规范,能够很大程度避免不少后续的潜在和兼容问题。html
非标准作法java
document.body
W3C规范方法c#
document.getElementsByTagName('body').item(0)
使用jQuery/Zepto数组
$('body');
非标准作法浏览器
document.title
W3C规范方法缓存
document.getElementsByTagName('title').item(0).innerHTML
使用jQuery/Zepto安全
$('title').text()
iframe.onload = function() {...}
问题:存在兼容性问题,IE六、7无效app
iframe.onload = iframe.onreadystatechange = function(){...}
问题:逻辑复杂,事件绑定逻辑混乱,在某些浏览器上onload和onreadystatechange都会触发,须要另外加标记位判断,逻辑复杂。异步
var bindIframeOnloadEvent = function(el, onload) { if (el.attachEvent){ el.attachEvent("onload", onload); } else { el.onload = onload; } }; bindIframeOnloadEvent(iframe, function(){...});
iframe.contentWindow
问题: 部分浏览器不兼容(IE67),获取失败
document.frames[frameId]
问题: 非标准调用,兼容性是问题,强制必须为iframe添加ID。
var getIframeWindow = function(el) { return el.contentWindow || el.contentDocument.parentWindow; }; var win = getIframeWindow(iframe);
iframe.boder = 0;
问题: 非W3C标准,后面极可能废弃,部分浏览器不必定支持
iframe.style.boder = 'none';
问题: 彻底依赖CSS控制,但存在兼容性问题,IE继续头疼
iframe.boder = 0; iframe.style.boder = 'none';
<a href="javascript:func();">test</a>
问题:
<a href="#" onclick="func();">test</a>
问题:
<a href="#" onclick="func();return false;">test</a>
问题:只解决了问题2,其他问题仍存在
<a id='aTest'>test</a> <script> document.getElementById('aTest').onclick = function() { func(); }; </script>
使用jQuery/Zepto亦可,存在惟一的小问题是鼠标指针不是手形,是默认。可采用CSS样式来解决cursor:pointer 。
要点
var script = document.createElement('script'); script.type = 'text/javascript'; script.src = '###'; document.getElementsByTagName('body').item(0).appendChild(script);
varbindScriptOnloadEvent = function(script, onload) { var done = false; script.onload = script.onreadystatechange = function() { if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')) { done = true; script.onload = script.onreadystatechange = null; onload(); } }; }; bindScriptOnloadEvent(script, function(){...});
须要考虑兼容性,因此代码较多
缘由:非标准,在部分浏览器报错,甚至连个人Android4.0上的浏览器都不认该函数
替代方案:使用substring函数。
现状:大多数开发同窗会混淆二者并乱用,不清楚什么时候用哪一个
详解:.text()方法用于获取和设置文本内容,.html()方法用户获取和设置HTML内容,当要设置或获取的内容仅仅为文本时,二者行为彻底相同,但要操做的文本内容是HTML时,行为有着本质区别。
总结:
要点:
for(vari=0,l=arr.length;i<l;i++){...}
for(vari in arr){...}
for(var key in obj) { if(!obj.hasOwnProperty(key) continue; //... }
要点:
不严谨的写法:
function Test() {} Test.prototype.a = 1; Test.prototype.b = 2; var o = new Test(); for(vari in o) { console.log({key: i, value: o}); } //{key:a, value:1} //{key:b, value:2} 严谨的写法: var o = new Test(); for(vari in o) { if(!o.hasOwnProperty(i)) continue; console.log({key: i, value: o}); } //无输出
错误写法:
function Test() {} Test.prototype.arr = []; var a = new Test(); var b = new Test(); a.arr.push(1); b.arr.push(2); console.log(a.arr, b.arr); //[1,2], [1,2] 正确写法 function Test() { this.arr = []; } var a = new Test(); var b = new Test(); a.arr.push(1); b.arr.push(2); console.log(a.arr, b.arr); //[1], [2]
JS是门灵活的语言,灵活到想怎么写均可以。但里面坑仍是很多的。在有多种选择时,多考虑下哪一种方法更好,而不是盲目选择一种。