在单个 JavaScript 文件中处理多个页面上的事件的正确方法是什么?

Jas*_*210 5 html javascript getelementbyid

(不使用 JQuery)

为了正确地提出这个问题,我做了一个简单的例子,一个网站包含三个页面A、B和C。每个页面都链接到一个JavaScript文件。JavaScript文件链接在body标签的底部。以下是其中一个 html 页面的示例:

<html>
    <head>
        <title>Page A</title>
        <link rel="stylesheet"
              type="text/css"
              href="temp.css">
        </link> 
    </head>
    <body>
        <h1 id = "headingA">Page A</h1>
        <button id="enterA">Enter</button>
        <script src = temp.js>
        </script>
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

除了“A”明显替换“B”和“C”之外,这三个页面看起来都很相似。

//this button is on page A
var btnA = document.getElementById("enterA");
btnA.onclick = function () {
    "use strict";
    window.console.log("Button A Pressed");
    window.open("/pageB.html", "_self");
};

//this button is on page B
var btnB = document.getElementById("enterB");
btnB.onclick = function () {
    "use strict";
    window.console.log("Button B Pressed");
    window.open("/pageC.html", "_self");
};

//this button is on page C
var btnC = document.getElementById("enterC");
btnC.onclick = function () {
    "use strict";
    window.console.log("Button C Pressed");
    window.alert("Button C Pressed");
};
Run Code Online (Sandbox Code Playgroud)

显然这是行不通的,因为一次只能加载一个页面,因此脚本试图在未加载的页面上抓取的元素将导致脚本错误。

我可以想出几种方法来解决这个问题,但我觉得自己像个黑客,我在这里问的原因是为了寻求最佳实践解决方案,因为我相信这一定是实践开发人员的第二天性(不像我自己)。

Sam*_*ley 3

没有理由将特定于某一页面的 JavaScript 存在于跨所有页面加载的 .js 文件中。事实上,这有潜在的风险,因为如果引入同名的元素,可能会出现不明确和意外的行为。您可以(并且通常会在重要的项目中)在每一页加载多个 JavaScript 文件,因此虽然有很多方法可以构建您的代码,但我认为这是一种常见的做法:

将共享的、非特定于页面的 JavaScript 保存在一个文件中,例如

  • Common.js

然后为每个页面创建一个特定于页面的 JavaScript 文件:

  • PageA.js
  • 页面B.js
  • PageC.js

像现在一样,在所有页面上加载 Common.js 文件,但在每个页面上,另外加载包含该页面特定功能的脚本文件。正如评论中提到的,您还可以编写 JavaScript 来检查有问题的元素是否存在并采取相应的行动,但我鼓励您开始在代码组织方面形成更好的习惯,并完全避免问题。

  • 在多个页面中使用相同的 javascript 文件是有充分理由的,这就是所谓的缓存,并且减少 http 请求通常也是一件好事,而 HTTP/2 如今使这一点变得更加多余 (4认同)
  • @adeneo 我并没有说没有理由在多个页面上使用相同的 JavaScript 文件 - 事实上,我鼓励它共享功能。但我认为,说本质上特定于单个页面的功能不属于站点范围的 JS 是没有争议的。如果您担心缓存和减少请求,那么使用捆绑是比将所有代码编写在单个文件中更好的解决方案。 (2认同)