1

从正文中的脚本,我将 jquery 和 SimpleModal 动态加载到页面标题中。我使用回调来确保在调用 jQuery 之前完全加载它——这很有效。但是,当我动态加载 SimpleModal 脚本文件时,我无法随后调用它的方法。当 SimpleModal 脚本延迟加载时,它会出现无法引用当前文档对象。任何帮助将不胜感激。

/******** Called once jQuery has loaded ******/
function scriptLoadHandler() {
    jQuery = window.jQuery.noConflict(true);

    main();
}

/******** Main function ********/
function main() {
    jQuery(document).ready(function ($) {
        var domain = 'http://qo.microssoftware.com';

        /******* Load SimpleModal *******/
        var script_tag = document.createElement('script');
        script_tag.setAttribute("type", "text/javascript");
        script_tag.setAttribute("src",
        domain + "/js/simplemodal.js");
        script_tag.onload = modalLoadHandler;
        (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(script_tag);

    });
}

function modalLoadHandler() {
    /******* Open Modal *******/
    $.modal("<div><h1>SimpleModal</h1></div>", {});
}
4

3 回答 3

1

尝试:

<script type="text/javascript" src="http://qo.microssoftware.com/js/simplemodal.js"></script>
<script type="text/javascript">
jQuery(document).ready(function ($) {
    $.modal("<div><h1>SimpleModal</h1></div>");
});
</script>

或者,如果您想使用 main() 函数调用模态:

<script type="text/javascript" src="http://qo.microssoftware.com/js/simplemodal.js"></script>
<script type="text/javascript">
jQuery(document).ready(function ($) {
    function main() {
        $.modal("<div><h1>SimpleModal</h1></div>");
    }
});
</script>

您不需要将 js 放在标题中...实际上有些程序员总是将所有 JS 放在结束 BODY-tag 之前。

于 2012-09-15T00:50:28.837 回答
0

这是您希望基于onload脚本事件创建异步闭包的地方。

如果你必须支持古老的 IE,你也可以挂钩到onreadystatechange事件中,就像在 AJAX 请求中一样(在纯 JS 中)。更现代的浏览器不会触发此事件。

因此,将 onload 转换为回调,该回调会触发文件中的已知方法。您还可以通过附加到onerror脚本的加载来解决错误。

于 2012-09-15T01:09:06.760 回答
0

首先,我建议这是不必要的。simplemodal 脚本非常紧凑。更多地考虑如何在一般情况下优化脚本加载(gzip,或者如果您必须使用 ajax,使用 RequireJS 等的 AMD 依赖加载),而不会出现这种 ajax 方法不必要的复杂性。

使用此类方法的脚本加载器(如 Facebook SDK 或 Google Maps)将在脚本初始化后搜索窗口(全局)元素以查找要调用的回调。基本上,您必须修改 simplemodal 代码,然后将您的依赖代码包装在回调中。在这种情况下,我几乎看不出这有什么必要。

于 2012-09-15T00:50:13.850 回答