2011-05-18 90 views
1

我遇到類似問題this guy,除了我的問題與腳本有關而不是圖像。

我使用$.getScript()$(window).load()的組合來動態加載JavaScript,並使用腳本加載完成後正在加載的函數。

它在Chrome中運行良好,但Safari似乎總是過早地觸發onload事件。我想知道是否有某種方法可以強制Safari等待所有腳本的加載類似於document.body.offsetWidth塊。根據我的理解(以及我在測試時看到的結果),document.body.offsetWidth會阻塞,直到樣式和圖像加載,但顯然不是腳本。

編輯:它可能值得一提,它確實有時在Safari中工作,但我沒有看到一個模式。有時事件在腳本完全加載並執行之前觸發,並且處理程序通過$(window).load()失敗,因爲函數缺失。

+0

爲什麼你不能在'.getScript()'中使用'success'處理程序?一旦腳本完成加載,這將運行。 – 2011-05-18 18:12:11

+0

我想這裏真正的問題是爲什麼你動態加載所需的腳本。 – 2011-05-18 18:13:08

+0

@Kevin Peno:我需要其餘的腳本來加載,而不僅僅是一個腳本。有幾個腳本正在加載。根據它們的功能,它們全部被分成自己的腳本。 – alexcoco 2011-05-18 18:16:53

回答

1

根據您所提出的意見,特別是那些依賴周圍,我會用一個庫像RequireJS。這將爲您提供您需要導入腳本及其依賴項的方法,並且還可以在滿足依賴關係時調用函數和代碼。

+0

謝謝,我也在某個時間看着Namespace.js。我也會看看這個,並與同事一起評估。我會盡快回復你。 – alexcoco 2011-05-18 20:57:20

+0

這很可能會起作用,但我認爲我無法在工作中獲得批准。我仍然將其標記爲正確,因爲這是迄今爲止我遇到的最好的解決方案。我還應該提及[LABjs](http://labjs.com/),因爲它看起來像另一個體面的解決方案。謝謝你的幫助。 – alexcoco 2011-05-24 11:49:34

0

您是否嘗試過準備好舊文檔?

$(document).ready(function() { 
    //code here 
}) 

我從來沒有使用過任何問題。在最壞的情況下,您可以在包含您所需的代碼的所有其他腳本標記之後放置腳本標記。

+0

這不會幫助,我不認爲,因爲問題在於「就緒」機制不知道要等待動態加載的腳本。 – Pointy 2011-05-18 18:09:52

+0

這是行不通的,因爲'$(document).ready()'把一個處理程序綁定到DOM準備完成之後但在腳本/圖像/ css準備好之前觸發的DOMContentLoaded事件。就像我所說的,我的代碼每次都在Chrome中運行。 – alexcoco 2011-05-18 18:12:48

0

在這個例子中,我告訴加載的腳本,我需要做一些事情來報告加載到一個函數。一旦我需要的所有東西都加載完畢,我就可以運行任何我需要的代碼。

// Simplified callback to check for all scrips loaded. 
var numDynScriptsReady = 0, 
    numDynScriptsNeeded = 4; 

function dynScriptsReady() 
{ 
    numDynScriptsReady++; 

    if(numDynScriptsLoaded == numDynScriptsNeeded) 
    { 
     // Run functions you need after loaded.... 
    } 
} 

// Example script get 
$.getScript("http://example.com/script.js", dynScriptsReady); 
// etc.... 
+0

這很有趣,但這意味着我每次編寫處理程序/添加另一個導入時都必須計算腳本的數量。主要問題是我將有一個腳本來執行非常具體的操作,而腳本將依次在其內部導入自己的依賴關係。所以在導入的腳本中有導入,並且在需要對它們進行計數時使事情複雜化。 – alexcoco 2011-05-18 18:36:38

+0

@alexcoco,那麼請擴展它。您可以使用'.data'來存儲特定'腳本'的依賴項數量,類似於全局'var'。您可以在新添加的腳本元素上使用該函數作爲'$ .bind',然後使用$ .trigger作爲該特定'$ .getScript'的'success'回調。作爲一名實習生,我希望你能搞清楚它是否有趣! – 2011-05-18 18:42:27

+0

存儲值並不是問題所在。問題是知道需要導入多少個腳本。如果我必須每次都要計算它們,那麼我不妨將所有內容存儲在一個大文件中。 – alexcoco 2011-05-18 18:54:28

相關問題