1.if條件語句相關 對於 if 語句括弧里的表達式,ECMAScript 會自動調用 Boolean()轉型函數將這個表達式的結果轉換成一個布爾值。如果值為 true,執行後面的一條語句,否則不執行。 2.arguments相關 通過arguments 對象的length屬性,來智能的判斷有多少參 ...
1.if條件語句相關
對於 if 語句括弧里的表達式,ECMAScript 會自動調用 Boolean()轉型函數將這個表達式的結果轉換成一個布爾值。如果值為 true,執行後面的一條語句,否則不執行。
2.arguments相關
通過arguments 對象的length屬性,來智能的判斷有多少參數,然後把參數進行合理的應用 。
比如,要實現一個加法運算,將所有傳進來的數字累加,而數字的個數又不確定。
function box() { var sum = 0; if (arguments.length == 0) return sum; //如果沒有參數,退出 for(var i = 0;i < arguments.length; i++) { //如果有,就累加 sum = sum + arguments[i]; } return sum; //返回累加結果 } alert(box(5,9,12));
3.函數內部屬性
函數內部,有兩個特殊的對象:arguments 和 this。arguments 是一個類數組對象,包含著傳入函數中的所有參數,主要用途是保存函數參數。但這個對象還有一個名叫 callee 的屬性,該屬性是一個指針,指向擁有這個 arguments 對象的函數。 對於階乘函數一般要用到遞歸演算法,所以函數內部一定會調用自身;如果函數名不改變是沒有問題的,但一旦改變函數名,內部的自身調用需要逐一修改。為瞭解決這個問題,我們可以使用 arguments.callee 來代替。function box(num) { if (num <= 1) { return 1; } else { return num * arguments.callee(num-1);//使用 callee 來執行自身 } }
4. event對象
直接接收 event 對象,是 W3C 的做法,IE 不支持,IE 自己定義了一個 event 對象,直接在 window.event 獲取即可。
input.onclick = function (evt) { var e = evt || window.event; //實現跨瀏覽器相容獲取 event 對象 alert(e); };
5.事件的目標
W3C 中的 target 和 IE 中的 srcElement,都表示事件的目標。
function getTarget(evt) { var e = evt || window.event; return e.target || e.srcElement; //相容得到事件目標 DOM 對象 } document.onclick = function (evt) { var target = getTarget(evt); alert(target); };
6.阻止事件冒泡
在阻止冒泡的過程中,W3C 和 IE 採用的不同的方法,那麼我們必須做一下相容。
function stopPro(evt) { var e = evt || window.event; window.event ? e.cancelBubble = true : e.stopPropagation(); }
7.阻止事件預設行為
function preDef(evt) { var e = evt || window.event; if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } }
8.上下文菜單事件:contextmenu
當我們右擊網頁的時候,會自動出現 windows 自帶的菜單。那麼我們可以使用 contextmenu 事件來修改我們指定的菜單,但前提是把右擊的預設行為取消掉。
function addEvent(obj, type, fn) { //添加事件相容 if (obj.addEventListener) { obj.addEventListener(type, fn); } else if (obj.attachEvent) { obj.attachEvent('on' + type, fn); } } function removeEvent(obj, type, fn) { //移除事件相容 if (obj.removeEventListener) { ob j.removeEventListener(type, fn); } else if (obj.detachEvent) { obj.detachEvent('on' + type, fn); } } addEvent(window, 'load', function () { var text = document.getElementById('text'); addEvent(text, 'contextmenu', function (evt) { var e = evt || window.event; preDef(e); var menu = document.getElementById('menu'); menu.style.left = e.clientX + 'px'; menu.style.top = e.clientY + 'px'; menu.style.visibility = 'visible'; addEvent(document, 'click', function () { document.getElementById('myMenu').style.visibility = 'hidden'; }); }); });
9.js中的文檔模式-document.compatMode
文檔模式在開發中貌似很少用到,最常見的是就是在獲取頁面寬高的時候,比如文檔寬高,可見區域寬高等。IE對盒模型的渲染在 Standards Mode和Quirks Mode是有很大差別的,在Standards Mode下對於盒模型的解釋和其他的標準瀏覽器是一樣,但在Quirks Mode模式下則有很大差別,而在不聲明Doctype的情況下,IE預設又是Quirks Mode。所以為相容性考慮,我們可能需要獲取當前的文檔渲染方式。
document.compatMode正好派上用場,它有兩種可能的返回值:BackCompat和CSS1Compat。
BackCompat:標準相容模式關閉。瀏覽器客戶區寬度是document.body.clientWidth;
CSS1Compat:標準相容模式開啟。 瀏覽器客戶區寬度是document.documentElement.clientWidth。
例如:
function getViewport(){ if (document.compatMode == "BackCompat"){ return { width: document.body.clientWidth, height: document.body.clientHeight } } else { return { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight } } }
10.跨瀏覽器獲取Style
function getStyle(element, attr) { if (typeof window.getComputedStyle != 'undefined') {//W3C return window.getComputedStyle(element, null)[attr]; } else if (typeof element.currentStyle != 'undeinfed') {//IE return element.currentStyle[attr]; } }
11.js動態插入css相關styleSheets,insertRule,addRule,還有刪除樣式:deleteRule,removeRule
標準瀏覽器支持 insertRule, IE低版本則支持 addRule。
12.獲取頁面的寬高
window.innerWidth,window.innerHeight與document.documentElement.clientWidth,document.documentElement.clientHeight 註:用jquery獲取的頁面的寬度頁面不包括滾動條的寬度的 window.innerWidth與window.innerHeight(IE9及以上,谷歌,火狐識別,寬高包含滾動條的寬度) document.documentElement.clientWidth與document.documentElement.clientHeight(IE,火狐,谷歌都能識別,寬高不包含滾動條的寬度) 如果頁面沒有滾動條: window.innerWidth==document.documentElement.clientWidth, window.innerHeight==document.documentElement.clientHeight(IE8及一下不識別window.innerHeight與window.innerWidth)//跨瀏覽器獲取視口大小 function getInner() { if (typeof window.innerWidth != 'undefined') { //IE8及以下undefined return { width : window.innerWidth, height : window.innerHeight } } else { return { width : document.documentElement.clientWidth, height : document.documentElement.clientHeight } } }