javascript判斷元素存在和判斷元素存在於實時的dom中的方法

来源:http://www.cnblogs.com/yangtoude/archive/2016/11/05/6034015.html
-Advertisement-
Play Games

今天(周六)下午我在公司加班時不知道要乾什麼,就打開公司的一個wordpress項目網站,想看下之前自己做的一個網頁是否有問題。 打開網站首頁,我習慣性的打開了chrome的調試工具,然後滑鼠開始滾動頁面,然後問題就出來了:頁面無法向下滾動,調試工具的console里報了好多undefined的錯誤 ...


今天(周六)下午我在公司加班時不知道要乾什麼,就打開公司的一個wordpress項目網站,想看下之前自己做的一個網頁是否有問題。

打開網站首頁,我習慣性的打開了chrome的調試工具,然後滑鼠開始滾動頁面,然後問題就出來了:頁面無法向下滾動,調試工具的console里報了好多undefined的錯誤。

我馬上意識到是我寫的js代碼錯誤的在首頁被執行導致的問題,我的代碼大致是這樣:

1 if ($('#a')) {
2   // some code ...
3   $('#b').doSomething;
4   // some code ...
5 }
View Code

這段代碼的想要做的就是,判斷下頁面是否有某個id標識的元素,如果有就做一些事情。網站首頁是應該沒有這個元素的,不應該執行這個代碼。

好吧,如果你看到這裡,你肯定能猜到我不是做前端的。我期望它返回一個布爾類型的false,但它實際上返回的是一個jQuery Object,

註意這裡獲得的不是dom element,如果想獲得真實的dom element,可以這麼寫$('#a')[0]或者$('#a').get(0)

其實$('selector')返回的永遠都是一個jQuery Object,不管它找沒找到元素。(關於這個返回值的問題請參考:What does jquery $ actually return? 和 How to get a DOM Element from a JQuery Selector)。

那麼我該如何判斷id=a的元素是否存在呢?其實可以這麼做,if ($('#a').length),如果沒有#a則返回的object其實是個空對象,可以達到目的。

getElementById('a')可以嗎,它返回的是Element object的一個參考(object類型)或者是null(document.getElementById()),可以用來判斷。

到此,我的問題就解決了,也就沒有這篇文章了。

 


 

但我閑著沒事又google了一把,然後我就在stackoverflow上發現了這個問答:How to check if element exists in the visible DOM?  問題是,如何檢查元素是否存在於可見(當前實時)的dom中

這個問答里提到了好多方法,除了上面兩個提到的方法,其他的比如getElementsByClassName、getElementsByName、querySelector等等,總之這些方法思路基本和上面的兩個是相同的,就是簡單的檢查元素是否存在。

對於題主的提問,有人提供了以下兩個比較有意思的方法,其中一個是:document.body.contains(element),這裡面用到了node.contains(othernode)方法,它可以判斷othernode是不是node的後代,並返回一個布爾值。

具體用法可以這麼寫:

1 // 先獲取要判斷的元素節點
2 const aNode = document.getElementById('a');
3 
4 // 然後判斷該元素節點是不是當前文檔頁面body節點的後代
5 if (aNode.ownerDocument.body.contains(aNode)) {
6  // do something
7 }
View Code

其實,用這個方法可以寫一個通用的函數來判斷某個元素節點是否在某個頁面上,大家可以參考下Mozilla Developer Network官網javascript手冊上的代碼:

1 function isInPage(node) {
2   return (node === document.body) ? false : document.body.contains(node);
3 }
View Code

上面代碼中aNode.ownerDocument是個只讀屬性,它返回aNode所在頁面的頂級文檔對象document。

另外有人還提到了這個方法:判斷元素節點的baseURI是否存在。

baseURI是個只讀屬性,node.baseURI返回node節點的絕對的基準url地址(我把它理解為頁面的絕對url地址),比如$('#a')[0].baseURI,

我在chrome下試了下,#a元素存在的話就會返回一個url字元串,不存在的話報undefined錯誤(#a不存在自然會報這個錯誤),感覺這個方法在實際應用中不太好操作,要拋出和捕捉錯誤,感興趣的同學可以研究下。

How to check if element exists in the visible DOM?這個問答的發起者自己寫了個方法,我把代碼貼到下麵:

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <script>
 5     var getRandomID = function (size) {
 6             var str = "",
 7                 i = 0,
 8                 chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
 9             while (i < size) {
10                 str += chars.substr(Math.floor(Math.random() * 62), 1);
11                 i++;
12             }
13             return str;
14         },
15         isNull = function (element) {
16             var randomID = getRandomID(12),
17                 savedID = (element.id)? element.id : null;
18             element.id = randomID;
19             var foundElm = document.getElementById(randomID);
20             element.removeAttribute('id');
21             if (savedID !== null) {
22                 element.id = savedID;
23             }
24             return (foundElm) ? false : true;
25         };
26     window.onload = function () {
27         var image = document.getElementById("demo");
28         console.log('undefined', (typeof image === 'undefined') ? true : false); // false
29         console.log('null', (image === null) ? true : false); // false
30         console.log('find-by-id', isNull(image)); // false
31         image.parentNode.removeChild(image);
32         console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
33         console.log('null', (image === null) ? true : false); // false ~ should be true?
34         console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
35     };
36     </script>
37 </head>
38 <body>
39     <div id="demo"></div>
40 </body>
41 </html>
View Code

註意代碼中的isNull函數,它是用來判斷元素是否存在的,這個方法其實是依據元素的id是否為null來判斷,思路好像和用baseURI來判斷是相同的。我試了下,當元素存在時返回true,

但當元素不存在時,它會報undefined錯誤,感興趣的同學可以研究下。

 


 

總結:

其實判斷一個元素是否存在,用getElementById()(或其他選擇元素的方法)再配合是否為null來判斷,或用jQuery獲取對象並判斷其length,簡單又直接。

但如果想判斷一個元素是否在當前實時可見的dom中,那就用node.contains(othernode)方法。

 

參考:

1,How to check if element exists in the visible DOM?

2,What does jquery $ actually return?

2,Node.contains()

3,Node.ownerDocument

4,How to get a DOM Element from a JQuery Selector

5,https://api.jquery.com/get/

6,baseURI

 

PS:感覺寫博客比寫代碼累多了,自己寫點兒東西,以防自己忘記。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 邏輯層職責: 負責整個系統 中業務邏輯的處理。 邏輯層架構特點: 邏輯層業務複雜; 設計方式: 1、All In ONE方式:所有業務一個整體、一個文件、一個類里。 特點:簡單,適合業務量小; 問題:耦合性嚴重;文件內容複雜、開發維護代價高、牽一發動全身; 適合場景:創業期、業務不複雜; 2、業務垂... ...
  • 1.1概述 將一個複雜對象的構建與它的表示分離,使同樣的構建過程可以創建不同的表示。這就是生產器模式的定義。 如果一個類中有若幹個成員變數是其他類聲明的對象,那麼該類創建的對象就可以包含若幹個其他對象作為其成員。習慣上把一個對象中的成員對象稱作它的組件,例如,幾何(Geometry)類含有三角形(T ...
  • 1.許可權的簡單描述 2.實例表結構及內容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-許可權認證,登錄認證層 6.Shiro-applicationContext-shiro.xml 7.HomeController三個JSP文件 1.許可權 ...
  • 一、前言 1.1、國際化簡介 國際化是指應用程式在運行的時候,根據客戶端請求來自的國家地區、語言的不同而顯示不同的界面(簡單說就是根據你的地區顯示相關地區的語言,如果你現在在英國,那麼顯示的語言就是英語),國際化的存在價值就是:當一個應用需要在全球使用。 國際化(Internationalizati ...
  • 1.1概述 提供一個創建一系列或相互依賴對象的介面,而無須指定他們具體的類。這就是抽象工廠模式的定義。 設計某些系統時可能需要為用戶提供一系列相關的對象,但系統不希望用戶直接使用new運算符實例化這些對象,而是應當由系統來控制這些對象的創建,否則用戶不僅要清楚地知道使用哪些類來創建這些對象,而且還必 ...
  • 一、前言 OGNL和標簽庫的作用,粗暴一點說,就是減少在JSP頁面中出現java代碼,利於維護。 1.1、OGNL 1.1.1、什麼是OGNL? OGNL(Object-Graph Navigation Language):對象圖形導航語言,是一種功能強大的表達式語言,通過簡單的語法,就能夠任意存取 ...
  • 秋招結束了~~,好像偷懶了很久,沒更博了。總結一下自己近來看書的內容。 說明一下,內容大部分來自《高性能網站建設進階指南》。 亂入內容 Web應用和傳統桌面應用有一個共同的目標:儘可能快地響應用戶輸入。 怎樣才算是快?Jakob Nielsen是Web可用性領域知名且備受推崇的專家,引用他的觀點來說 ...
  • 前言 隨著頁面的內容豐富,以及網站體驗更好、性能優化等,原有的通過script標簽引入JavaScript腳本的方式已經不能很好地解決,此時新的一種JavaScript載入方式產生了——延時載入、執行。而js(JavaScript,下同)模塊化可以說是上面延時、執行的一種表示形式。 requirej ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...