2013-04-11 26 views
0

此問題是another question of mine的後果。爲什麼這段代碼不起作用(以及如何修復它)?

的代碼是:

<script type='text/javascript'> 
    var scripts = [ 
     "http://www.---.com/include/jquery-1.8.3.min.js", 
     "http://www.---.com/include/functions.js", 
     "http://www.---.com/include/myjs.js", 
     "http://www.---.com/include/plugins/bxslider/bxslider.js" 
    ]; 
    function downloadJSAtOnload() { 
     for(var i=0; i<scripts.length; i++) { 
      var element = document.createElement('script'); 
      element.src = scripts[i]; 
      document.body.appendChild(element); 
     } 
     $(document).ready(function(){ 
      $('#mainslide .bxslider').bxSlider({ 
       slideWidth: '960', 
       mode: 'vertical', 
       speed: '500', 
       captions: false, 
       pager: false, 
       controls: false, 
       nextText: 'Next', 
       prevText: 'Prev', 
       auto: true, 
       autoHover: true, 
       pause: 3000 
      }); 
     }); 
    } 
    if (window.addEventListener) window.addEventListener('load', downloadJSAtOnload, false); 
    else if (window.attachEvent) window.attachEvent('onload', downloadJSAtOnload); 
    else window.onload = downloadJSAtOnload; 
</script> 

產生的誤差爲「未捕獲的ReferenceError:$沒有定義」

奇怪的是,在許多瀏覽器和版本中,一切都很完美(幻燈片,燈箱......)。僅在IE8和Safari 4中向用戶顯示警報。

+0

也許它們太慢了,以至於在腳本元素被創建到第一個$之前實際加載jquery文件呢?爲什麼不直接在腳本標籤中聲明它們呢? – 2013-04-11 12:50:21

+1

你正在異步加載腳本......在執行'$'調用的時候,沒有辦法裝載jQuery。 – 2013-04-11 12:50:49

+0

在您嘗試訪問'$'時,腳本(包括jQuery)尚未加載。 – 2013-04-11 12:50:49

回答

0

這些瀏覽器很可能在body在創建script元素後,他們到達第一$之前實際加載jQuery的文件太慢。

爲什麼不在您的文檔的head中的script標籤中聲明它們?

+1

*「那些瀏覽器可能太慢了」*:它與瀏覽器速度無關。即使腳本會立即加載,它們也不會被評估,直到當前的腳本執行結束。 JavaScript是單線程的,引擎不會停止當前正在運行的執行(以執行其他代碼)。 – 2013-04-11 12:54:51

+0

@FelixKling Well OP報告說它可以在其他瀏覽器中使用。也許你對'評估'的評論在不同的實現之間是不同的 - 事實上,所有需要的是當JS函數被調用時它們是可用的嗎? – 2013-04-11 12:56:28

+0

我不知道。我無法想象這個代碼如何在任何瀏覽器中工作,除非jQuery以任何其他方式(事先)包含在其中,出於某種原因,它在IE和Safari中失敗。 – 2013-04-11 12:58:24

0

您將您的腳本添加到文檔主體(它們應該真的在頭部),但不要等待它們下載並執行之前訪問jQuery $(document).ready(...),所以我期望這至少會失敗一些時間。您需要在不使用jQuery的情況下附加到文檔onready事件。

0

單獨的進口jquery的例子

<script src="http://www.---.com/include/jquery-1.8.3.min.js"> </ script> 
+0

在製作任何代碼之前導入jquery – 2013-04-11 12:58:12

2

你既然是動態添加JS庫文件,你會需要一個回調函數的腳本,以初始化加載bxSlider後。理想情況下,回調應在bxSlider加載後調用。

element.setAttribute("type","text/javascript"); 
element.onload = callBackFunction; 
document.body.appendChild(element); 

var callBackFunction() { 
      $('#mainslide .bxslider').bxSlider({ 
       slideWidth: '960', 
       mode: 'vertical', 
       speed: '500', 
       captions: false, 
       pager: false, 
       controls: false, 
       nextText: 'Next', 
       prevText: 'Prev', 
       auto: true, 
       autoHover: true, 
       pause: 3000 
      }); 
} 
+0

我不認爲腳本必須按順序加載。您必須監聽每個腳本,並在所有腳本都加載後運行回調。 – 2013-04-11 13:01:22

+0

非常感謝您的回答Mahesh,我會盡力使您的代碼適應我的需求 – 2013-04-11 19:29:50

0

將函數從document.ready()中取出並添加到jQuery.js文件的末尾。這樣它只會在jQuery加載後運行。

相關問題