2013-10-04 54 views
0

我對Chrome擴展程序很感興趣。我也需要檢查一個URL是否在線。該URL向我返回一個變量,所以如果var爲true,則該URL處於聯機狀態。使用Javascript:創建腳本不起作用

如果URL處於脫機狀態,則該錯誤需要大約2秒鐘,因此擴展彈出窗口需要2秒才能啓動EVERYtime。

這是我的 「舊」 版本:

popup.html:

<script language="javascript" src="http://example.org/jdcheck.js"></script> 
<script language="javascript" src="popup.js"></script> 

popup.js:

if (variable) { [...] } 

好了,工作 - 2秒後。

現在我有了一個想法,所以我刪除了popup.html中的scriptlink。 這是我的新popup.js:

background.$(document).ready(function() { 


     var jq = document.createElement('script'); jq.type = 'text/javascript'; 
     jq.src = 'http://127.0.0.1:9666/jdcheck.js'; 
     document.getElementsByTagName('head')[0].appendChild(jq); 

    if(jdownloader){ 
     [...action] 
    } 
}); 

你看,我使用jQuery加載Checkfile。現在

,它將引發我一個錯誤:

Uncaught ReferenceError: jdownloader is not defined 

嗯,它看起來像的createElement沒有工作。 我100%確定URL給了我想要的變量。

你能幫我嗎?我不知道如何解決這個問題..

謝謝! 馬庫斯


編輯:我刪除了jQuery的部分,增加了keepGoing和jq.onload:

function keepGoing() { 

     console.log("JS should have been loaded"); 

     if(jdownloader){ 

     [action] 
     } 
    } 

     var jq = document.createElement('script'); 
     jq.onload = keepGoing(); 
     jq.src = 'http://127.0.0.1:9666/jdcheck.js'; 
     document.getElementsByTagName('head')[0].appendChild(jq); 

現在,控制檯使我這個:

JS should have been loaded popup.js:98 
Uncaught ReferenceError: jdownloader is not defined popup.js:100 

所以它看起來像jdownloader var不會傳遞給popup.js。 爲什麼?爲什麼?!我不知道。

馬庫斯

+0

您需要等待外部腳本加載,然後才能從中訪問變量/函數。使用'jq.onload = function(){//腳本已經被加載,jdownloader應該在那裏}' – devnull69

+0

什麼是「jdownloader」?它沒有被定義爲var(至少在你的代碼片段中)?什麼是「背景」? – mrak

+0

@mrak:非常確定'jdownloader'是由正在加載的腳本創建的...... –

回答

2

當您添加腳本標籤到DOM,代碼不等待瀏覽器,然後再繼續下載和評估腳本。

所以你必須檢查回來。在Chrome中,您可以使用script元素上的load事件。

background.$(document).ready(function() { 

    var jq = document.createElement('script'); jq.type = 'text/javascript'; 
    jq.onload = keepGoing; // Or an anonymous inline function if you prefer 
    jq.src = 'http://127.0.0.1:9666/jdcheck.js'; 
    document.getElementsByTagName('head')[0].appendChild(jq); 

    function keepGoing() { 
     if(jdownloader)... 
    } 
}); 

( 「在Chrome」,因爲在舊版本的IE,script不火的load事件,它發射readystatechange。)


旁註:你沒有提供type屬性如果是text/javascript。那是,而且一直是,默認。

+0

我是否使用jq.onload調用函數?另外我可以在這裏刪除jQuery部分,儘管在加載js文件之前keepGoing不應該加載。那就對了?因爲如果我嘗試它,它仍然會給我錯誤。 – wernersbacher

+0

@wernersbacher:'jq.onload'設置了一個函數,當腳本被加載時會被調用。 –

+0

我編輯了主帖,如果你有時間,只要看看 - 那會很好。謝謝! – wernersbacher

0

解決方案可能相當簡單,至少對於您的問題的編輯部分。 看到我的jsfiddle以供參考:http://jsfiddle.net/6kkC4/1/

jq.onload = keepGoing(); jq.onload = keepGoing;

呼叫 「的onLoad()」 將立即評估功能(所以沒有onload事件)。 通過jq.onload = keepGoing;只傳遞給函數的參考文件是 ,函數是onload函數。

+1

是的,它現在適用於此,T.J. Crowder在他的評論中告訴我這一點 - 但非常感謝你的努力。馬庫斯 – wernersbacher