Object.defineProperty不更改元素的属性

时间:2019-03-22 13:31:58

标签: javascript

我试图覆盖应用程序中所有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属性中定义的内容?

(这只是一个实验项目)

1 个答案:

答案 0 :(得分:-1)

根据关键渲染路径,在开始使用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";
    }
    })();