2011-09-05 116 views
12

守候在我的網頁的身體,我需要插入此碼作爲一個AJAX調用的結果:的動態加載腳本

<p>Loading jQuery</p> 
    <script type='text/javascript' src='scripts/jquery/core/jquery-1.4.4.js'></script> 
    <p>Using jQuery</p> 
    <script type='text/javascript'> 
     $.ajax({ 
      ... 
     }); 
    </script> 

我不能使用$.load(),因爲該文件已加載,因此事件不開火。

這是安全嗎?如果沒有,我如何確保jquery腳本在我的自定義生成代碼執行之前已經加載。

+1

選中此相關的答案了:** [動態添加腳本標籤加載順序(http://stackoverflow.com/a/ 38840724/2247494)** – jherax

回答

16

這是非常安全的。從歷史上看,<script>標記是完全阻塞的,因此第二個<script>標記在前者完成解析/消除之前無法遇到。唯一的問題可能是「現代」瀏覽器傾向於加載腳本異步和延期。因此,要確保順序是正確的,使用這樣的:

<p>Loading jQuery</p> 
<script type='text/javascript' async=false defer=false src='scripts/jquery/core/jquery-1.4.4.js'></script> 
<p>Using jQuery</p> 
<script type='text/javascript'> 
    $.ajax({ 
     ... 
    }); 
</script> 

但是,它可能是一個更好的主意用它來代替推動這一作爲HTML字符串到DOM動態腳本標記插入。將是相同的故事

var scr = document.createElement('script'), 
    head = document.head || document.getElementsByTagName('head')[0]; 
    scr.src = 'scripts/jquery/core/jquery-1.4.4.js'; 
    scr.async = false; // optionally 

head.insertBefore(scr, head.firstChild); 
+2

使用'insertBefore'而不是'appendChild'有優勢嗎? – Joe

+6

如果指定了'async'和'defer',現代瀏覽器只會異步執行腳本或延遲執行腳本。 HTML中完全不需要'async = false'和'defer = false'。但是,動態創建的腳本默認情況下將'async'設置爲true,這就是爲什麼您需要第二個代碼示例中的'scr.async = false;'。請參閱http://www.html5rocks.com/en/tutorials/speed/script-loading/ – Flimm

0

$ .ajax和$ .load是同樣的事情。你也可以使用。如果將$ .load放在頁面上的腳本標記中,它將在加載時觸發,就像$ .ajax()一樣。

當談到在你做某些事情之前等待腳本發射,Tomalak說的是真的。異常是異步調用。 Javascript將進行AJAX調用,然後繼續運行腳本,當AJAX調用響應時,它將根據您所做的事情運行成功/失敗。

現在說你希望你的JS等待回報,只需一次調用就可以很容易地將每一件事都包裝在成功回調中,或者你可以用很酷的方式來做,並使用$ .deferred。這允許你做一堆ajax調用或者一個,然後在完成之後運行一些代碼。

$。當& $。然後可能是最適合這種情況。

不管你做什麼都是安全的。

8

jQuery 1.6也有新功能。它被稱爲jQuery.holdReady()。它實際上是自我解釋的;當您致電jQuery.holdReady(true)ready事件不會被解僱,直到您致電jQuery.holdReady(false)。將其設置爲false將不會自動激發一個準備好的事件,它只會消除保留。

這裏是加載從文檔拍攝腳本的無阻塞例如:

$.holdReady(true); 
$.getScript("myplugin.js", function() { 
    $.holdReady(false); 
}); 

http://api.jquery.com/jQuery.holdReady/以獲取更多信息

13

的ID添加到您的腳本文件,這樣你就可以查詢它。

<script id="hljs" async src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.0.0/highlight.min.js"></script> 

然後負載監聽器添加到它在JavaScript

<script> 
    var script = document.querySelector('#hljs'); 
    script.addEventListener('load', function() { 
    hljs.initHighlightingOnLoad(); 
    }); 
</script> 
+1

幹得好,謝謝 – onalbi