gpt4 book ai didi

javascript - Object.defineProperty 不改变元素的属性

转载 作者:行者123 更新时间:2023-12-01 14:00:55 26 4
gpt4 key购买 nike

我试图覆盖我应用程序中所有 iframe 的 src 属性,因此无论 HTML 的值是什么,它们的 src 属性总是设置为“redirect.html”标签为其定义。到目前为止,我提出了以下建议,但它似乎不适用于 DOM 元素:

<!doctype html>
<html>
<head>
<script>
var propertyDescriptorSrc = Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype, "src");
Object.defineProperty(HTMLIFrameElement.prototype, "src", {
get: function get_src() {
var val = propertyDescriptorSrc.get.call(this);
return "redirect.html";
},
set: function (val) {
alert('setting: ' + val);
propertyDescriptorSrc.set.call(this, val);
}
});
</script>
</head>
<body>
<iframe src="page.html"></iframe>
</body>
</html>

我希望正文中的 iframe 元素加载 redirect.html 而不是 page.html,因为我覆盖了它的“getter”,但它仍然加载了 page.html。有没有一种方法可以强制这种行为,即默认情况下所有 iframe 都转到 redirect.html 而不是它们的 src 属性中定义的任何内容?

(这只是一个实验项目)

最佳答案

在启动 javascript 之前,根据关键渲染路径,DOM 树已经被解析并包含所有 iframe 及其 src。唯一的方法是使用 javascript 重新定义单个 iframe 节点的 src 属性。例如,如下所示。

所有 iframe 都设置为 redirect.html:

<!doctype html>
<html>
<head>

</head>
<body>
<iframe src="page.html"></iframe>
<iframe src="page2.html"></iframe>
<script>
( function(){
var lng = document.getElementsByTagName('iframe').length;
for (var i=0; i<lng;i++){
document.getElementsByTagName('iframe')[i].src="redirect.html";
}
})();
</script>
</body>
</html>

根据建议,@Aaron Digulla 给出了一种更具可读性的函数形式。今天看来,DOM 树的搜索算法如此高效,争论的焦点是记录的可读性,而不是效率。

    (function(){
var frames = document.getElementsByTagName('iframe');
for (var i=0; i<frames.length;i++){
frames[i].src="redirect.html";
}
})();

关于javascript - Object.defineProperty 不改变元素的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55300750/

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