更多詳情請看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是門靈活的語言,靈活到想怎麼寫均可以。但裏面坑仍是很多的。在有多種選擇時,多考慮下哪一種方法更好,而不是盲目選擇一種。