按类和ID获取元素内部的元素-JavaScript

按类和ID获取元素内部的元素-JavaScript,javascript,getelementbyid,getelementsbyclassname,Javascript,Getelementbyid,Getelementsbyclassname,好的,我以前涉猎过JavaScript,但我写过的最有用的东西是CSS样式切换器。所以我对这有点陌生。假设我有如下HTML代码: <div id="foo"> <div class="bar"> Hello world! </div> </div> var list = document.getElementById("foo").getElementsByClassName

好的,我以前涉猎过JavaScript,但我写过的最有用的东西是CSS样式切换器。所以我对这有点陌生。假设我有如下HTML代码:

<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>
var list = document.getElementById("foo").getElementsByClassName("bar");
if (list && list.length > 0) {
    list[0].innerHTML = "Goodbye world!";
}
document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!";
Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!";

你好,世界!
我将如何改变
你好,世界到<代码>再见世界


我知道
document.getElementsByClassName
document.getElementById
是如何工作的,但我想说得更具体一些。抱歉,如果以前有人问过这个问题。

您可以这样做:

<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>
var list = document.getElementById("foo").getElementsByClassName("bar");
if (list && list.length > 0) {
    list[0].innerHTML = "Goodbye world!";
}
document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!";
Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!";
或者,如果您希望以更少的错误检查和更简洁的方式完成此操作,可以在一行中完成,如下所示:

<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>
var list = document.getElementById("foo").getElementsByClassName("bar");
if (list && list.length > 0) {
    list[0].innerHTML = "Goodbye world!";
}
document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!";
Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!";
解释如下:

  • 使用
    id=“foo”
    获得元素
  • 然后找到包含在该对象中的对象,这些对象具有
    class=“bar”
  • 它返回一个类似nodeList的数组,因此引用该nodeList中的第一项
  • 然后可以设置该项目的
    innerHTML
    ,以更改其内容

  • 注意事项:一些较旧的浏览器不支持
    getElementsByClassName
    (例如IE的较旧版本)。如果缺少该功能,可以将其填充到位


    这就是我建议使用内置CSS3选择器支持的库的地方,而不是自己担心浏览器兼容性(让其他人来完成所有工作)。如果你只需要一个图书馆就可以做到这一点,那么Sizzle将非常有用。在Sizzle中,可以这样做:

    <div id="foo">
        <div class="bar">
            Hello world!
        </div>
    </div>
    
    var list = document.getElementById("foo").getElementsByClassName("bar");
    if (list && list.length > 0) {
        list[0].innerHTML = "Goodbye world!";
    }
    
    document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!";
    
    Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!";
    

    jQuery内置了Sizzle库,在jQuery中,这将是:

    $("#foo .bar").html("Goodbye world!");
    

    首先,您需要使用类似于
    getElementById
    的函数来选择元素

    var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];
    

    getElementById
    仅返回一个节点,但
    getElementsByClassName
    返回节点列表。因为只有一个元素具有该类名(据我所知),所以您可以只获取第一个元素(这就是
    [0]
    的含义,因为它就像一个数组)

    然后,您可以使用
    .textContent
    更改html

    targetDiv.textContent = "Goodbye world!";
    
    var targetDiv=document.getElementById(“foo”).getElementsByClassName(“bar”)[0]; targetDiv.textContent=“再见,世界!”
    
    你好,世界!
    
    如果这需要在IE 7或更低版本中使用,您需要记住GetElementsByCassName并不存在于所有浏览器中。因此,您可以创建自己的GetElementsByCassName,也可以尝试这样做

    var fooDiv = document.getElementById("foo");
    
    for (var i = 0, childNode; i <= fooDiv.childNodes.length; i ++) {
        childNode = fooDiv.childNodes[i];
        if (/bar/.test(childNode.className)) {
            childNode.innerHTML = "Goodbye world!";
        }
    }
    
    var fooDiv=document.getElementById(“foo”);
    
    对于(var i=0,childNode;i您不应该使用document.getElementByID,因为它只适用于客户端控制哪些ID是固定的。您应该像下面的示例一样使用jquery

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>                                                                                                             
    <div id="foo">
       <div class="bar"> 
              Hello world!
         </div>
    </div>
    
    如果要删除或编辑任何操作,只需在后面添加“.”并执行操作

    递归函数:

    function getElementInsideElement(baseElement, wantedElementID) {
        var elementToReturn;
        for (var i = 0; i < baseElement.childNodes.length; i++) {
            elementToReturn = baseElement.childNodes[i];
            if (elementToReturn.id == wantedElementID) {
                return elementToReturn;
            } else {
                return getElementInsideElement(elementToReturn, wantedElementID);
            }
        }
    }
    
    函数getElementInsideElement(baseElement,wantedElementID){ var elementToReturn; 对于(var i=0;i
    最简单的方法是:

    function findChild(idOfElement, idOfChild){
      let element = document.getElementById(idOfElement);
      return element.querySelector('[id=' + idOfChild + ']');
    }
    
    或可读性更好:

    findChild = (idOfElement, idOfChild) => {
        let element = document.getElementById(idOfElement);
        return element.querySelector(`[id=${idOfChild}]`);
    }
    

    getElementsByClassName
    在IE8中也不起作用,但您可以使用
    querySelectorAll
    代替它(基本上是这样)@ӪӪ.ӪӪ.ӪӪ..ӪӪ…lol…您的回答正确,但您只需进一步证明我的答案。如果您的页面需要跨多个浏览器运行,您不能依赖getElementsByClassName。jQuery肯定是一个选项,但上面的代码会如此。是的,我的意思是支持您的答案的注释,但同时也指出可以使用
    qSA
    在一个垫片中,这样您仍然可以在IE8中使用本机代码。虽然仔细查看您的解决方案,但仍有一些问题需要解决。@ӪӪ。ӪӪ…好奇您看到了什么…因为我没有看到它。
    var I=0,var child=fooDiv.childNodes[I]
    无效。
    谢谢,我在使用文档时遇到了问题。getElementBy*.jQuery使事情变得简单多了。在这种情况下,不需要按ID获取父项。
    document.getElementsByClassName
    可以很好地工作。@rvighne OP的确切要求是“希望得到更具体的信息”。提出问题的人问他如何在DOM树遍历中更具体。getElementByClassName的使用并不是一个混淆点,但我可以看出,有人可能很容易认为我指出这两个都是必要的。它们不是。如果您只想针对特定节点下的某个类的元素与不同节点下的同一类元素相对应的给定ID,这就是您要使用的。编辑此答案并将
    .innerHtml
    更改为
    .textContent
    ,可能会更好,以利于复制/粘贴编码器的安全性。使用热核武器杀死鹿会起作用,但有点过头。使用多kb当Javascript在其基本代码中提供该功能时,选择一个元素的jQuery库稍微有些过火。上面的示例中有一个小错误。您必须先检查是否找到了某个元素,而不是立即返回else路径。否则其他子节点将不会循环通过。类似于这样的内容:if(elementToReturn){return elementToReturn;}