【问题标题】:How to add a script at runtime? (document.write is not a function)如何在运行时添加脚本? (document.write 不是函数)
【发布时间】:2026-01-30 17:40:02
【问题描述】:

我试图在运行时向我的 Xul 应用程序添加一个脚本,其中:

document.write('<script type="text/javascript" src="chrome://myapp/content/myscript.js"/>');

但我得到了:

错误:document.write 不是 功能

该函数确实存在in the docs。我也从文档中得到了这个例子:

document.open();
document.write("<h1>Out with the old - in with the new!</h1>");
document.close();

但我得到了:

document.open 不是函数

知道有什么问题吗?

--更新

也许我可以将我的 js 代码放在一个 Javacript 模块中,然后使用 Components.utils.import 导入它(查找将资源放在哪里以及如何引用它)

【问题讨论】:

  • 您的代码中是否在该范围级别重新定义了“文档”?例如,它是隐藏真正的“文档”变量的局部变量吗?
  • @Tejs 没有,没有。该文档是原始文档。

标签: javascript xul


【解决方案1】:

document.write 函数在使用 XHTML 时不可用;见:http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite。您很可能正在使用 XHTML。

您应该评估您是否真的需要使用 XHTML。如果没有,那么您将能够使用document.write。但是如果你这样做了,你将需要使用另一种方法来操作 DOM。您可以直接使用 DOM 方法,也可以使用 jQuery 等辅助库。

【讨论】:

  • 我不确定,但我认为 Xul 是一种 XHTML 语言。关于使用 DOM 方法,我不确定,但我认为这正是我正在做的,不是吗?
  • 啊,对不起,我错过了你在做 XUL 的事实。我认为这将受到同样的限制。 Timofey 在下面的回答应该让您走上正轨。他链接的示例 (1) 使用 getElementById() 定位现有元素,然后在其后附加一个新元素。
【解决方案2】:

来自this example

在 XUL 中使用 createElement 方法 让你完成类似的事情 document.write 用 HTML 编写,您可以使用它 可以创建新页面和部分 网页。

【讨论】:

  • 尝试添加到 document.body 我得到了document.body is undefined。尝试使用 window.appendChild(这是the doc says 的继承方法),我得到了window.appendChild is not a function。知道这里可能出了什么问题吗?
【解决方案3】:

脚本标签中是否有 javascript?您是否在代码中的某个位置启动该功能?它不会自行运行。

这行得通:

<html>
<head>
<script type="text/javascript">
function addCont(){
document.open();
document.write("<h1>New text</h1>");
document.close();
}
</script>
</head>
<body onload="addCont()">
<p>Some text...</p>
</body>
</html>

【讨论】:

  • 是的,我确实在脚本标签中有 js,我在 onload 方法的 setTimeout 中调用了该函数。这不应该工作吗?
  • 可能是因为您在文档中添加了脚本标签?
  • 脚本将“自行运行”。函数不会自行运行,但不在函数中的单独代码行(如单独的 document.write())将运行,而无需从某个事件中调用。
  • 操作,抱歉,我误会了你。我的脚本在另一个文件中,包含在 &lt;script type="application/x-javascript" src="myscript.js" /&gt;
【解决方案4】:

您在对另一个答案的评论中说,您正在从 setTimeout 调用的函数中执行 document.write(),该函数本身在 onload 中。 我建议不要在页面加载后使用 document.write()。 根据 Mozilla 文档:

一个自动 document.open() 调用 当 document.write() 是 在页面加载后调用,但是 W3C 中没有定义的 规范。

而且由于自动 document.open()

如果目标中存在文档,则此方法将其清除

从记忆中我认为,如果您在页面加载后使用 document.write(),旧版本的 IE 只会出错,但我不会费心尝试在他们的文档中查找任何内容。

正如其他人提到的,它不适用于 xhtml。

在这种情况下,您为什么还要执行 document.write()?为什么不直接包含您的脚本?

【讨论】:

  • 我想要它,因为打开/加载窗口需要很长时间,并且只有当用户在该窗口上请求该功能时才能加载某些脚本。我在页面加载后调用它,之前调用对我的目标没有帮助,最好直接包含脚本.. :)
【解决方案5】:

有两种方法可以在运行时动态加载脚本。

第一种方式是通过subscript loader

第二种方法是创建一个覆盖层来加载您的脚本并动态地load the overlay

【讨论】: