【问题标题】:Extra output outputted额外输出输出
【发布时间】:2020-05-31 11:51:39
【问题描述】:

在这段代码中,我希望输出为 a b c,但最后还有另一个 a 输出。那么,我该怎么做呢?

window.onload = function() {
  for (let i = 0; i < 3; i++) {
    var story = document.getElementsByClassName('story')[0];

    let clone = story.cloneNode(true);

    let usr = ["a", "b", "c"];


    document.getElementsByClassName('story')[i].innerHTML = usr[i];


    document.getElementById("story").appendChild(clone);
  }
}
<div id="story">
  <p class="story"></p>
</div>

【问题讨论】:

  • 克隆项目不会删除原始项目
  • 那么,我怎样才能得到需要的输出呢?我尝试删除代码末尾的真实元素。但它会产生另一个错误。在这种情况下,输出是 b c a 。

标签: javascript html


【解决方案1】:

这是正常的,因为你有三个克隆和原始,所以作为最后一步你应该删除原始

window.onload= function(){
    var main_story=document.getElementById("story");
    var story = document.getElementsByClassName('story')[0];
    let usr = ["a", "b", "c"];
    for (let i = 0; i < 3; i++) {   
      let clone = story.cloneNode(true);          
      clone.innerHTML = usr[i];
      main_story.appendChild(clone);
    }
    story.remove();
}
<div id="story">
    <p class="story"></p>
</div>

【讨论】:

  • 它输出 b c a 但我想要 a b c
  • 您可以先查看已编辑的答案。请刷新页面并查看@Kashyap Kumar
【解决方案2】:

const setup = () => {
	let storySource = document.querySelectorAll('.story')[0];
  let story = document.querySelector('#story');
  let userList = ["a", "b", "c"];
  
  for (let i = 0; i < 3; i++) {
		let clone = storySource.cloneNode(true);
    clone.textContent = userList[i];
    story.appendChild(clone);
  }
  storySource.remove();

};

//load
window.addEventListener('load', setup);
<div id="story">
  <p class="story"></p>
</div>

【讨论】:

  • 是的,只是对他的代码进行了现代化改造,并包含了他忘记的行。代码仍然可以改进。变量名称可能会更好,并且可以根据上下文更改循环。我没有改变循环,因为没有足够的上下文来改变它。
  • 这又取决于上下文。考虑一个可以引用多个元素的类。您不确定代码将来会发生什么,并且指示行为的代码将更容易修改和检测何时有人在更改后不工作,然后是秘密针对它找到的第一个元素而不是描述性的代码关于它。我只是想以防万一它需要调试。
  • 我认为您没有理解我试图指出的观点。作为一名程序员,重要的是你的代码对你自己和其他程序员来说尽可能具有描述性。使用document.querySelectorAll('.story')[0] 说明您无法控制 HTML 的外观,并且在规则范围内,可能存在多个符合描述的元素。当您使用 document.querySelector('.story') 时,您只会认为代码正在寻找该元素,但无法让您深入了解更复杂的 DOM。
  • 可以使用userList.forEach(user =&gt; { let clone = storySource.cloneNode(true); clone.textContent = user; story.appendChild(clone); }); 与使用for(index) 循环进行类似的论证。根据上下文,您可能更喜欢其中一个。
【解决方案3】:

您可以使用以下内容:

window.onload= function(){
    let usr = ["a", "b", "c"];

    for (let i = 0; i < 3; i++) {
      var story = document.createElement('p');
      story.classList.add('story');
      story.innerText= usr[i];
      document.getElementById("story").appendChild(story);
    }
  }

也更新为

<div id="story">
</div>

【讨论】:

  • 我不能这样做,因为我有一个很大的代码来代替 p 元素,这将是一个非常困难的代码,我知道方法。
  • @KashyapKumar 在这种情况下你为什么不喜欢我的回答?
【解决方案4】:

“DIV”节点内已经有一个“P”节点。然后,您创建另外三个。总之,你会得到四个“P”节点。

使用以下代码解决您的问题。

window.onload = function() {

        let usr = ["a", "b", "c"];    

          for (let i = 0; i < 3; i++) {


            let newP = document.createElement("p");
            newP.setAttribute("class", "story");
            newP.innerHTML = usr[i];

            document.getElementById("story").appendChild(newP);
          }
        }

【讨论】:

    【解决方案5】:

    克隆项目不会删除原始项目

    那么,我怎样才能得到所需的输出呢?我尝试删除代码末尾的真实元素。但它会产生另一个错误。在这种情况下,输出是 b c a 。

    如果你的元素很复杂,你也可以使用 DOM 解析器来创建你的新元素

    const DomParser   = new DOMParser()
      ,   usrTab      = ['a', 'b', 'c']
      ,   storyDiv    = document.getElementById('story')
      ;
    const newElement_X=(arg)=>
      {
      let elmX = `<p class="story">${arg}</p>`
      return DomParser.parseFromString( elmX, 'text/html').body.firstChild
      }
    window.onload=()=>
      {
      for (let usrVal of usrTab)
        {
        storyDiv.appendChild( newElement_X(usrVal) )
        }
      }
    &lt;div id="story"&gt;&lt;/div&gt;

    【讨论】:

      【解决方案6】:

      这是我的答案,我自己解决了。

      window.onload = function() {
        for (let i = 0; i < 3; i++) {
          //changing index to i
          var story = document.getElementsByClassName('story')[i];
      
          let clone = story.cloneNode(true);
      
          let usr = ["a", "b", "c"];
      
      
          document.getElementsByClassName('story')[i].innerHTML = usr[i];
      
      
          document.getElementById("story").appendChild(clone);
        }
          //removing last child
          document.getElementsByClassName('story')[3].remove();
      }
      <div id="story">
        <p class="story" style="background-color: red;"></p>
      </div>

      【讨论】:

        【解决方案7】:

        您的代码正在创建 3 个元素 + 1 个已经存在。我已更新代码以使用索引。

        window.onload = function() {
          const users = ["a", "b", "c"];
          
          users.forEach(function(user) {
            const el = document.createElement("p");
            el.innerHTML = user;
            el.className = 'story';
            
            document.getElementById("story").appendChild(el);
          });
        }
        &lt;div id="story"&gt;&lt;/div&gt;

        【讨论】:

        • 这不是正确的答案@Kashyap Kumar。检查元素这里也有 4 个元素,但最后一个是空的。你只是看不到空的,但这里也有 4 个元素。请仔细检查答案
        • 非常糟糕的代码,在每次循环时,您都会在“.story”第一次出现 + usr 数组 + 故事 ID 元素上的另一个指针上创建“指针”...
        • 最后还有四个&lt;p class="story"&gt;&lt;/p&gt;,最后一个是空的
        • PO 通过成为此处已经提供的解决方案的副本验证的原始代码完全不同
        • @pc_coder 是的,这不是正确的答案,但我有办法解决我的问题。在我的代码中,当我使用 remove() 删除第一个孩子时,它产生了一个错误。但是当我按照这个答案更新索引时,当我使用 remove() 时它起作用了。
        猜你喜欢
        • 2021-07-22
        • 2012-07-01
        • 1970-01-01
        • 2016-09-12
        • 2015-03-12
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 2014-03-21
        相关资源
        最近更新 更多