【问题标题】:Javascript "getElementsByClassName" not workingJavascript“getElementsByClassName”不起作用
【发布时间】:2014-02-12 04:34:11
【问题描述】:

我有一个带有树图片的网站,然后我使用 Ajax 删除了该树并使用 javascript 插入了一个数字。我用的是;

document.getElementById("cut_oak_tree");

我现在在页面上添加了另一棵树,它应该具有与第一棵树完全相同的功能,除了只有您单击的树将被删除。为避免重复代码,我尝试添加以下内容:

document.getElementsByClassName("cut_oak_tree");

然后将我的 div 从使用 id 更改为 class。但是,当我现在单击任何树时,什么都没有发生。我现在的 ajax 代码如下所示:

function loadXMLDoc()
        {
        var xmlhttp;
        if (window.XMLHttpRequest)
          {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
          }
        else
          {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
        xmlhttp.onreadystatechange=function()
          {
          if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
            var getClass = document.getElementsByClassName("cut_oak_tree").innerHTML=xmlhttp.responseText;//ask for this.
            for(i=0;i<getClass.length;i++)
            {
                getClass[i].innerHTML = "";
            }
            }
          }
        xmlhttp.open("POST","xxx",true);
        xmlhttp.send();
        }

我搜索了很多,发现我可能需要使用 for 循环和 document.getElementsByClassName("cut_oak_tree"); 但我真的无法让它发挥作用。如果我正确地解决了我的问题,那么如果我可以确定在按下 div 时应该删除 div 中的哪些树图像,那么一切都应该很好。提前致谢。

编辑: html示例:

<div id "thanks">
        <img class="cut_oak_tree" src="http://www.pbpixels.com/x/images/oak.png" onclick="loadXMLDoc(), myFunction()">
        <img class="cut_oak_tree" src="http://www.pbpixels.com/x/images/oak.png" onclick="loadXMLDoc(), myFunction()">
    </div>

【问题讨论】:

  • 你能提供一些示例 HTML 吗?
  • 与 getElementById 形成鲜明对比,它只返回一个 SINGLE 元素,因此它本身不需要索引,getElementsByClassName 获取 MULTIPLE 元素(由 Element 后面的“s”表示。因此,它需要一个 [i ] 索引在其后面。例如:getElementsByClassName("my_class")[0]
  • @StefanGruenwald 我已经尝试添加您刚才所说的内容,问题是两棵树现在都消失了,而不仅仅是您单击的那棵树。谢谢。

标签: javascript html ajax


【解决方案1】:

尝试以下方法:

document.getElementsByClassName("cut_oak_tree")[0]; 

如果您想对多个类名为 cut_oak_tree 的元素应用更改,则必须使用 for 循环

var getClass = document.getElementsByClassName("cut_oak_tree");
for(i=0;i<getClass.length;i++)
{
    getClass[i].innerHTML = "";
}

使用您早期的 HTML 并稍作修改,您可以执行以下操作:

HTML

<div class="cut_oak_tree">
    <img src="http://www.pbpixels.com/x/images/oak.png" onclick="loadXMLDoc(this.outerHTML), myFunction()" />
    <img src="http://www.pbpixels.com/x/images/oak.png" onclick="loadXMLDoc(this.outerHTML), myFunction()" />
</div>

因此将您的 JS 函数更改为:

function loadXMLDoc(h)
    {
    var xmlhttp;
    if (window.XMLHttpRequest)
      {// code for IE7+, Firefox, Chrome, Opera, Safari
      xmlhttp=new XMLHttpRequest();
      }
    else
      {// code for IE6, IE5
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
    xmlhttp.onreadystatechange=function()
      {
      if (xmlhttp.readyState==4 && xmlhttp.status==200)
        {
        var getEle = document.getElementsByClassName('cut_oak_tree')[0];
        getEle.innerHTML = getEle.innerHTML.replace(h,xmlhttp.responseText);
        }
      }
    xmlhttp.open("POST","http://www.pbpixels.com/x/post.php",true);
    xmlhttp.send();
    }

Demo Fiddle


对评论的回应:

为了用相同的图像唯一地识别点击的&lt;img&gt;s,只需对两者中的一个 img srcs 进行微小的更改。示例在 src src="http://www.pbpixels.com/x/ 中给出空间images/oak.png "。注意 .png 后面的空格,这将导致两者之间的差异

【讨论】:

  • 这几乎奏效了,除了当只有一棵树被点击时两棵树都消失了。除此之外,它还有效。谢谢
  • @Zword 出于好奇,“this”指针在 JavaScript onclick 处理程序中是否有效?
  • 嗯,这仍然使我的两棵树都消失了,即使只点击了其中一棵。我将在 2 分钟内更新我的代码
  • @Zword 我已经更新了我上面帖子中的代码,但是当我只点击其中一棵树时,我的两棵树都消失了
  • @Zword 非常感谢您所做的一切。它现在可以按照我的意愿完美运行:)
【解决方案2】:

我认为最直接的方法是将点击的元素作为参数传递给loadXMLDoc(),然后获取该元素的父元素。像这样的:

HTML

<div id="cut_oak_tree">
    <img src="http://www.pbpixels.com/x/images/oak.png" onclick="loadXMLDoc(this), myFunction()">
    <img src="http://www.pbpixels.com/x/images/oak.png" onclick="loadXMLDoc(this), myFunction()">
</div>

JS

function loadXMLDoc(clickedElement) {
    var xmlhttp;

    if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp=new XMLHttpRequest();
    }
    else { // code for IE6, IE5
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState==4 && xmlhttp.status==200) {
            clickedElement.parentNode.innerHTML = xmlhttpinnerHTML = xmlhttp.responseText; //ask for this.
        }
    }

    xmlhttp.open("POST","xxx",true); //the xxx's represent my website
    xmlhttp.send();
}

注意: 我不能 100% 确定我的逻辑是正确的,因为您更改了原始帖子,而我正在输入我的答案。 :)

更新#2:我在编辑历史中找到了原始代码。 . .我的代码现在应该是正确的。

【讨论】:

  • 很抱歉我在您使用它时更改了帖子,我并没有真正考虑到这一点。感谢您的回答,我会看看它,非常感谢:)!
  • 不用担心。 . .希望你得到你的答案。如果您有任何问题,请告诉我。
  • 好吧,我还有一个小问题要考虑。如果我想将树图像更改为另一个图像,而不是让它消失。那么您是否知道如何以及在何处实施它? :)
  • 看了一下,好像我的HTML现在也可能错了。 . .它也应该基于您的原始帖子,但看起来我更新了修改后的 HTML。哈哈
  • 至于您的第二个问题,我建议您在网站上提出第二个问题。 . .否则,这些问题开始变得冗长并且脱离原始主题。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多