【问题标题】:What is the difference between document.location.href and document.location?document.location.href 和 document.location 有什么区别?
【发布时间】:2010-04-16 12:19:21
【问题描述】:

document.location.hrefdocument.location 有什么区别?

跨浏览器是否一样?

【问题讨论】:

  • document.location 是一个对象
  • 一切都是对象。我想你的意思是,不像location.href,它不是一个简单的字符串。
  • @Max Shawabkeh 是 location.href 是一个字符串

标签: javascript


【解决方案1】:

document.locationwindow.location 的同义词,几乎只要 JavaScript 存在,它就已被弃用。不要使用它。

location 是一个结构化对象,其属性对应于 URL 的各个部分。 location.href 是单个字符串中的整个 URL。将字符串分配给任何一个都被定义为导致相同类型的导航,因此请自行选择。

我认为写信给location.href = something 会稍微好一点,因为它更明确地说明了它在做什么。您通常希望避免只使用location = something,因为它看起来像变量赋值一样具有误导性。 window.location = something 不过很好。

【讨论】:

  • 不推荐使用document.locationwindow.location 吗?
  • document.location。现在它在 HTML5 中不再被弃用,不管它的价值。
  • 它们被定义为所有工作相同,是的。 locationwindow.location 的引用相同,只要您没有使用该名称定义局部变量;目前尚不清楚规范是否要求document.location===window.location,但在当前浏览器中确实如此。
  • 还有谁在这里,因为 typescript 2.0 使 document.location 成为只读属性,并且您的代码不再编译;-) [答案当然是 document.location.href]
  • 这个线程很古老,但我想指出它们的含义不同,部分原因是window 对象可以包含多个文档。在浏览器中呈现的网页中,window.location 的值通常会匹配(可能是只读的)document,location.href 属性,但前者——window.location——应该被认为是可变的并且适合触发导航。
【解决方案2】:

document.location 是一个包含当前位置属性的对象。

href 属性是这些属性之一,包含完整的 URL,即所有其他属性放在一起。

某些浏览器允许您将 URL 分配给 location 对象,并且就像您将其分配给 href 属性一样。其他一些浏览器更挑剔,并要求您使用href 属性。因此,要使代码在所有浏览器中运行,您必须使用href 属性。

windowdocument 对象都有一个 location 对象。您可以使用window.location.hrefdocument.location.href 设置URL。但是,从逻辑上讲,document.location 对象应该是只读的(因为您无法更改文档的 URL;更改 URL 会加载新文档),因此为了安全起见,您应该在以下情况下使用 window.location.href你想设置网址。

【讨论】:

    【解决方案3】:
    typeof document.location; // 'object'
    typeof document.location.href; // 'string'
    

    href 属性是一个字符串,而document.location 本身是一个对象。

    【讨论】:

    • 单点符号就说明了这一点
    【解决方案4】:

    document.location 是一个对象,而document.location.href 是一个字符串。但前者有一个toString 方法,所以你可以像读取字符串一样读取它,并获得与document.location.href 相同的值。

    在某些浏览器中——我认为是最现代的浏览器——你也可以分配给document.location,就好像它是一个字符串一样。但是,根据Mozilla documentation,最好使用window.location 来实现此目的,因为document.location 最初是只读的,因此可能不会得到广泛支持。

    【讨论】:

      【解决方案5】:

      document.location 已被弃用,取而代之的是 window.location,因为它是一个全局对象,所以只能通过 location 访问它。

      位置对象有多个属性和方法。如果您尝试将其用作字符串,则其行为类似于 location.href。

      【讨论】:

        【解决方案6】:

        截至 2013 年 6 月 14 日 (HTML5),存在显着差异

        Browser : Chrome 27.X.X

        参考:document.locationwindow.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] }
        

        document.location.href

        type: string

        http://stackoverflow.com/questions/2652816/what-is-the-difference-between-document-location-href-and-document-location?rq=1
        

        【讨论】:

          【解决方案7】:

          这是一个示例,说明差异的实际意义以及如果您没有意识到它会如何影响您(document.location 是一个对象,document.location.href 是一个字符串):

          我们在http://social.ClipFlair.net 使用MonoX Social CMS (http://mono-software.com) 免费版,我们想在某些页面添加语言栏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 写入“位置 -> ...”而不是“...”。这让我意识到它是一个对象

          本以为替换会抛出异常或其他东西,但现在我想到了问题是它试图在 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>
          

          【讨论】:

            猜你喜欢
            • 2011-01-26
            相关资源
            最近更新 更多