是否有可能以某种方式覆盖document.location.href?
需要覆盖getter,例如:alert(document.location.href);应该返回让我们说“www.example.com”,而真实文档位置是www.stackoverflow.com ...
不知道是否可能......
答案 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>