【问题标题】:Javascript: Setting location.href versus locationJavascript:设置 location.href 与位置
【发布时间】:2011-01-23 21:55:53
【问题描述】:

您何时将location 设置为URL 字符串而不是设置location.href

location = "http://www.stackoverflow.com";

location.href = "http://www.stackoverflow.com";

Mozilla Developer Network Reference

【问题讨论】:

标签: javascript


【解决方案1】:

您可以直接设置location,因为它稍微短一些。如果您想简洁,通常也可以省略 window.

location.hreflocation 的 URL 分配被定义为在 JavaScript 1.0 中工作,在 Netscape 2 中,并且已经在此后的每个浏览器中实现。因此,请选择并使用您认为最清晰的。

【讨论】:

  • 就像@SwissMister 在下面的答案中提到的那样,似乎 window.location.href 在某种程度上被视为 XHR 请求。如果从 XHR 的成功回调中触发,window.location.href 将被视为 XHR,而 window.location 会模拟单击链接。
【解决方案2】:

即使两者都有效,我也会使用后者。 location 是一个对象,将字符串分配给一个对象对于可读性或维护来说并不是一个好兆头。

【讨论】:

  • 在实现复杂的 PayPal 集成时,我遇到了一个非常有说服力的理由来使用 window.location:it does not require SAME ORIGIN
  • 也许只有我一个人,但location = 'http://www.example.com' 似乎超级易读。虽然,作为特例。这是向后兼容的,在可预见的将来will remain compatible
  • 如果 window.location 是一个对象,给它分配一个字符串会用一个字符串覆盖它。实际上 window.location 是一个具有 getter 和 setter 方法的属性。设置它时,需要一个字符串,并且设置器会更新全局 Location 对象。获取时,返回全局 Location 对象。
【解决方案3】:

正如已经说过的,location 是一个对象但是那个人建议使用任何一个。 但是,你最好使用.href 版本。

对象具有默认属性,如果未指定其他属性,则假定它们。对于location 对象,它有一个名为.href 的属性。并且通过在分配期间不指定任何属性,默认情况下它将假定为“href”。

这一切都很好,直到后来的对象模型版本发生变化并且不再有默认属性,或者默认属性被更改。然后你的程序意外中断。

如果你的意思是href,你应该指定href

【讨论】:

  • 很好的解释,在可读性或维护方面比一般的 cmets 更好。实际上,在这种特殊情况下,对象模型不会改变,因为一半的网络会停止 - 因此使用任何一个......哪个都没关系
  • 这听起来不错,但不是真的。一般来说,DOM 或 JavaScript 中没有默认属性的概念。将字符串分配给location 是可行的,因为该属性被定义为在 JavaScript 1.0 中具有这种特殊的分配行为,并且此后的每个浏览器都实现了这一点。 HTML5 现在需要它。因此,虽然分配给 .href 可能更漂亮或更一致,但这样做并没有向后或向前的兼容性优势。
  • window.location = url 更漂亮
  • location = url 更可爱
  • "location.href = url 在技术上更正确" 不,不是。大多数情况下,它更像 像 Javascript 的其余部分。但事实上Location 是一个定义明确的对象,围绕它的规范很清晰,并且在所有方面都一致地实施。所以location = url 同样正确。但更短。因此,恕我直言,在我们不断寻求尽可能多地减少页面开销的过程中,应该首选。
【解决方案4】:

几年前,location 在 IE 中对我不起作用,而 location.href 对我起作用(并且都在其他浏览器中起作用)。从那以后,我一直只使用location.href,再也没有遇到过麻烦。我不记得那是哪个版本的 IE。

【讨论】:

  • 可能是 IE 的一个版本做错了,而其他所有浏览器都做对了。 ;-)
  • in strict mode chrome 如果你也尝试直接分配给location 也会抛出异常,所以我总是使用location.href
  • “一个”版本的 IE?
  • @Shawn D. 浏览器做事正确吗?什么时候发生的! :D
  • @Lpc_dark 每个*
【解决方案5】:

但要记住一个区别。

假设您想使用当前 URL 构建一些 URL。下面的代码实际上会重定向你,因为它不是调用String.replace,而是Location.replace

nextUrl = window.location.replace('/step1', '/step2');

以下代码有效:

// cast to string
nextUrl = (window.location+'').replace('/step1', '/step2');

// href property
nextUrl = window.location.href.replace('/step1', '/step2');

【讨论】:

    【解决方案6】:

    澄清一下,你不能做location.split('#')location 是一个对象,而不是一个字符串。但是你可以使用location.href.split('#');,因为location.href 是一个字符串。

    【讨论】:

    • 您的评论是正确的,但您说的是获取位置对象的 href 属性,一个字符串。所有其他讨论都在处理 assigning 一个值,而不是读取该值。但你的观点是正确的。区别在于 href 是一个字符串,而 location 是一个对象。
    【解决方案7】:

    使用 TypeScript 使用 window.location.href,因为 window.location 在技术上是一个包含以下内容的对象:

    Properties
    hash 
    host 
    hostname
    href    <--- you need this
    pathname (relative to the host)
    port 
    protocol 
    search 
    

    设置window.location 会产生类型错误,而 window.location.href 是字符串类型。

    Source

    【讨论】:

      【解决方案8】:

      改用global.location.href,同时使用React

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-21
        • 1970-01-01
        • 2012-02-08
        相关资源
        最近更新 更多