document.location.href
和document.location
之间的区别是什么?
跨浏览器是否相同?
答案 0 :(得分:61)
document.location
是window.location
的同义词,只要JavaScript已存在,就已被弃用。不要使用它。
location
是一个结构化对象,其属性对应于URL的各个部分。 location.href
是单个字符串中的整个URL。将字符串分配给任一字符串定义为导致相同类型的导航,因此请选择。
我认为写入location.href = something
略微好一点,因为它对它正在做的事情略显明确。您通常希望避免使用location = something
因为它看起来像变量赋值一样误导。 window.location = something
虽然很好。
答案 1 :(得分:24)
document.location
是一个包含当前位置属性的对象。
href
属性是这些属性之一,包含完整的URL,即所有其他属性放在一起。
某些浏览器允许您为location
对象分配URL,并将其分配给href
属性。其他一些浏览器更挑剔,并要求您使用href
属性。因此,要使代码在所有浏览器中都有效,您必须使用href
属性。
window
和document
对象都有location
个对象。您可以使用window.location.href
或document.location.href
设置网址。但是,从逻辑上讲,document.location
对象应该是只读的(因为您无法更改文档的URL;更改URL会加载新文档),所以为了安全起见,您应该使用{{ 1}}当你想设置网址时。
答案 2 :(得分:11)
typeof document.location; // 'object'
typeof document.location.href; // 'string'
href
属性是一个字符串,而document.location
本身就是一个对象。
答案 3 :(得分:5)
document.location
是一个对象,而document.location.href
是一个字符串。但是前者有一个toString
方法,因此您可以从中读取它,就好像它是一个字符串并获得与document.location.href
相同的值。
在某些浏览器中 - 我认为大多数现代浏览器 - 您也可以分配给document.location
,就好像它是一个字符串一样。但是,根据Mozilla documentation,最好将window.location
用于此目的,因为document.location
最初是只读的,因此可能不会得到广泛支持。
答案 4 :(得分:3)
不推荐使用document.location而支持window.location,它只能通过location访问,因为它是一个全局对象。
location对象有多个属性和方法。如果您尝试将其用作字符串,那么它就像location.href一样。
答案 5 :(得分:3)
截至 2013年6月14日( HTML5 ),存在显着差异
Browser : Chrome 27.X.X
参考文献:document.location,window.location ( MDN )
type: Object
自身调用的对象document.location
会返回连接的origin
+ pathname
个属性。
要仅将URL检索为字符串,可以使用只读document.URL
属性。
ancestorOrigins: DOMStringList
assign: function () { [native code] }
hash: ""
host: "stackoverflow.com"
hostname: "stackoverflow.com"
href: "http://stackoverflow.com/questions/2652816/what-is-the-difference-between-document-location-href-and-document-location?rq=1"
origin: "http://stackoverflow.com"
pathname: "/questions/2652816/what-is-the-difference-between-document-location-href-and-document-location"
port: ""
protocol: "http:"
reload: function () { [native code] }
replace: function () { [native code] }
search: "?rq=1"
toString: function toString() { [native code] }
valueOf: function valueOf() { [native code] }
type: string
http://stackoverflow.com/questions/2652816/what-is-the-difference-between-document-location-href-and-document-location?rq=1
答案 6 :(得分:0)
这是差异的实际意义的一个例子,如果你没有意识到它会如何咬你(document.location是一个对象而document.location.href是一个字符串):
我们在http://mono-software.com使用MonoX Social CMS(http://social.ClipFlair.net)免费版本,我们想在某些页面添加语言栏WebPart以进行本地化,但在其他一些页面上(例如在讨论中)我们没有我不想使用本地化。所以我们在我们所有的.aspx(ASP.net)页面上都使用了两个母版页,第一个是我们的语言栏WebPart,另一个是以下脚本来删除/ lng / el-GR等。 URL并显示默认(在我们的例子中为英语)语言,而不是那些页面
<script>
var curAddr = document.location; //MISTAKE
var newAddr = curAddr.replace(new RegExp("/lng/[a-z]{2}-[A-Z]{2}", "gi"), "");
if (curAddr != newAddr)
document.location = newAddr;
</script>
但是这段代码不起作用,replace函数只返回Undefined(没有异常抛出),所以它试图导航到x / lng / el-GR / undefined而不是url x。使用Mozilla Firefox的调试器(F12键)将其检出并将光标移到curAddr变量上,它显示了大量信息,而不是URL的一些简单字符串值。从手表窗格中可以看到的弹出窗口中选择Watch,它为URL写了“Location - &gt; ...”而不是“...”。这让我意识到这是一个对象
有人会期望替换抛出异常或其他东西,但现在我想到它的问题是它试图在URL对象上调用一些不存在的“替换”方法,这似乎只是回馈“未定义“在Javascript中。
在这种情况下,正确的代码是:
<script>
var curAddr = document.location.href; //CORRECT
var newAddr = curAddr.replace(new RegExp("/lng/[a-z]{2}-[A-Z]{2}", "gi"), "");
if (curAddr != newAddr)
document.location = newAddr;
</script>