Javascript是否具有给定文档的原始源代码的内部知识?

时间:2010-01-15 10:02:56

标签: javascript html xpath

<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是否支持它(除了一些框架“模拟”它)。

更新:我原来的帖子不是很清楚,所以我会澄清一些观点:

  • 我正在研究的库的终极目标是“最小化页面呈现”,因此在服务器端执行并将其发送回用户不是一种选择。一旦我实现了我正在尝试的功能,我将发布更新。否则在这里解释太久了。

  • 为了澄清我真正需要做的事情,让我给出以下(虚构)示例:

    • 脚本X是一个服务器端脚本,可以从document.html中随机选择一个DOM节点。
    • 脚本X需要告诉脚本Y(位于document.html中的Javascript脚本)删除它所选择的DOM节点。
    • 脚本X如何唯一地标识它所选择的DOM节点,以便它可以将它传递给脚本Y?

我真的很感兴趣如何唯一地识别DOM节点,以便脚本Y可以识别它并操纵它。最好,它也应该与文本节点一起使用。

5 个答案:

答案 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

我坚持这个的语义含义,因为您的代码可能总是在浏览器,代理等中重新格式化。