2010-11-08 4 views
3

Я загружаю скрипты и стили динамически из javascript, например, this.Как заставить браузер ждать загрузки ресурсов?

Проблема в том, что браузер не дождался загрузки сценария.

рассмотреть у меня есть функция с именем functionToBeCalled() внутри файла сценария с именем сценария file.js

У меня есть функция для загрузки файла сценария.

<script type="text/javascript"> 
    var listOfJavaScriptsLoaded = new Array(); 

    function LoadScriptFile(scriptUrl){ 
     var isScriptLoaded = false; 
     var i = 0; 
     for(i = 0; i < listOfJavaScriptsLoaded.length; i ++){ 
     if(listOfJavaScriptsLoaded[i] == scriptUrl){ 
      isScriptLoaded = true; 
      break; 
     } 
     } 
    if(isScriptLoaded == false){   
    var headTag= document.getElementsByTagName('head')[0];  
    var scriptTag= document.createElement('script'); 
    scriptTag.type= 'text/javascript'; 
    scriptTag.src= scriptUrl; 
    headTag.appendChild(scriptTag); 
    listOfJavaScriptsLoaded.push(scriptUrl); 
    } 
    } 
    LoadScriptFile("script-file.js"); 
    functionToBeCalled(); 
</script> 

В настоящее время происходит то, что браузер не дожидается загрузки тега сценария и переходит к следующей команде. Я получаю ошибку «undefined functionToBeCalled()». это естественно. Но дело в том, что когда я проверяю в firebug, тег скрипта был сформирован и файл загружен.

Как я могу заставить браузер приостановить загрузку и возобновить работу после того, как актив был загружен?

Edit1: Эта проблема возникает только тогда, когда я загрузить страницу в AJAX, а не в нормальных нагрузках страниц

Edit2: Или есть возможность прочитать сценарий/CSS файл яваскрипт и написать он непосредственно в разметке в тегах сценариев

Если я использую window.stop(), загрузка полностью прекращается. как я могу заставить его возобновить работу с той же строки?

Или можно ли считать, что загрузка по-прежнему происходит, и сбросить ее в событии onload?

+1

Зачем загружать их таким образом, в первую очередь?Разве это абсолютно не вариант, чтобы поместить их прямо в главный тег или записать '

3

Вы можете иметь конкретные причины, чтобы загрузить сценарий динамически, но представить вариант, если вы выписывать элемент сценария в HTML-вывода, как так :

<script src="script-file.js"></script> 
<script>functionToBeCalled();</script> 

браузер прекратит разбор, пока этот сценарий не будет загружен и не будет интерпретирован.

Это также действительный in the BODY.

2

Ознакомьтесь с LABjs (http://labjs.com/) от Getify Solutions. LABjs позволяет загружать скриптовые скрипты одновременно, но запускаться по порядку.

+0

не так ли происходит с jQuery? – ZX12R

+0

В соответствии с документацией labjs есть что-то несовместимое с jQuery 1.3, но не с 1.4 – Alohci

+0

выглядит очень хорошим вариантом, за исключением того факта, что многие из подключаемых модулей еще не начали поддержку 1.4 еще. :( – ZX12R

0

Я бы рекомендовал посмотреть на Cuzillion. Это позволит вам поэкспериментировать с вызовами и разными способами, чтобы увидеть, как они реагируют в браузере.

Это должно ответить на ваш вопрос. Просто выполните его, прежде чем ваша страница будет сделана, загрузив body.

<script type="text/javascript"> 
    var loadScriptFile = (function(){ 
     var listOfJavaScriptsLoaded = []; 

     return function(scriptUrl){ 
      var isScriptLoaded = false; 
      for(var i = 0; i < listOfJavaScriptsLoaded.length; i ++){ 
       if(listOfJavaScriptsLoaded[i] == scriptUrl){ 
        isScriptLoaded = true; 
        break; 
       } 
      } 
      if(!isScriptLoaded){ 
       document.write('<scr' + 'ipt type="text/javascript" src="' + scriptUrl + '"></scr' + 'ipt>'); 
      } 
     }; 
    }()); 
    loadScriptFile("script-file.js"); 
    functionToBeCalled(); 
</script> 
+0

моя проблема в том, когда я загружаю страницу через ajax ... она отлично работает в противном случае ... – ZX12R

Смежные вопросы