一行代碼告別document.getElementById

來源:互聯網
上載者:User

所以絕大多數的指令碼裡,都是直接通過元素的id來訪問DOM的。
  
  後來隨著各種瀏覽器接踵而至,逐漸的替代了ie。為了保證各路門派統一規則,標準化越來越被重視。當初那種直接存取id的方法,逐漸被document.getElementById所替代。如果這年頭還在用id訪問元素,要麼就是做程式裡的內嵌網頁,要麼就是像鐵道部那樣的超境界仿古網站:) 當然只要保證你的使用者都是用ie訪問,這樣的非標準也但用無妨。
  
  然而,很多第三方瀏覽器剛出來的時候,為了保證能與當時大量的非標準頁面相容,都保留了用id訪問DOM這一非標準做法。事實上如今的主流瀏覽器,只有FireFox不支援這種做法,而Chrome,Opera,Safari,Mobile Safari都支援。
  
  既然如此,我們不如讓FireFox也支援,這樣所有的瀏覽器都可以直接用id直接存取DOM,不僅快捷方便,減少了累贅的代碼,更能提升啟動並執行效率。
  
  實現很簡單,文檔載入完成後查詢帶有id屬性的元素,然後在window對象裡添加其引用:
複製代碼 代碼如下:
var list = document.querySelectorAll('[id]');
for(var i = 0; i < list.length; i++)
{
if(list[i].id)
window[list[i].id] = list[i];
}

當然,只有FF需要這個hack,所以我們先檢測下是否有其特徵。最後精簡下代碼,利用數組遍曆回調,即可壓縮到簡單的一行:
複製代碼 代碼如下:
<script>
if('mozHidden' in document) [].forEach.call(document.querySelectorAll('[id]'),function(k){this[k.id]=k});
</script>

  不過有個值得注意的地方,在文檔載入尚未完成前 querySelectorAll,只能查詢當前<script>之前的元素。所以以上代碼必須放在文檔的末尾。而使用id訪問,也必須在文檔載入完成之後,否則就可能找不到這個元素。下面是個測試頁面,在所有瀏覽器下都通過:
複製代碼 代碼如下:
<!DOCTYPE html>
<html>
<head>
<title>No document.getElementById</title>
</head>
<body>
<div id="mytag"></div>
<script>
onload = function()
{
mytag.innerHTML = "Goodbye, document.getElementById!";
}
</script>
<script>
if('mozHidden' in document) [].forEach.call(document.querySelectorAll('[id]'),function(e){self[e.id]=e});
</script>
</body>
</html>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.