Javascript Object.defineProperty不更改元素的属性

Javascript Object.defineProperty不更改元素的属性,javascript,Javascript,我试图覆盖应用程序中所有iFrame的src属性,以便无论html标记为其定义了什么值,它们的src属性始终设置为“redirect.html”。 到目前为止,我已经提出了以下内容,但它似乎不适用于DOM元素: <!doctype html> <html> <head> <script> var propertyDescriptorSrc = Object.getOwnPropertyDescriptor(HTMLIFram

我试图覆盖应用程序中所有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>

var propertyDescriptorSrc=Object.getOwnPropertyDescriptor(htmliframelement.prototype,“src”);
Object.defineProperty(htmliframelement.prototype,“src”{
get:函数get_src(){
var val=propertyDescriptorSrc.get.call(this);
返回“redirect.html”;
},
设置:功能(val){
警报('设置:'+val);
propertyDescriptorSrc.set.call(this,val);
}
});
我希望主体中的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>

(功能(){
var lng=document.getElementsByTagName('iframe').length;

for(var i=0;i
HtmlFrameElement.prototype
在计算iframe时不被浏览器使用。它只是从JavaScript到实际数据的DOM接口。添加(或覆盖)getter不会影响内部浏览器数据。那么它在使用什么?可以用这种方式修改吗?我认为它会“有点”如果在重写iframe的属性(例如
document.createElement('iframe')后以编程方式创建iframe,则可以工作
。我认为它在已经是DOM一部分的iframe上不起作用。请在浏览器控制台中运行代码,然后创建一个iframe。您可以通过编程方式设置
src
来测试它。@Amy有没有办法将其应用于DOM元素?或者可能先定义iframe的属性,以便在解析DOM时使用新属性除了使用JS查找、复制和替换DOM元素之外,我不这么认为。但是如果要这样做,只需找到这些元素并替换它们的
src
属性就更容易了,正如您唯一的答案所示。
document.getElementsByTagName
是一项花费ve调用。您应该将其分配给一个本地数组,然后在该数组上迭代,而不是多次调用。@Aarin Digulla这只是一个简单的示例。您完全正确。请记住,很多人只会复制并粘贴您的示例。@Aarin Digulla您是对的。但是,在分析两个版本后,似乎存在ted解决方案比在FF浏览器中为10000次迭代分配一个数组的解决方案快49毫秒。这在统计误差范围内。您可以检查配置文件,因为可能我在某个地方出错。我没想到会有这些结果。DOM有多大?
    (function(){
    var frames = document.getElementsByTagName('iframe');
    for (var i=0; i<frames.length;i++){
        frames[i].src="redirect.html";
    }
    })();