使用 JS DOM 将 html 标签替换为另一个标签
我对 javascript 和 DOM 相当陌生,并且在使用 javascript 操作以下 html 代码的 DOM 时遇到问题。
<html>
<head>
<title>Testing</title>
</head>
<body>
<marquee direction=up height=400 scrollAmount=3.7 scrollDelay=70 onmousedown="this.stop()" onmouseover="this.stop()" onmousemove="this.stop()" onmouseout="this.start()">
<a href="#"> <span>Lion</span></a><br><br>
<a href="#"> <span>Tiger</span></a><br><br>
<a href="#"> <span>Giraffe</span></a><br><br>
<a href="#"> <span>Dinosaur</span></a><br><br>
<a href="#"> <span>Cat</span></a><br><br>
<a href="#"> <span>Dog</span></a><br><br>
<a href="#"> <span>Llama</span></a><br><br>
<a href="#"> <span>Rat</span></a><br><br>
<a href="#"> <span>Rhino</span></a><br><br>
<a href="#"> <span>Reindeer</span></a><br><br>
<a href="#" ><span >buffalo</span></a><br><br>
<a href="#" ><span >Yak</span></a><br><br>
<a href="#" ><span >Deer</span></a><br><br>
<a href="#" ><span >moose</span></a><br><br>
<a href="#" ><span >Rabbit</span></a> <br><br>
<a href="#" ><span >Duck</span></a> <br><br>
<a href="#" ><span >Peacock</span></a><br><br>
<a href="#" ><span >Crow</span></a><br><br>
<a href="#" ><span >Raven</span></a><br><br>
<a href="#" ><span >Swan</span></a><br><br>
</marquee>
<input type="button" value="Set Me Fixed" onclick="setMeFixed();" />
</body>
</html>
抱歉,如果上面的 html 代码不好。我正在为此编写一个greasemonkey 脚本,该脚本是由我在此处简化的网站生成的。 所以我无法控制它。 我希望将 [marquee] 标签替换为 [div] 标签,以便它变为静态,并且我不必永远等待选取框中的第 100 个链接出现。 ;-)。 所以我写了下面的脚本。 (我是 js 编程的新手,是的,我知道我的脚本很糟糕:-))
function setMeFixed(){
var fixedElement=document.createElement('div');
var marqueeElement=document.getElementsByTagName('marquee')[0];
//var clonedMarqNodes=marqueeElement.cloneNode(true);
for(i=0;i<marqueeElement.childNodes.length;i++){
fixedElement.appendChild(marqueeElement.childNodes[i]);
}
marqueeElement.parentNode.replaceChild(fixedElement,marqueeElement);
}
发生了很多问题。 结果输出并没有显示很少的链接。
输出中看不到 Peacock、Crow、Swan、Raven,并且所有
标签在变为静态后都变得混乱,上面打印有空格,链接之间没有中断。
作为一名初学者 javascript 程序员,我被困在这里,任何正确方向的帮助将不胜感激。 有什么办法可以优雅地解决这个问题吗? 谢谢。
保罗·布拉德.
PS:我使用的是Fx 3.0.11。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
至于您生成的文档最终丢失了一些节点的原因,我可以告诉您原因:
当您
appendChild
到另一个节点时,DOM 会将其从原来的位置删除。 因此,当您遍历第一个节点时,它会在 DOM 中向下推进i
的同时删除子节点。 假设A
、B
、C
等是子节点,这就是循环开始时发生的情况:您可以修复这可以通过两种方式之一进行。 首先,您可以进行此更改:
以便您始终操作克隆的节点,并且原始
以便您始终获取
As for the reason that your resultant document ended up missing a few nodes, I can tell you why:
When you
appendChild
to another node, the DOM removes it from wherever it used to be. So when you go through the first node, it's removing children at the same time as it advancesi
down the DOM. Assume thatA
,B
,C
, etc. are child nodes, and this is what happens at the start of your loop:You can fix this in one of two ways. Firstly, you could make this change:
so you're always manipulating a cloned node, and the original
<marquee>
doesn't have elements removed, or you can make this change:so that you always take the first item in the
<marquee>
and don't lose elements that way.你考虑过使用innerHTML吗?
不是最有效的,但很直接。
请参阅:http://jquery.nodnod.net/cases/586
Have you considered using innerHTML?
Not the most efficient, but straight-forward.
See: http://jquery.nodnod.net/cases/586
如果您的目标是删除所有网站上的
我认为这实际上已经作为模板包含在该文件中,甚至:)
If your goal is to get rid of
<marquee>
s on all web sites, perhaps the best way to do so is to just edit youruserContent.css
file to include the following:(I think that's actually already included in that file as a template, even :)