加载外部脚本动态,并访问它,所以我可以触发其domready函数

时间:2010-04-12 15:57:46

标签: javascript prototypejs

我正在尝试加载Zopim聊天客户端。通常它包含在文档写入操作中。这会导致在触发domReady函数之前加载它,因为它需要它自己启动。

我想稍后加载它,这通过使用原型(由Magento确定的框架)来创建一个新的脚本元素并将其附加到头部。该脚本完全加载,但domReady不会触发,因此脚本永远不会启动。

该脚本是一个无名的类,我的意思是它的所有函数都封装在{} 中 更新:对不起,我弄错了,它是自动调用函数,与第一个答案建议的语法相同。 (函数C(){ })();

运行时调用此函数会在各种浏览器下设置domReady事件的侦听事件,然后等待。当domready事件触发时,它会调用一个启动所有内容的函数(在自调用函数内)。我需要的是一种以某种方式访问​​此功能的方法。 END UPDATE

其中有一个名为C的函数。

如何直接调用此功能?

或换句话说,我怎样才能启动一个依赖于已经关闭的外部javascript文件,当该事件没有发生时?

我可以将外部javascript文件加载到变量中,所以我可以命名该类吗? 我可以通过脚本标签以某种方式访问​​无名类{}吗? 有没有办法改变外部文件/ javascript所以我可以让它寻找另一个我可以触发的事件?

关于我现在能想到的唯一解决方案是创建一个iframe并加载脚本。

2 个答案:

答案 0 :(得分:0)

如果你想在domready已经被触发后异步加载它之后触发它,你可以这样做:

通过以下方式使您的函数 C 成为自调用函数:

(function C(){
})();

通过这种方法,您可以更改外部脚本。

答案 1 :(得分:0)

您可以以编程方式触发事件,例如:

window.dispatchEvent(new Event('DOMContentLoaded'));

Creating and triggering events

但请注意,此解决方案要使其正常工作可能很棘手,因为当您触发事件时,某些已注册到该事件的事件处理程序将再次触发。这会导致页面无法按预期工作或无限循环(事件注册、处理程序调用、事件注册、无限期处理程序调用)等问题。

因此,您需要一个解决方案来确保注册到 DOMContentLoaded 事件的不同脚本的处理程序仅准确调用 1 次。