【问题标题】:Javascript replace parent html (remove child)Javascript替换父html(删除子)
【发布时间】:2017-02-05 09:13:49
【问题描述】:

我想循环我页面上的每个 iframes 标签,并将它们全部替换为新的 div,并在途中删除父内容,这样新的 div 将是唯一的孩子:

<div id="parent">
   <p>this is parent content</p>
   <iframe src="http://www.example.com" id="iframe10"></iframe>
</div>

结果应该是:

<div id="parent">
   <div id="newdiv">this is new div</div>
</div>

这是我在页面上循环所有 iframe 的代码,我不明白如何访问每个 iframe 父级并删除其内容的问题:

        var i, frames;
        frames = document.getElementsByTagName("iframe");
        for (i = 0; i < frames.length; ++i)
        {           
            frame_id = frames[i].id;
        }

谢谢 谢

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你可以这样写:

    function remove_frames() {
      var i = 0;
      var frames = document.getElementsByTagName("iframe");
      while (frames.length > 0) {
        var f = frames[0];
        var p = f.parentElement;
        if (p) {
          while (p.children.length > 0) {
            p.children[0].remove();
          }
          p.innerHTML = "<div id=\"newdiv" + i + "\">this is new div" + i + "</div>";
          i++; //increase id index
          //p.appendChild(
        }
      }
    }
      <p><input type="button" value="Execute" onclick="remove_frames()" /></p>
    
      <div id="parent">
        <p>this is parent content</p>
        <iframe src="http://www.example.com" id="iframe10"></iframe>
      </div>
    
      <p style="color:#6595ee">This element does not contain any sibling IFrame and must be exist in final result!</p>
    
      <div id="parent2">
        <p>this is parent2 content...</p>
        <div>another element</div>
        <iframe src="http://www.example.com" id="iframe20"></iframe>
        <p>another element after iframe.</p>
      </div>

    【讨论】:

    • 我认为他想删除父级中的所有元素,而不仅仅是 iframe。检查他在问题中的例子!
    • @ibrahimmahrir 代码更新和检查,我认为它按要求工作
    【解决方案2】:
    var i, frames;
    frames = document.getElementsByTagName("iframe");
    for (i = frames.length; i; --i) // the array-like object shrinks every time a frame is removed so we have to loop backwards
    {           
        //frame_id = frames[i].id;
        // get the parent element
        var parent = frames[i].parentElement;
        // empty it (remove all it's elements)
        while(parent.firstChild)
            parent.removeChild(parent.firstChild);
    
        // add the new div
        var div = /* create new div */;
        parent.appendChild(div);
    }
    

    【讨论】:

    • @S.Serp 为什么?有什么问题?
    • for-loop 中的 frames[i] 将跳过一些项目,因为当您从中删除一些项目时,frames.length 会发生变化...检查我的答案并使用它的 [Copy sn-p to回答]按钮在那里玩它..
    • @S.Serp 已修复,谢谢!有趣的是,今天早上我刚刚与@TheRealMrCrowley 就类似的话题(在循环中使用.pop)进行了对话。 here 是对话。确实很难注意到这样的事情!
    【解决方案3】:

    您可以使用parentElement

    var iframes = document.getElementsByTagName("iframe");
    iframes[0].parentElement.innerHTML = `<div id="newdiv">this is new div</div>`;
    <div id="parent">
       <p>this is parent content</p>
       <iframe src="http://www.example.com" id="iframe10"></iframe>
    </div>

    【讨论】:

    • 你应该使用 this ' 而不是 this `(如果你能看出区别的话)!
    • @ibrahimmahrir 我看到了不同之处。只是我习惯了es6语法和模板字符串。
    【解决方案4】:

    您可以使用Node.parentNode 获取父级,使用Node.removeChildElement.innerHTML 删除内容。

    var i, frames;
      frames = document.getElementsByTagName("iframe");
      for (i = frames.length-1; i >=0; i--) {
        var frame = frames[i];
        if (frame.parentNode) {
          var parent = frame.parentNode;
          while (parent.firstChild) {
            parent.removeChild(parent.firstChild);
          }
        }
    
      }
    <div id="parent">
       <p>this is parent content</p>
       <iframe src="http://www.example.com" id="iframe10"></iframe>
    </div>

    【讨论】:

    • 这段代码也不能像我说的那样工作,for-loop 中的frames[i] 会跳过一些项目,因为当你从中删除一些项目时,frame.length 会发生变化!检查我的答案
    • @S.Serp 其实我认为你错了!我们没有直接从数组中删除,所以它的长度根本不会改变。
    • @ibrahimmahrir 如果您调试 js 代码,您会看到当我们为 iframe 的父级调用 removeChild 时,我们实际上将它们从框架数组中删除! (第一次循环后检查 frames.length 和 frames[0])
    • @S.Serp 不会将它们从数组中删除,而是将它们从内存中删除。该数组仍将引用内存中的该空间(这表明什么都没有),但该数组永远不会改变。如果数组是 [iframe1, iframe2, iframe3],那么在删除第一个 iframe 后,它将变为 [undefined, iframe2, iframe3] 而不是您建议的 [iframe2, iframe3]。该数组的长度始终为 3。您可以在每次迭代时记录它以验证我刚才所说的!
    • @ibrahimmahrir 不,正如我所说,当我们从中删除项目时,frames.length 会减少!这是因为它的类型为 HTMLCollection 并且 DOM 集合通常是实时的,即对 DOM 的任何更改都会反映在集合中!
    猜你喜欢
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2019-11-25
    • 2011-04-03
    • 2015-12-10
    • 1970-01-01
    • 2020-05-22
    • 2012-09-25
    相关资源
    最近更新 更多