<html>
<head>
<script>
remove_line(11);
// This should remove the line 11 from source code,
// eliminating the unordered list element.
</script>
</head>
<body>
<p>Some text</p>
<ul><li>Some list item</li></ul>
<a>Some link</a>
</body>
</html>
我完全意识到此代码会伤害您的眼睛。但是,由于非常不典型的技术原因(主要是性能),这将是解决我的问题的最有效方法。它很可能不可行,但它确实可以节省很多编码和性能问题。
如果不可行(如预期的那样),唯一识别/访问 DOM的每个元素(包括文本)的最一致/最有效的符号/技术是什么?与元素混合/内联)。
我正在考虑以下符号:tag_name [index]其中index将按源代码中的出现顺序表示第X个元素。但是,我不确定它是否完全有效,我不确定如何在Javascript中实现它。我也想过XPath,但我不确定Javascript是否支持它(除了一些框架“模拟”它)。
更新:我原来的帖子不是很清楚,所以我会澄清一些观点:
我正在研究的库的终极目标是“最小化页面呈现”,因此在服务器端执行并将其发送回用户不是一种选择。一旦我实现了我正在尝试的功能,我将发布更新。否则在这里解释太久了。
为了澄清我真正需要做的事情,让我给出以下(虚构)示例:
我真的很感兴趣如何唯一地识别DOM节点,以便脚本Y可以识别它并操纵它。最好,它也应该与文本节点一起使用。
答案 0 :(得分:2)
没有javascript对源代码没有此类访问权限。为什么不在服务器上执行此操作呢?
答案 1 :(得分:1)
按element_name
,您的意思是标记的名称,还是name属性的值?对于前者,您可以这样做:
var nodeToRemove = document.getElementsByTagName('span')[7];
如果你的意思是name属性的值,你可以使用像jQuery这样的库:
$('*[name=myName]:eq(7)');
或者如果使用普通的javascript,你必须手动(递归地)迭代DOM
答案 2 :(得分:0)
在某些有限的情况下这是可能的。一个聪明的解决方法是,如果页面是静态的,您可以为同一页面创建XmlHttpRequest
,然后responseText()
,这将为您提供确切的源表示。 (注意:这可能会产生特定于浏览器的结果。)
然而,DOM本身是一个对象图,并且不保留源代码结构的知识。给定一个DOM,可以产生无限多的原始资源。
答案 3 :(得分:0)
浏览器将代码解析为DOM树,您可以遍历一个say document.body.childNodes
的集合并查询.nodeType
(1表示元素,3表示文本节点),您可以查询nodeNames和集合X类型的所有元素。
ul
将是body
的第二个元素/子元素。 document.body.getElementsByTagName('*')[1]
会引用它,我不太确定你可以按行号来做,除非你解析document.documentElement.innerHTML
并按换行分解它,然后抓住第11行,但浏览器有可能重新格式化
然后,它将有助于告诉我们您正在尝试做什么,更具体地说。
编辑:如果您正在执行此服务器端,请使用DOM库并removeElement
。
答案 4 :(得分:0)
如果您访问document.body.innerHTML
,您可能会获得源代码,但在某些浏览器中可能会被“规范化”(例如,删除额外的换行符和空格)。
我相信你想要的是保持语义并为你知道可以在以后删除的元素分配ID。例如
<html>
<head>
<script>
var myItem = document.getElementById('list-1-item-1');
myItem.parentNode.removeChild(myItem);
// This should remove the line 12 from source code,
// eliminating the unordered list element.
</script>
</head>
<body>
<p>Some text</p>
<ul><li id="list-1-item-1">Some list item</li></ul>
<a>Some link</a>
</body>
</html>
或者,如果你在父母身上设置了一个ID,你也可以完全避免使用parentNode
。
我坚持这个的语义含义,因为您的代码可能总是在浏览器,代理等中重新格式化。