搜尋

首頁  >  問答  >  主體

querySelectorAll 和 getElementsBy* 方法回傳什麼?

<p><code>getElementsByClassName</code>(以及<code>getElementsByTagName</code> 和<code>querySelectorAll</code> 等類似函數)與<code>querySelectorAll</code>方式相同嗎?回傳一個元素數組? </p> <p>我問的原因是因為我試著用<code>getElementsByClassName</code>更改所有元素的樣式。見下文。 </p> <pre class="brush:php;toolbar:false;">//doesn't work document.getElementsByClassName('myElement').style.size = '100px'; //works document.getElementById('myIdElement').style.size = '100px';</pre></p>
P粉060112396P粉060112396465 天前603

全部回覆(2)我來回復

  • P粉904405941

    P粉9044059412023-08-25 17:17:22

    您使用陣列作為對象,getElementbyIdgetElementsByClassName 是:

    getElementsByClassName

    https://www.w3.org/ TR/2008/WD-html5-20080610/dom.html#getelementsbyclassname

    取得ElementById

    https://developer.mozilla.org/en- US/docs/Web/API/Document/getElementById

    在您的程式碼中包含以下行:

    按預期工作,因為getElementByClassName將傳回一個數組,並且該數組具有樣式< /code> 屬性,您可以透過迭代來存取每個元素

    這就是函數 getElementById 為您工作的原因,該函數將傳回直接物件。因此,您將能夠存取 style 屬性。

    回覆
    0
  • P粉520545753

    P粉5205457532023-08-25 16:48:41

    您的getElementById 程式碼之所以有效,是因為ID 必須是唯一的,因此該函數總是只傳回一個元素(如果沒有找到,則傳回null )。

    但是,這些方法 getElementsByClassName, getElementsByName, getItemByTagName,以及 getElementsByTagNameNS 傳回一個可迭代的元素集合。

    方法名稱提供了提示:getElement 暗示單數,而getElements 暗示複數

    方法querySelector 也傳回單一元素,並且 querySelectorAll 傳回一個可迭代的集合。

    可迭代集合可以是 NodeListHTMLCollection一個>.

    getElementsByNamequerySelectorAll 都指定傳回節點清單;其他getElementsBy * 方法 指定傳回< code>HTMLCollection,但請注意,某些瀏覽器版本的實作方式有所不同。

    這兩種集合類型不提供與元素、節點或類似類型相同的屬性;這就是為什麼從document.getElements()讀取style 失敗的原因。 換句話說:NodeListHTMLCollection 沒有 style;只有 Element 具有 style


    這些「類似數組」的集合是包含零個或多個元素的列表,您需要對其進行迭代才能存取它們。 雖然您可以像數組一樣迭代它們,但請注意,它們與不同 “https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /Global_Objects/Array”rel="noreferrer">陣列s。

    在現代瀏覽器中,您可以使用Array.from;那麼您可以使用forEach 和其他陣列方法,例如迭代方法

    Array.from(document.getElementsByClassName("myElement"))
      .forEach((element) => element.style.size = "100px");
    

    在不支援 Array.from 或迭代方法的舊瀏覽器中,您仍然可以使用Array.prototype.slice.call。 然後你可以像使用真正的數組一樣迭代它:

    var elements = Array.prototype.slice
        .call(document.getElementsByClassName("myElement"));
    
    for(var i = 0; i < elements.length; ++i){
      elements[i].style.size = "100px";
    }
    

    您也可以迭代NodeListHTMLCollection 本身,但請注意,在大多數情況下,這些集合是即時的(MDN文件DOM 規格),即它們隨著DOM 的變化而更新。 因此,如果您在循環時插入或刪除元素,請確保不會意外跳過某些元素建立無限循環。 MDN 文件應始終註明方法傳回即時集合還是靜態集合。

    例如,NodeList 提供了一些迭代方法,例如現代瀏覽器中的 forEach

    document.querySelectorAll(".myElement")
      .forEach((element) => element.style.size = "100px");
    

    也可以使用簡單的 for 迴圈:

    var elements = document.getElementsByClassName("myElement");
    
    for(var i = 0; i < elements.length; ++i){
      elements[i].style.size = "100px";
    }
    

    旁白:.childNodes< /a> 產生一個live NodeList.children產生一個live HTMLCollection,因此這兩個getter 也需要小心處理。


    有一些函式庫,例如jQuery,它們使 DOM 查詢變得更短,並在「一個元素」上建立一個抽象層和「元素的集合」:

    $(".myElement").css("size", "100px");
    

    回覆
    0
  • 取消回覆