为什么使用带有 javascript:"protocol" 的链接是不好的做法?

IT技术 javascript html href
2021-02-02 02:55:28

在 1990 年代,有一种时尚将 Javascript 代码直接放入<a>href 属性中,如下所示:

<a href="javascript:alert('Hello world!')">Press me!</a>

然后我突然停下来看它。它们都被以下内容取代:

<a href="#" onclick="alert('Hello world!')">Press me!</a>

对于一个以触发Javascript代码为唯一目的且没有实际href目标的链接,为什么鼓励使用onclick属性而不是href属性?

6个回答

执行上下文是不同的,要看到这一点,请尝试以下链接:

<a href="javascript:alert(this.tagName)">Press me!</a> <!-- result: undefined -->
<a href="#" onclick="alert(this.tagName)">Press me!</a> <!-- result: A -->

javascript:在全局上下文中执行,而不是作为元素的方法,这通常是您想要的。在大多数情况下,您正在做一些与您所操作的元素有关或与之相关的事情,最好在该上下文中执行它。

此外,它更简洁,尽管我根本不会使用内嵌脚本。查看以更简洁的方式处理这些事情的任何框架。jQuery 中的示例:

$('a').click(function() { alert(this.tagName); });
@Richard - 这也有一个优势,即位于外部和缓存文件中,而不是每轮都作为页面的一部分下载......我认为出于多种原因,它对开发人员的质量和便利性都更好。
2021-03-16 02:55:28
只是一个快速澄清 - 当您从 href 属性调用 javascript:this 时,它是对 window DOM 对象的引用。
2021-03-19 02:55:28
@Nick Craver - 这是真的……我对措辞和内容的思考一样多;对我来说,这就像一个脚注/事后的想法。并不是说我不同意您的任何观点:)
2021-03-27 02:55:28
感谢您解释差异然后提出更好的方法。
2021-03-28 02:55:28
我觉得有趣的是,社区赞成的答案的重点 - 并且被选中 - 重点关注使用javascript:协议给开发人员带来的不便,而不是它对可交付成果质量的影响......让我想起电梯测试;codinghorror.com/blog/2007/09/...
2021-03-28 02:55:28

实际上,这两种方法都被认为是过时的。鼓励开发人员在外部 JS 文件中分离所有 JavaScript,以便将逻辑和代码与真正的标记分开

这样做的原因是它创建了更易于维护和调试的代码,并且还促进了 Web 标准和可访问性。可以这样想:看看你的例子,如果你在一个页面上有数百个这样的链接,并且需要alert使用外部 JS 引用改变一些其他函数行为,你只需要改变一个事件绑定在一个 JS 文件中,而不是一遍又一遍地复制和粘贴一堆代码或进行查找和替换。

几个原因:

  1. 错误的代码实践:
    HREF 标记用于指示存在指向另一个位置的超链接引用。通过对实际上并没有将用户带到任何地方的 javascript 函数使用相同的标签是不好的编程习惯。

  2. SEO 问题:
    我认为网络爬虫使用 HREF 标签在整个网站上爬行并链接所有连接的部分。通过放入 javascript,我们破坏了这个功能。

  3. 中断可访问性:
    我认为某些屏幕阅读器将无法执行 javascript,并且可能不知道如何处理 javascript,而他们希望有一个超链接。用户将希望在链接悬停时在浏览器状态栏中看到一个链接,同时他们会看到一个类似“javascript:”的字符串,这可能会使他们感到困惑等。

  4. 您仍处于 1990 年代:
    主流建议是将您的 javascript 放在一个单独的文件中,而不是像 1990 年代那样与页面的 HTML 混合。

哈。

+1 对于糟糕的代码实践,尚未创建 href 标记来指示 JS 代码的触发器。
2021-03-13 02:55:28
@zneak - 也许我应该将状态栏注释从“可能会混淆他们”替换为“可能会激怒他们”。从个人经验来看,当我不想离开当前页面时,我喜欢 Shift+click/Ctrl+click 链接以在新窗口中打开它们,并且当它中断时,我想去寻找破坏它的开发人员第一名 :)
2021-03-19 02:55:28
我不相信 SEO 是一个有效的论点,因为他们非常能够找出他们可以遵循哪些链接以及他们不能遵循的链接。我会购买你关于屏幕阅读器的论点(我肯定很想听到计算机声音大声朗读 Javascript 代码),但状态栏的事情对我来说似乎有些夸大其词。
2021-03-24 02:55:28

我在新标签页中打开了很多链接——只是为了看到 javascript:void()。所以你惹恼了我,也惹恼了你自己(因为谷歌会看到同样的事情)。

另一个原因(也被其他人提到)是不同的语言应该被分成不同的文档。为什么?好,

  • 大多数 IDE 和验证器都不太支持混合语言。将 CSS 和 JS 嵌入 HTML 页面(或其他任何内容)几乎破坏了静态检查嵌入语言正确性的机会。有时,嵌入语言也是如此。(PHP 或 ASP 文档不是有效的 HTML。)您不希望语法错误或不一致仅在运行时出现。
  • 另一个原因是在需要指定的类型之间进行更清晰的分离:HTML 用于内容,CSS 用于布局,JS 通常用于更多的布局和外观。这些不是一对一的映射:您通常希望将布局应用于整个类别的内容元素(因此是 CSS)以及外观(因此是 jQuery)。它们可能会在内容元素更改的不同时间(实际上内容通常是动态生成的)和由不同的人更改。因此,将它们保存在单独的文档中也是有意义的。
投票主要支持第一点。试图在新选项卡中打开链接却只能javascript:void(0)在地址栏中看到让我发疯
2021-03-19 02:55:28
我更多地谈论仅影响调用页面的 Javascript 代码。我也不喜欢看javascript:void(0)
2021-03-29 02:55:28

简短回答:内联 Javascript 不好的原因是内联 CSS 不好。