3 回答

TA貢獻(xiàn)1966條經(jīng)驗 獲得超4個贊
我沒有方便的參考,但是腳本標(biāo)記是按順序處理的,因此,如果將您$(document).ready(function1)的腳本標(biāo)記放在定義function1等的腳本標(biāo)記之后,您應(yīng)該會很高興。
<script type='text/javascript' src='...'></script>
<script type='text/javascript' src='...'></script>
<script type='text/javascript'>
$(document).ready(function1);
</script>
當(dāng)然,另一種方法是通過在構(gòu)建過程中合并文件來確保總共只使用一個腳本標(biāo)簽。(除非您要從某個地方的CDN加載其他文件。)這也將有助于提高頁面的感知速度。
編輯:只是意識到我并沒有真正回答您的問題:我不認(rèn)為有一個跨瀏覽器事件被解雇,不。 如果您足夠努力的話,請參見下文。您可以測試符號并使用setTimeout重新安排:
<script type='text/javascript'>
function fireWhenReady() {
if (typeof function1 != 'undefined') {
function1();
}
else {
setTimeout(fireWhenReady, 100);
}
}
$(document).ready(fireWhenReady);
</script>
...但是如果您正確設(shè)置了腳本標(biāo)簽的順序,則不必這樣做。
更新:您可以script根據(jù)需要動態(tài)獲取添加到頁面中的元素的加載通知。要獲得廣泛的瀏覽器支持,您必須做兩件事情,但是作為一種組合技術(shù),它可以起作用:
function loadScript(path, callback) {
var done = false;
var scr = document.createElement('script');
scr.onload = handleLoad;
scr.onreadystatechange = handleReadyStateChange;
scr.onerror = handleError;
scr.src = path;
document.body.appendChild(scr);
function handleLoad() {
if (!done) {
done = true;
callback(path, "ok");
}
}
function handleReadyStateChange() {
var state;
if (!done) {
state = scr.readyState;
if (state === "complete") {
handleLoad();
}
}
}
function handleError() {
if (!done) {
done = true;
callback(path, "error");
}
}
}
以我的經(jīng)驗,錯誤通知(onerror)并非100%跨瀏覽器可靠。另請注意,某些瀏覽器會同時使用這兩種機(jī)制,因此請使用done變量以避免重復(fù)的通知。

TA貢獻(xiàn)1998條經(jīng)驗 獲得超6個贊
當(dāng)他們說“頁面底部”時,它們并不是字面上的底部:它們是指在結(jié)束</body>
標(biāo)記之前。將您的腳本放在此處,它們將在DOMReady事件之前加載;然后放置它們,并且DOM在加載之前就已經(jīng)準(zhǔn)備就緒(因為</html>
解析結(jié)束標(biāo)記時已完成),您發(fā)現(xiàn)這將無法工作。
如果您想知道我的意思是什么:我曾在Yahoo!工作過。然后將腳本放在</body>
標(biāo)記之前:-)
編輯:另外,請參閱TJ Crowder的回復(fù),并確保您按正確的順序放置東西。

TA貢獻(xiàn)1853條經(jīng)驗 獲得超9個贊
除了@TJ Crowder的答案之外,我還添加了一個遞歸外部循環(huán),該循環(huán)允許循環(huán)訪問數(shù)組中的所有腳本,然后在加載所有腳本后執(zhí)行一個函數(shù):
loadList([array of scripts], 0, function(){// do your post-scriptload stuff})
function loadList(list, i, callback)
{
{
loadScript(list[i], function()
{
if(i < list.length-1)
{
loadList(list, i+1, callback);
}
else
{
callback();
}
})
}
}
當(dāng)然,如果您愿意,可以制作一個包裝來擺脫“ 0”:
function prettyLoadList(list, callback)
{
loadList(list, 0, callback);
}
不錯的工作@TJ Crowder-我很想在其他線程中看到的“只是在運行回調(diào)之前增加幾秒鐘的延遲”。
添加回答
舉報