覆盖document.location.href是否可以在javascript中使用?

时间:2010-01-11 15:37:32

标签: javascript

是否有可能以某种方式覆盖document.location.href?

需要覆盖getter,例如:alert(document.location.href);应该返回让我们说“www.example.com”,而真实文档位置是www.stackoverflow.com ...

不知道是否可能......

5 个答案:

答案 0 :(得分:2)

不,但......

在Ecmascript 5中,支持getter / setter,如果从重新定义它的范围内访问,你可以欺骗document引用。

证明:

(function (document) {
    alert(document);        // -> "spoofed document" 
})("spoofed document");

结合accessors,您可以替换文档对象。 (访问者需要Javascript 1.5。)

答案 1 :(得分:0)

没有。出于安全原因,这是不可能的。

答案 2 :(得分:0)

正如其他人已经注意到,如果不重新加载页面就无法更改URL。

请注意,您可以使用document.location.hash更改片段标识符,即散列(#)后URL中的部分,但这对您来说可能不够好。

答案 3 :(得分:0)

将“document”换成另一个变量,编辑它,然后重新交换。

var d = {}
for (var k in document) {
    d[k] = document[k];
}
d["location"]="out of this world";
document = d;

答案 4 :(得分:0)

你可以通过使用独立的脚本标签在IE7或IE8中覆盖它(但不能在现代的Firefox或IE9 +中):

<!DOCTYPE html>
<html><head>
<title>Some title</title>
</head>
<body>
<script>
var _oldDoc = document; // IE < 9 won't work with the code below unless we place it here in its own script tag
</script>
<script>
var document = {};
for (var k in _oldDoc) {
    if (navigator.appName == 'Microsoft Internet Explorer' || 
        !k.match(/^(location|domain|body)$/) // Cause problems or errors in Mozilla, but Mozilla isn't really creating a new document object anyways
    ) {
        document[k] = _oldDoc[k];
    }
}

// Causes problems in Mozilla as we can't get Mozilla to actually overwrite the object
document["location"] = {
    href: "out of this world",
    toString: function () {
        return this.href;
    }
};
alert(document.location.href); // "out of this world" in IE < 9
alert(document.location); // "out of this world" in IE < 9
alert(document.title); // 'Some title'
</script>
<script>
alert(document.location.href); // also "out of this world" in IE < 9
alert(document.location); // also gives "out of this world" in IE < 9
alert(document.title); // also 'Some title'
</script>

</body>
</html>