2017-04-14 2 views
2

ich die folgende Funktion verwenden dynamisch JavaScript laden:Alarm oder console.log nicht von dynamisch arbeit geladen 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); 
} 

Unten finden Sie eine der Funktionen innerhalb einer dynamisch hinzugefügt Datei enthalten:

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); 
} 

Ich weiß, dass die JavaScript-Datei korrekt hinzugefügt wird und die Funktion ausgeführt wird, da ein option zum select Element hinzugefügt wird. Warum werden die alert und console.log nicht ausgeführt? Wenn ich auf inspizieren klicke, dann gibt es keine Fehlermeldungen.

EDIT

Dies ist der Code verwende ich die Funktion aufzurufen:

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); 
} 

Ich wollte es nicht ursprünglich enthalten, weil ich es schon wusste arbeitete, und es wird nicht klar, wie Es funktioniert, wenn man bedenkt, dass dynamische Daten verwendet werden.

Auch habe ich die loadJS Funktion bearbeitet:

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); 
} 

Das Problem scheint nun gelöst werden.

+0

wird nicht angezeigt wo 'formelements_SELECT_add()' aufgerufen wird – charlietfl

+0

Der Funktionsname wird dynamisch generiert. Ich habe diesen Code nicht aufgenommen, weil es nicht wirklich relevant ist, wenn man bedenkt, dass die Funktion bereits aufgerufen wurde. –

+1

Wenn diese Funktion aufgerufen würde, würden Sie definitiv "console.log" und "alert" sehen. Wenn nicht, wird diese Funktion nicht aufgerufen. Wenn Sie eine Option sehen, wird sie von dieser Funktion nicht hinzugefügt. –

Antwort

3

Drei Dinge herausspringen:

  1. Sie das Skript auf der Seite zweimal anhängen, einmal document.body, und die anderen document.getElementsByTagName("head")[0]. Die zweite wird bewegen das Skript von der ersten Stelle auf die zweite. Du musst wirklich nur einen von denen machen.

  2. Sie suchen die load Veranstaltung nach das Element anfügen. Wenn sich das Skript im Cache befindet, können Sie das Ereignis verpassen. Haken Sie es vor das Skript an das DOM anhängen.

  3. Sie tun nichts im zitierten Code, um die Funktion aufzurufen, die durch das Skript definiert wird, das Sie hinzufügen.


Andere Nebennoten:

  • Keine Notwendigkeit type zu setzen, der Standard ist JavaScript.
  • Keine Notwendigkeit async, alle dynamisch eingefügten script Elemente sind async (now, es war nicht immer wahr).
  • Wie Jarosław Wlazło points outdocument.alert ist keine Funktion; nur alert ist alles was Sie brauchen. :-)
+0

Ich habe 'document.body.appendChild (jsEl);' auskommentiert, und nun werden 'alert' und 'console.log' wie erwartet ausgeführt. Was meinst du mit "Haken vor dem Anhängen des Drehbuchs an das Dom"? –

+1

@DanBray: Stellen Sie sicher, dass der 'addEventListener (" load ", ...' ausgeführt wird * vor * Sie 'jsEl' überall anfügen. –

+1

Darüber hinaus ist die Eigenschaft type des' src' Attributs in der Regel ungültig. Wenn nicht presented es fällt zurück zu 'text/javascript' und nicht' application/javascript'. – sshow

1

Zusätzlich: document hat keine alert Methode.Es gehört zu window, so können Sie es wie folgt nennen alert('add');

+0

tat ich. Ich habe später einfach andere Dinge ausprobiert, wenn es nicht funktionierte. –

Verwandte Themen