2017-04-14 59 views
2

我用下面的函數來動態地加載的JavaScript:警報或CONSOLE.LOG不從動態工作負載的JavaScript

function loadJS(file, c) 
{ 
    var jsEl = document.createElement("script"); 
    jsEl.type = "application/javascript"; 
    jsEl.src = file; 
    jsEl.async = false; 
    document.body.appendChild(jsEl); 
    if (c) { jsEl.addEventListener('load', function (e) { c(null, e); }, false); } 
    document.getElementsByTagName("head")[0].appendChild(jsEl); 
} 

下面是包含在動態添加文件中的功能中的一個:

function formelements_SELECT_add(x) 
{ 
    console.log("add"); 
    alert("add"); 
    var id = x[1]; 
    var value = x[2]; 
    var index = x[3]; 
    var select = document.getElementById(id); 
    var option; 
    option = document.createElement("option"); 
    option.text = value; 
    select.add(option, index); 
} 

我知道JavaScript文件被正確添加並且函數被執行,因爲option被添加到select元素。爲什麼alertconsole.log不能執行?如果我點擊檢查,那麼沒有錯誤消息。

編輯

這是我用來調用函數的代碼:

var typeAndElement = x[0][0] + "_" + x[0][1]; 
start = i + 1; 
if (!window[typeAndElement]) 
{ 
    loadJS("https://websemantica.org/scripts/" + x[0][0] + "/" + x[0][1] + ".js", continueManipulatingElements(typeAndElement, actions, x, start, total)); 
    return; 
} 
else 
{ 
    fn = window[typeAndElement + "_" + x[0][2]]; 
    if (typeof fn === 'function') 
     fn(x); 
} 

我不想最初包括它,因爲我已經知道這是工作,這將是不清楚如何它認爲它正在使用動態數據。

另外,我還編輯了loadJS功能:

function loadJS(file, c) 
{ 
    var jsEl = document.createElement("script"); 
    jsEl.type = "text/javascript"; 
    jsEl.src = file; 
    jsEl.async = false; 
    if (c) { jsEl.addEventListener('load', function (e) { c(null, e); }, false); } 
    document.getElementsByTagName("head")[0].appendChild(jsEl); 
} 

這個問題似乎現在要解決。

+0

不顯示調用'formelements_SELECT_add()'的位置 – charlietfl

+0

函數名稱是動態生成的。我沒有包含該代碼,因爲考慮到它並不真正相關,我已經確認函數被調用。 –

+1

如果這個函數被調用,你肯定會看到'console.log'和'alert'。如果你不是,那個函數沒有被調用。如果你看到一個選項,它不會被該功能添加。 –

回答

3

三件事跳出:

  1. 要追加腳本的頁面兩次,一次document.body,和對方document.getElementsByTagName("head")[0]。第二個將移動腳本從第一位到第二位。你真的只需要做其中的一個。

  2. 你正在尋找load事件追加元素。如果腳本在緩存中,則可能錯過該事件。掛鉤它之前將腳本附加到DOM。

  3. 您在引用的代碼中沒有做任何事情來調用您添加的腳本定義的函數。


其他旁註:

  • 無需設置type,默認是JavaScript的。
  • 無需設置async,所有動態插入script元素是異步(now,它並非總是如此)。
  • 由於Jarosław Wlazło points outdocument.alert不是函數;只需要alert即可。 :-)
+0

我已經註釋掉了'document.body.appendChild(jsEl);'現在,'alert'和'console.log'按預期執行。在將腳本附加到dom之前掛鉤它意味着什麼? –

+1

@DanBray:確保'addEventListener(「load」,...'在你追加'jsEl'之前運行* –

+1

此外,src屬性的type屬性通常是無效的,如果它不是目前它回落到'text/javascript'而不是'application/javascript'。 – sshow

1

另外:document沒有alert方法。它屬於window,所以你可以這樣稱呼它:alert('add');

+0

我做到了。我後來在不工作時嘗試了其他的東西。 –