2011-08-24 65 views
1

我有一個頁面,我正在使用jquery/ajax從另一個組件中拉下一大塊HTML/JS並將它注入到頁面中。該HTML引用額外的JS文件,並且我需要那些被引用的JS文件在我運行我的JavaScript之前加載。遠程JavaScript加載後執行本地Javascript?

正被注入的HTML/JS看起來是這樣的:

<script type="text/javascript" src="http://myserver/js/ABunchOfStuff.js"></script> 
<div> 
    blah blah blah 
</div> 
<script type="text/javascript"> 
    //"sourceList" is defined in the ABunchOfStuff.js above, but it's not available by the time this executes. 
    $("input#autocomplete").autocomplete({ 
     source: sourceList, 
     minLength: 2 
    }); 
</script> 

通常我會只是掛鉤到一個窗口加載事件或$(文件)。就緒()或什麼,但在這如果窗口和文檔已經完全加載,現在我們會在事實之後添加更多內容。

有一種可能性是將一個遞歸setTimeout調用放到引用的javascript可用,但這很醜陋。

那麼是否有任何干淨的方式來捕獲引用的JavaScript事件已被加載,並在當時執行代碼?

感謝

+0

你確定嗎?你擁有它的方式,直到'ABunchOfStuff.js'被下載並可用,甚至'div'都不會被渲染。 – Mrchief

+0

你有沒有嘗試把代碼放在'$(function(){});'?所以它只在DOM準備好時才執行? http://api.jquery.com/ready/ –

回答

4

您還可以使用getScript,並在成功回調做你autoComplete

jQuery.getScript('http://myserver/js/ABunchOfStuff.js', function(data, textStatus) { 
     $("input#autocomplete").autocomplete({ 
      source: sourceList, 
      minLength: 2 
     }); 
}); 
+0

非常感謝,謝謝! –

0

最大的問題是,如何你注入這個腳本?

如果使用「標準」腳本標記插入,則可以去看看onload事件(IE中的onreadystatechange)。

var scr = document.createElement('script'); 
    scr.type = 'text/javascript'; 
    scr.src = 'somewhere/somename.js'; 
    scr.onload = scr.onreadystatechange = function() { 
     if(/complete|loaded/.test(scr.readyState)) { 
      // do something 
     } 
     else { 
      // do something 
     } 
    }; 
+0

我正在使用JQuery來執行$ .post調用來檢索內容,然後.html()方法將HTML和JS放入容器div –

0

你在做什麼錯在這裏沒有等待DOM加載。

如果您改變.autocomplete只執行一次的DOM加載通過$(document).ready將已經執行了ABunchOfStuff.js

像這樣:如果你控制http://myserver/js/ABunchOfStuff.js文件

(function($) { 
    $(document).ready(function() { 
    $("input#autocomplete").autocomplete({ 
     source: sourceList, 
     minLength: 2 
    }); 
    } 
}(jQuery)); 
+0

在我的情況下,DOM已經加載。在頁面加載完成後,這些內容將被很好地添加到頁面中,因此document.ready事件早已消失。 –

+0

那麼爲什麼你的外部JavaScript沒有執行?一旦dom準備就緒,JavaScript就已經被執行了。 – Tigraine

0

然後,你可以在第一次執行時調用你的其他JS。由於它在首次加載時以及可用時執行,因此您擁有完美的時間。

如果這個JS文件用於其他地方也一樣,當它執行加入這樣的事情吧,你可以添加一些通用的功能,它調用回調:

try { 
    if (aBunchOfStuffCallbacks) { 
     for (var i = 0; i < aBunchOfStuffCallbacks.length; i++) { 
      aBunchOfStuffCallbacks[i].call(this); // call callback to announce we're loaded 
     } 
    } catch(e) {} 

而且,當時在任何網絡您想aBunchOfStuffCallbacks加載時調用頁面,你只需做到這一點:

var aBunchOfStuffCallbacks = []; 
aBunchOfStuffCallbacks.push(myFunc); 
function myFunc() { 
    // put my code here for when aBunchOfStuffCallbacks is loaded 
} 

這將允許多個回調。只是一個回調的簡單的版本是這樣的:

try { 
    if (aBunchOfStuffCallback) { 
      aBunchOfStuffCallback.call(this); // call callback to announce we're loaded 
     } 
    } catch(e) {} 

而且,它是這樣設置的:

var aBunchOfStuffCallbacks = function() { 
    // put my code here for when aBunchOfStuffCallbacks is loaded 
} 
+0

我控制它,但它是一個包含文件,其中包含幾個不同頁面使用的一些常用功能。我不想將任何特定於頁面的邏輯刻錄到通用包含文件中 –

+0

您可以讓它查找全局回調變量並僅在該全局變量存在時調用該回調。然後你會添加更多的通用功能到包含的JS文件中,在需要時可以使用它,並且在不需要時不會執行任何操作。查看我添加到我的答案的細節。 – jfriend00