gpt4 book ai didi

javascript - 获取位于 和 之间的 HTML 注释内容的最可靠方法是什么?

转载 作者:行者123 更新时间:2023-11-30 16:26:12 25 4
gpt4 key购买 nike

我正在尝试获取页面上最后一个 HTML 评论的内容——它包含一些由 Web 应用程序服务器编写的 session 信息。它写在 </html> 之前标签。在阅读了这个问题 ( Selecting HTML Comments with jQuery ) 之后,我们想出了一些可行但不一致的方法:

var commentString = $("*").contents().filter(function(){
return this.nodeType == 8 ? this.nodeValue.indexOf("Expected Comment Text") > -1: false;
})[0].nodeValue;

问题是,如果页面包含 iframe(来自不同的域),* 选择器将命中它,然后我们就会被跨源策略阻止。我们可以将此选择器更改为 $("body")它似乎适用于大多数浏览器,但这似乎依赖于浏览器将评论移动到 body 节点内,我不相信情况会普遍如此。

如有必要,我们可以使用 jQuery 1.7.2(但没有插件),良好的浏览器支持 (IE < 9) 很重要。

在没有 jQuery 的情况下“反向”遍历 DOM 直到我们遇到 nodeType === 8 是否最好? ?这样,浏览器是否将评论节点作为 <html> 的子节点就没有关系了。或 <body>只要它是文档节点树中的最后一条评论。这会是什么样子? (我的 DOM-traversal-fu 不好。)

最佳答案

如果您采用您正在尝试的那种解决方案,将会有相当多的开销。

只需通过制作一个简单的、可重用的函数来遍历 DOM。

function walk(node, cb) {
cb(node);

if (node.childNodes) {
for (var i = 0; i < node.childNodes.length; i++) {
walk(node.childNodes[i], cb);
}
}
}

// And use it like this:

walk(document, function(node) {
if (node.nodeType === 8) {
// do something with comment
alert(node.data);
}
});
<div>
foo
<iframe src="http://www.linuxmint.com"></iframe>
<!-- some comment -->
</div>

这种方式更加高效和灵活。


这是 walk 函数的另一种变体,它不使用计数器循环。

function walk(node, cb) {
cb(node);

if (node = node.firstChild) {
do walk(node, cb);
while (node = node.nextSibling)
}
}

这样更短更简洁。


如果您希望返回单个节点,那么您可以让回调和递归调用返回一个值,然后在实际返回值时立即返回。

根据您的评论,此版本通过 DOM 向后遍历。

function walk(node, cb) {
var res = cb(node);
if (res)
return res;

if (node = node.lastChild) {
do if (res = walk(node, cb))
return res;
while (node = node.previousSibling)
}
}

var result = walk(document, function(node) {
if (node.nodeType === 8) {
return node;
}
});

if (result)
alert(result.data);
<div>
foo
<!-- Some other comment -->
<iframe src="http://www.linuxmint.com"></iframe>
<!-- Success! - Expected Comment Text -->
</div>

关于javascript - 获取位于 </body> 和 </html> 之间的 HTML 注释内容的最可靠方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34109501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com