【问题标题】:When do I need to specify the JavaScript protocol?我什么时候需要指定 JavaScript 协议?
【发布时间】:2010-02-23 20:28:50
【问题描述】:

我的印象是,在 URL 属性中使用 JavaScript 时,我只需要指定“协议”,例如在 hrefs 中。这是javascript: 唯一“有用”的上下文吗?

明智的:

<a href="javascript:alert('Hello')">World!</a>

傻:

<form onsubmit="javascript:alert('oops!')">

这是对的吗?还是我需要注意一些晦涩难懂的错误/用例?

【问题讨论】:

标签: javascript correctness


【解决方案1】:

事件处理程序上的javascript: 伪协议只会被忽略,您不需要它,JavaScript 引擎会将javascript: 解释为Label Statement

标签只是为语句提供标识符,并让您在程序的其他地方引用它。

恕我直言,这个伪协议只对书签有用...

推荐文章:

【讨论】:

    【解决方案2】:

    正如其他答案所提到的,避免使用javascript: href 链接,并且在事件处理程序属性中完全没有必要。但是,由于A 标记有时在语义上仍然正确,因此如果您希望将:link:hover CSS 样式应用于Internet Explorer 中的元素,则需要在href 属性中添加一些内容。在这种情况下,请使用:

    <a href="#" onclick="doSomething(); return false;">Link</a>
    

    或者

    <a href="javascript://" onclick="doSomething();">Link</a>
    

    javascript 协议存在一个(有点模糊的)错误 - 在 Internet Explorer* 中,当您单击链接时它会认为您正在离开页面。如果您使用的是 window.onbeforeunload,那么此时将显示您的导航离开消息。仅出于这个原因,我们已经完全停止使用 javascript 协议,所以我们没有出现这个错误,因为我们在向某个页面添加导航离开消息时忘记检查它。


    * 我第一次写这篇文章时可能应该指定版本。我完全不记得了,但万一这个 bug 只出现在像 IE 6 或 7 这样的几乎已经失效的浏览器中,你最好自己测试一下。

    【讨论】:

      【解决方案3】:

      永远不要指定它。在&lt;a&gt; 标签中这样做是错误的,应该这样编码:

      <a href='#' onclick='alert("Hello")'>World</a>
      

      这是过去几天的残余。我唯一能想到的地方是浏览器地址栏(和书签书签)。把它放在你的页面之外。

      【讨论】:

      • 如果您使用#,请记住return false;,以便它取消href 操作并且不会转到页面顶部,或者(更糟糕的是)更改您的哈希(如果您有一个)实际上是用来做某事的。或者,您可以将javascript:// 用作href,这真的什么都不做。
      • +1 @Reensis。此外,您甚至可以使用该方法在 href 中添加简单的描述。例如:javascript:// Open in new window。这是一个 JS 注释,所以你可以在里面放任何东西。这很有帮助,因为当用户将鼠标悬停在链接上时它会显示在状态栏中
      • @Reensis:不知道 href="javascript://" 很酷!顺便说一句,在您的第一个示例中返回 false 以防止默认事件就足够了吗?我的意思是我们不应该在 IE 上调用 preventDefault ofn FF ann window.event.returnValue = false 吗?谢谢!
      • @Marco Demaio,AFAIK 如果您无权访问处理程序本身的return false,您只需要 preventDefault 来阻止默认设置。对于 jQuery 或任何您添加事件处理程序的库,除了添加到标记上的事件处理程序属性之外,情况就是如此。例如:&lt;a onclick="doSomething();"&gt;Test&lt;/a&gt;function doSomething() { return false; }阻止默认设置。
      • “javascript:”从来都不是一个好主意。如果 &lt;a&gt; 标记的“href”值会损坏,为什么还要在标记中编码?
      【解决方案4】:

      在实践中,你是对的。

      您需要在预期脚本以外的任何情况下执行此操作。理论上,您可以在任何可以使用 URL 的地方粘贴javascript:whatever,但这从未得到支持,现在官方建议不要使用。

      然而,你真的不应该使用javascript:。对于链接,您可以使用onclick 属性。现在实际发生的是 JavaScript 引擎将 javascript: 识别为标签,这就是代码执行的原因。

      【讨论】:

      【解决方案5】:

      你们都应该退房 http://bytes.com/topic/javascript/answers/504856-javascript-pseudo-protocol-event-handlers 尤其是“Lasse Reichstein Nielsen”的帖子,因为这里的大多数答案在某种程度上都是不正确的。

      还要记住,锚标记根本不需要href!那是 &lt;a&gt;hi&lt;/a&gt; 是有效的 xhtml。使用href="#" 的问题是它可能会滚动到页面顶部.. 它根本不需要。最后,如果您实际上并不想要锚标记的行为,则不应使用它。您可以使用 css (cursor:pointer) 和诸如 mouseenter 和 mouseleave 之类的事件来模拟锚点(工作量更大,但不会“破坏”锚标记的预期行为)。

      【讨论】:

      • “完全不需要”并非适用于所有浏览器。如果没有href,在某些版本的IE 中将无法应用正确的CSS 样式,锚标记将无法与文本区分开来,也无法使用:hover
      猜你喜欢
      • 1970-01-01
      • 2012-01-04
      • 2011-08-18
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多