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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...