使用||運算符指定一個默認值
事件處理程序依賴于瀏覽器。理想情況下,應用程序應該通過公共庫隔絕對瀏覽器的依賴。當沒有這樣的庫時,就會有些函數(shù)發(fā)生如下情況:
function md(e) { (window.event) ? ev = window.event : ev = e; (ev.target) ? sr = ev.target : sr = ev.srcElement; if (ev && sr && sr.id == "fp" || sr.id == "sb") st = 1; if (sr.className.indexOf("pllist") < 0 && sr.className != "more" && sr.className != "plinkc" && sr.tagName != "scrollbar " && _toClose && _toCloseNorgie) { d.getElementById(_toClose).innerHTML = ""; _toClose = ""; _toCloseNorgie.parentNode.className = ''; _toCloseNorgie = ''; } }
一些瀏覽器把事件對象作為一個參數(shù)傳給事件管理程序。微軟選用把事件對象放入到一個全局的事件變量中。在Javascript中,全局變量是全局對象的成員。在瀏覽器中,全局對象始終包含一個window對象成員,其值是全局對象。當測試一個變量是否存在時,通過window訪問全局變量是避免未定義變量錯誤的一種方法。無論如何,做這樣的測試不應該是必要的。
我們能通過問它是否是另外一種,來代替首先判斷是否是微軟事件。
ev = e || event;我們用||(默認)運算符。如果e是真,我們將有它的值,但是如果e是假,則我們將用event。
在下一個語句,我們又用||運算符去確定sr是哪個值。
我們應該用var去聲明ev和sr來避免全局沖突:
function md(e) { var ev = e || event, sr = ev.target || ev.srcElement; if (sr && (sr.id == 'fp' || sr.id == 'sb')) { st = 1; } if (sr.className.indexOf('pllist') < 0 && sr.className != 'more' && sr.className != 'plinkc' && sr.tagName != 'scrollbar ' && _toClose && _toCloseNorgie) { d.getElementById(_toClose).innerHTML = ''; _toClose = ''; _toCloseNorgie.parentNode.className = ''; _toCloseNorgie = ''; } }
全局變量是魔鬼
下面我們看到另一個時間處理程序。正如你所料,它重復像前面一樣破壞風格。
function kd(e) { (window.event) ? ev = window.event : ev = e; (ev.target) ? el = ev.target : el = ev.srcElement; if (ev && el) { code = ev.keyCode; id = el.id; } else { return; } ctn = lt.id.substring(1); if (code == 13) { return; } else if ((code == 191 || code == 222) && id != 'fp') { _ffs = 1; gk = 0; } else if ((code < 31 || code > 41) && (code < 16 || code > 18) && code != 9 && code != 8 ) { gk = 1; } else { gk = 0; } if (!_ffs && (id == 'fp' || id == 'st')) { if (code == 9) { if (box.value == '' || (box.value != '' && (at == 1 || ev.shiftKey))) { mt(ctn); } else if (id == 'st' && box.value != '' && at == 0) { at = 1; mt(ctn); } } else if (id == 'fp' && gk == 0 && (box.value == '' && st == 0) && !ev.shiftKey && !ev.ctrlKey && !ev.altKey) { d.getElementById('mk').focus(); d.getElementById('mk').blur(); } else if (gk == 1) { at = 0; } } else if ((id == 'mk2' && box.value != '' && ev.shiftKey && code == 9) || (id == 'm6' && !ev.shiftKey && code == 9)){ d.getElementById('mk').focus(); } else if (!_ffs && gk == 1 && el.type != 'text' && !ev.ctrlKey && !ev.altKey){ box.value = ''; box.focus(); } } function mt(ctn) { if ((ev && !ev.ctrlKey && !ev.altKey) || !ev) { if (ev.shiftKey){ nextTab = parseInt(ctn) - 1; } else { nextTab = parseInt(ctn) + 1; } if (nextTab == 0) { d.getElementById('mk').focus(); } else if (nextTab < 8 ) { t(d.getElementById('v' + nextTab)); } else { return; } } }
有意思的是它有一個同伴函數(shù)mt,它僅被kd調(diào)用。mt被傳給一個參數(shù)ctn,但kd和mt之間的通訊大部分是通過全局變量。
出處:隨網(wǎng)之舞
責任編輯:bluehearts
上一頁 Javascript風格要素 [1] 下一頁 Javascript風格要素 [3]
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|