2012-09-18 13 views
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 
     }); 
    } 
} 

回答

0

首先,$(function(){意味着jQuery的加載,不一定是你的其他腳本。所以,只要有這個不能保證你的腳本加載後你的功能就會運行。因此,您的函數可以在加載腳本之前調用。

爲了解決這個問題,你需要的東西,如:瞭解更多信息http://friendlybit.com/js/lazy-loading-asyncronous-javascript/

(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); 
})(); 

見。

編輯澄清思想,完善實例

這應該工作,因爲它等待網頁加載,然後加載你的異步,一旦它被加載觸發,你可以打電話給你的外部函數的函數加載文件

開始加載腳本異步的。

(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瀏覽器)的瀏覽器

+0

該代碼將導致在加載頁面上的所有資源後調用async_load。我想那麼我的函數將執行這個腳本加載之前 - 仍然存在的問題? – neelmeg

+0

您在attachEvent完成後調用您的函數。 –

+0

我如何做到這一點的任何例子? – neelmeg

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 
    }); 
}); 
相關問題