外部 Javascript 文件如何影响 HTML 文件的 DOM?

Posted

技术标签:

【中文标题】外部 Javascript 文件如何影响 HTML 文件的 DOM?【英文标题】:How can an external Javascript file affect an HTML file's DOM? 【发布时间】:2014-11-22 07:38:20 【问题描述】:

假设我们的 html 文件有以下代码:

<html>
 <head>
  <script src="totti.js"></script>
 </head>
 <body>
  <span id="tim">this'll change on load</span>
 </body>
</html>

而且由于我不知道我该怎么做,所以这是我想要实现的代码(例如 totti.js):

function changeText()
 document.getElementById("tim").innerHTML = "changed text";

changeText();

我想我们需要先将它的 id 定义为一个变量,还是将它作为 HTML 端的参数传入?帮助将不胜感激。谢谢。

【问题讨论】:

不清楚你的问题是什么。这是关于javascript如何工作的一般问题吗?您基本上已经自己回答了……浏览器加载了一个 HTML 页面和一个 javascript 文件;如果浏览器有 javascript 解释器(几乎所有浏览器都有),它会运行脚本文件中的代码。脚本通常会有一个声明来告诉浏览器何时运行脚本,例如当页面加载时,当 DOM 准备好时,等等。 【参考方案1】:

您的代码是正确的,但是,如果您将脚本放在 head 标记内,那么脚本将在文档加载之前执行,因此它将不起作用(id 为 tim 的元素不会仍然存在)。

要解决此问题,您可以将脚本标签放在要修改的元素之后(或 body 标签的底部),如下所示:

<html>
 <head>
 </head>
 <body>
  <span id="tim">this'll change on load</span>
  <script src="totti.js"></script>
 </body>
</html>

或者您可以让函数在文档加载后运行,如下所示:

<html>
 <head>
  <script src="totti.js"></script>
 </head>
 <body onload="changeText()">
  <span id="tim">this'll change on load</span>
 </body>
</html>

在这种情况下,请从 totti.js 中删除 changeText() 行。

【讨论】:

不建议使用inline onload handler【参考方案2】:

你快到了,这是正确的方法。但是,您的 Javascript 在呈现“tim”元素之前已加载并执行,因此无法找到它。

将您的代码包装在一个事件中,一旦加载了所有 DOM 元素就会触发:

document.addEventListener('DOMContentLoaded', function()
    changeText();
);

function changeText()
    document.getElementById("tim").innerHTML = "changed text";

请注意,函数本身不在事件回调中,因此它在 javascript 加载时立即注册。只有实际调用 changeText() 函数取决于 DOM。

【讨论】:

是的! DOMContentLoaded 绝对是实现兼容性的方法。虽然Document.readyState 提供了更多的灵活性。我怀疑随着 PWA 的兴起,这将变得更加重要。 ;)【参考方案3】:

问题: 在创建元素之前,您正在使用 document.getElementById("tim") 访问 dom 元素。

有两种方法可以解决您的问题:

1.将script-tag 移动到body-tag 的末尾:

<html>
 <head>
 </head>
 <body>
  <span id="tim">this'll change on load</span>
  <script src="totti.js"></script>
 </body>
</html>

2。使用onload

<html>
 <head>
  <script src="totti.js"></script>
 </head>
 <body onload="changeText()">
  <span id="tim">this'll change on load</span>
 </body>
</html>

【讨论】:

【参考方案4】:

三种方式:

    在您的内容之后导入 js 文件。 使用 window.onload = function() ... document.addEventListener('DOMContentLoaded', function() ...

所以它可以找到元素。

【讨论】:

【参考方案5】:

如果您需要在加载所有元素后执行更改,为什么不使用简单的 JQuery 函数。

$(document).ready(function ()  
  $('#tim').html("changed text"); 
);

【讨论】:

请不要假设每个人都使用jQuery

以上是关于外部 Javascript 文件如何影响 HTML 文件的 DOM?的主要内容,如果未能解决你的问题,请参考以下文章

html如何连接外部样式表,关于html:链接到外部样式表和javascript文件

如何使用从 javascript/html 中的外部 php 文件中提取的 JSON 数据?

如何将变量从外部 JavaScript 传递到 HTML 表单

在 expressjs 中提供带有响应对象的 HTML 文件时,如何包含外部 JavaScript 文件?

javascript引入外部js文件

如何将外部Javascript文件链接到Play Framework项目中的html文档?