什么时候需要指定 JavaScript 协议?

IT技术 javascript correctness
2021-01-31 03:00:47

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

明智的:

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

愚蠢的:

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

这是正确的吗?或者是否有一些我需要注意的晦涩的错误/用例?

5个回答

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

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

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

推荐文章:

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

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

或者

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

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


* 我可能应该在我第一次写这个的时候指定版本。我完全不记得了,但以防万一该错误仅存在于 IE 6 或 7 等现已基本失效的浏览器中,您最好自己测试一下。

永远不要指定它。<a>标签中这样做是错误的,而应该像这样编码:

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

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

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

在实践中,你是对的。

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

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

html.spec.whatwg.org/multipage/...它现在是 HTML 标准的一部分
2021-04-01 03:00:47

你们都应该查看 http://bytes.com/topic/javascript/answers/504856-javascript-pseudo-protocol-event-handlers 尤其是“Lasse Reichstein Nielsen”的帖子,因为这里的大多数答案在某些方面都是不正确的.

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

“根本不需要”并非适用于所有浏览器。如果没有href,在某些版本的 IE 中,将不会应用正确的 CSS 样式,并且锚标记将无法与文本区分开来,也无法使用:hover.
2021-04-08 03:00:47