最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript判斷元素存在和判斷元素存在于實(shí)時(shí)的dom中的方法

 更新時(shí)間:2017年01月17日 10:49:53   作者:yangtoude  
本文主要介紹了javascript判斷元素存在和判斷元素存在于實(shí)時(shí)的dom中的方法。具有一定的參考價(jià)值,下面跟著小編一起來看下吧

今天(周六)下午我在公司加班時(shí)不知道要干什么,就打開公司的一個(gè)wordpress項(xiàng)目網(wǎng)站,想看下之前自己做的一個(gè)網(wǎng)頁是否有問題。

打開網(wǎng)站首頁,我習(xí)慣性的打開了chrome的調(diào)試工具,然后鼠標(biāo)開始滾動(dòng)頁面,然后問題就出來了:頁面無法向下滾動(dòng),調(diào)試工具的console里報(bào)了好多undefined的錯(cuò)誤。

我馬上意識(shí)到是我寫的js代碼錯(cuò)誤的在首頁被執(zhí)行導(dǎo)致的問題,我的代碼大致是這樣:

if ($('#a')) {
 // some code ...
 $('#b').doSomething;
 // some code ...
 }

這段代碼的想要做的就是,判斷下頁面是否有某個(gè)id標(biāo)識(shí)的元素,如果有就做一些事情。網(wǎng)站首頁是應(yīng)該沒有這個(gè)元素的,不應(yīng)該執(zhí)行這個(gè)代碼。

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

注意這里獲得的不是dom element,如果想獲得真實(shí)的dom element,可以這么寫$('#a')[0]或者$('#a').get(0)。

其實(shí)$('selector')返回的永遠(yuǎn)都是一個(gè)jQuery Object,不管它找沒找到元素。(關(guān)于這個(gè)返回值的問題請(qǐng)參考:What does jquery $ actually return? How to get a DOM Element from a JQuery Selector)。

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

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

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

但我閑著沒事又google了一把,然后我就在stackoverflow上發(fā)現(xiàn)了這個(gè)問答:How to check if element exists in the visible DOM?  問題是,如何檢查元素是否存在于可見(當(dāng)前實(shí)時(shí))的dom中。

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

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

具體用法可以這么寫:

// 先獲取要判斷的元素節(jié)點(diǎn)
const aNode = document.getElementById('a');
// 然后判斷該元素節(jié)點(diǎn)是不是當(dāng)前文檔頁面body節(jié)點(diǎn)的后代
if (aNode.ownerDocument.body.contains(aNode)) {
 // do something
}

其實(shí),用這個(gè)方法可以寫一個(gè)通用的函數(shù)來判斷某個(gè)元素節(jié)點(diǎn)是否在某個(gè)頁面上,大家可以參考下Mozilla Developer Network官網(wǎng)javascript手冊(cè)上的代碼:

 function isInPage(node) {
 return (node === document.body) ? false : document.body.contains(node);
 }

上面代碼中aNode.ownerDocument是個(gè)只讀屬性,它返回aNode所在頁面的頂級(jí)文檔對(duì)象document。

另外有人還提到了這個(gè)方法:判斷元素節(jié)點(diǎn)的baseURI是否存在。

baseURI是個(gè)只讀屬性,node.baseURI返回node節(jié)點(diǎn)的絕對(duì)的基準(zhǔn)url地址(我把它理解為頁面的絕對(duì)url地址),比如$('#a')[0].baseURI,

我在chrome下試了下,#a元素存在的話就會(huì)返回一個(gè)url字符串,不存在的話報(bào)undefined錯(cuò)誤(#a不存在自然會(huì)報(bào)這個(gè)錯(cuò)誤),感覺這個(gè)方法在實(shí)際應(yīng)用中不太好操作,要拋出和捕捉錯(cuò)誤,感興趣的同學(xué)可以研究下。

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

<!DOCTYPE html>
<html>
<head>
 <script>
 var getRandomID = function (size) {
   var str = "",
    i = 0,
    chars = "0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ";
   while (i < size) {
    str += chars.substr(Math.floor(Math.random() * 62), 1);
    i++;
   }
   return str;
  },
  isNull = function (element) {
   var randomID = getRandomID(12),
    savedID = (element.id)? element.id : null;
   element.id = randomID;
   var foundElm = document.getElementById(randomID);
   element.removeAttribute('id');
   if (savedID !== null) {
    element.id = savedID;
   }
   return (foundElm) ? false : true;
  };
 window.onload = function () {
  var image = document.getElementById("demo");
  console.log('undefined', (typeof image === 'undefined') ? true : false); // false
  console.log('null', (image === null) ? true : false); // false
  console.log('find-by-id', isNull(image)); // false
  image.parentNode.removeChild(image);
  console.log('undefined', (typeof image === 'undefined') ? true : false); // false ~ should be true?
  console.log('null', (image === null) ? true : false); // false ~ should be true?
  console.log('find-by-id', isNull(image)); // true ~ correct but there must be a better way than this?
 };
 </script>
</head>
<body>
 <div id="demo"></div>
</body>
</html>

注意代碼中的isNull函數(shù),它是用來判斷元素是否存在的,這個(gè)方法其實(shí)是依據(jù)元素的id是否為null來判斷,思路好像和用baseURI來判斷是相同的。我試了下,當(dāng)元素存在時(shí)返回true,

但當(dāng)元素不存在時(shí),它會(huì)報(bào)undefined錯(cuò)誤,感興趣的同學(xué)可以研究下。

總結(jié):

其實(shí)判斷一個(gè)元素是否存在,用getElementById()(或其他選擇元素的方法)再配合是否為null來判斷,或用jQuery獲取對(duì)象并判斷其length,簡(jiǎn)單又直接。

但如果想判斷一個(gè)元素是否在當(dāng)前實(shí)時(shí)可見的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

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • JS實(shí)現(xiàn)兼容性較好的隨屏滾動(dòng)效果

    JS實(shí)現(xiàn)兼容性較好的隨屏滾動(dòng)效果

    這篇文章主要介紹了JS實(shí)現(xiàn)兼容性較好的隨屏滾動(dòng)效果,演示了固定位置顯示和隨屏滾動(dòng)兩種效果的實(shí)現(xiàn)方法,涉及css樣式的設(shè)置與結(jié)合時(shí)間函數(shù)遞歸調(diào)用實(shí)現(xiàn)滾屏的技巧,需要的朋友可以參考下
    2015-11-11
  • Bootstrap學(xué)習(xí)筆記之css樣式設(shè)計(jì)(1)

    Bootstrap學(xué)習(xí)筆記之css樣式設(shè)計(jì)(1)

    這篇文章主要為大家詳細(xì)介紹了bootstrap學(xué)習(xí)筆記之css樣式設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 自定義require函數(shù)讓瀏覽器按需加載Js文件

    自定義require函數(shù)讓瀏覽器按需加載Js文件

    可能很多人看到這個(gè)題目就會(huì)想到LABjs、RequireJS、SeaJS... 這些庫,但無奈小編沒用過這些庫,什么 AMD 、CMD 哪來那么多術(shù)語... 前端的庫太多了,要看各種亂七八糟的文檔,好難啊,還不如自己寫一個(gè)庫呢。于是就有了這文章,有需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2016-11-11
  • 基于JS實(shí)現(xiàn)視頻上傳顯示進(jìn)度條

    基于JS實(shí)現(xiàn)視頻上傳顯示進(jìn)度條

    這篇文章主要介紹了基于JS實(shí)現(xiàn)視頻上傳顯示進(jìn)度條,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • PHPExcel中的一些常用方法匯總

    PHPExcel中的一些常用方法匯總

    這篇文章主要介紹了PHPExcel中的一些常用方法匯總,本文直接給出操作代碼實(shí)例,代碼中對(duì)常用方法給出了注釋,需要的朋友可以參考下
    2015-01-01
  • 30分鐘快速入門掌握ES6/ES2015的核心內(nèi)容(下)

    30分鐘快速入門掌握ES6/ES2015的核心內(nèi)容(下)

    這篇文章主要給大家介紹了如何通過30分鐘快速入門掌握ES6/ES2015的核心內(nèi)容的相關(guān)資料,之前給大家介紹過基礎(chǔ)的一些內(nèi)容,下面繼續(xù)來介紹一些其他的新特性,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-04-04
  • 深入理解Webpack 中路徑的配置

    深入理解Webpack 中路徑的配置

    這篇文章主要給大家介紹了關(guān)于Webpack2中路徑配置的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • javascript attachEvent和addEventListener使用方法

    javascript attachEvent和addEventListener使用方法

    attachEvent與addEventListener區(qū)別 適應(yīng)的瀏覽器版本不同,同時(shí)在使用的過程中要注意
    2009-03-03
  • 微信小程序wxml不能使用Array.includes條件判斷解決方法

    微信小程序wxml不能使用Array.includes條件判斷解決方法

    這篇文章主要為大家介紹了微信小程序wxml不能使用Array.includes條件判斷解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • JS如何調(diào)用WebAssembly編譯出來的.wasm文件

    JS如何調(diào)用WebAssembly編譯出來的.wasm文件

    這篇文章主要介紹了關(guān)于WebAssembly編譯出來的.wasm文件js如何調(diào)用,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論

芷江| 高清| 陆丰市| 永新县| 宜君县| 阜南县| 双江| 天长市| 新平| 台北县| 博野县| 铁岭县| 土默特左旗| 枞阳县| 昌吉市| 逊克县| 错那县| 宁波市| 壤塘县| 松阳县| 曲周县| 贵定县| 洪洞县| 延津县| 康马县| 进贤县| 寻甸| 平顶山市| 山东| 抚松县| 乐昌市| 贞丰县| 军事| 永川市| 黑河市| 龙井市| 赣州市| 长岛县| 平潭县| 阿拉善右旗| 炎陵县|