1

如何确保转换函数(在 myjs.js 中定义)始终执行?是否存在由于在加载 myjs.js 之前调用它而可能失败的情况?

<body>
<script type='text/javascript'>
$(function(){
   //call a function within myjs.js
   $("#id").conversion({
           settings : url
    });
});
</script>

/*loading myjs.js asynchronously*/
<script type='text/javascript'>
(function(){
    var a = document.createElement('script');
    a.type = 'text/javascript';
    a.async = true;
    a.src = 'http://mydomain/myjs.js'; 
    var b = document.getElementsByTagName('script')[0];
    b.parentNode.insertBefore(a, b);
})();
</script>

</body>

这是确保始终调用转换函数的正确方法吗?

$.ajax({
  url: 'http://mydomain/myjs.js',
  dataType: 'script',
  cache: true, // otherwise will get fresh copy every page load
  success: function() {
    // script loaded, do stuff!
     $("#id").conversion({
               settings : url
        });
  }
}
4

2 回答 2

0

第一的,$(function(){意味着 jQuery 已经加载,不一定是你的其他脚本。因此,仅仅拥有它并不能保证您的函数将在脚本加载后运行。因此,可以在加载脚本之前调用您的函数。

要解决此问题,您需要以下内容:

(function() {
    function async_load(){
        var s = document.createElement('script');
        s.type = 'text/javascript';
        s.async = true;
        s.src = 'http://yourdomain.com/script.js';
        var x = document.getElementsByTagName('script')[0];
        x.parentNode.insertBefore(s, x);
    }
    if (window.attachEvent)
        window.attachEvent('onload', async_load);
    else
        window.addEventListener('load', async_load, false);
})();

请参阅:http: //friendlybit.com/js/lazy-loading-asyncronous-javascript/了解更多信息。

编辑以澄清想法并改进示例

这应该可以工作,因为它等待页面加载,然后加载你的异步,一旦加载就会触发一个函数,你可以调用加载文件的外部函数。

从异步加载脚本开始:

(function(){
    var a = document.createElement('script');
    a.type = 'text/javascript';
    a.async = true;
    a.src = 'http://www.example.com/somefile.js';
    var b = document.getElementsByTagName('script')[0];
    b.parentNode.insertBefore(a, b);
})();

接下来,执行以下操作:

function my_initialization_function() {
    //call a function within myjs.js
   $("#id").conversion({
           settings : url
    });
}

    if(document.addEventListener) {
        window.addEventListener("load", my_initialization_function(), false );
    }
    else if(window.attachEvent) {
        window.attachEvent("onload", my_initialization_function());
    }

说明: (document.addEventListener)为支持它的浏览器(所有非 IE 浏览器)添加事件监听器。(window.attachEvent)对于支持 attachEvent 的浏览器(IE 浏览器)

于 2012-09-18T03:50:24.580 回答
0

由于您是异步加载它,因此您需要确保在运行代码之前已加载它(大概在脚本元素上使用和 onload 回调?)。或者您可以以“正常”方式包含脚本:

<script src="myjs.js"></script>
<script>
    $(function () {
        $("#id").conversion({
            settings : url
        });
    });
</script>

编辑:如果您将所有script元素放在结束</body>标记之前,则整个页面将在脚本之前加载,然后“正常”加载没有任何危害。此外,通过将所有脚本放在页面的最后,您不需要在“dom ready”上运行它,因为 dom 已经加载。

编辑:您也可以在加载窗口的情况下交换 dom(不确定):

$(window).load(function () {
    $("#id").conversion({
        settings : url
    });
});
于 2012-09-18T03:32:48.790 回答