2016-08-05 25 views
-2

Ich verwende JavaScript, um eine HTML-Seite mit Inhalten zu füllen. Einer dieser Inhalte ist ein Button/Link. Der Inhalt wird dynamisch generiert, und wenn der Benutzer die Schaltfläche drückt, muss ich einige Informationen erfassen, die (als Attribut) in die Schaltfläche eingebettet wurden.Was ist die Ursache für diesen Fehler, den ich bekommen habe?

Hier ist der allgemeine Code:

var newCell = newRow.insertCell(); 
var button = document.createElement("input"); 
button.type = "image"; 
button.src = "/images/image.png"; 
button.setAttribute("customData", "dynamically generated data"); 
button.setAttribute("onclick", "CustomFunction(this);"); 
newCell.appendChild(button); 


CustomFunction(obj) { 
     var data = obj.getAttribute("customData")); 
}; 

Als ich in die Funktion erhalten (durch Drücken der Taste), der Browser einen Fehler nach dem Vorbild der cannot getAttribute of null object wirft.

Aber es scheint zu funktionieren, wenn ich button.src los werde.

Ich habe bereits einen Weg gefunden, aber ich würde gerne wissen, was dieses Problem verursacht?

EDIT: Hier ist der eigentliche Code:

var newCell = newRow.insertCell(); 
var button = document.createElement("input"); 
button.type = "image"; 
button.src = "/images/image.png"; 
button.setAttribute("customData", "dynamically generated data (JSON format)"); 
button.setAttribute("onclick", "CustomFunction(this);"); 
newCell.appendChild(button); 

function CustomFunction(obj) { 
    buttonObj = obj.querySelector('input[type=image][customData]'); 
    var dataObj = JSON.parse(buttonObj.getAttribute("customData")); 
}; 
+2

Ich würde mit dem Drucken der Argumente beginnen. Also, die erste Zeile der Funktion sagt: 'console.log (Argumente);', um zu sehen, was verfügbar ist. – Fallenreaper

+2

Die Zeile 'var data = obj.getAttribute (" customData "));' ist syntaktisch falsch. – Xufox

+0

Ihr Code [funktioniert gut] (https://jsfiddle.net/bdzd11w5/) nachdem die Syntaxfehler behoben sind und das Beispiel abgeschlossen ist. Sie müssen ein funktionierendes Beispiel veröffentlichen, wenn wir erklären wollen, was schiefgelaufen ist, einschließlich der Implementierungen, die dieses Verhalten ergeben. –

Antwort

2

Das Problem ist diese Linie:

buttonObj = obj.querySelector('input[type=image][customData]'); 

querySelector sucht die Nachkommen des gegebenen Elements für ein Element, das die Wähler übereinstimmt. Aber das Element, nach dem Sie suchen, ist dasselbe wie obj, nicht eines seiner Nachkommen.

Ihr Code funktioniert, wenn Sie den Click-Handler auf die Zelle und nicht auf die Schaltfläche setzen.

newCell.setAttribute("onclick", "CustomFunction(this);"); 

oder

newCell.addEventListener("click", function() {CustomFunction(this);}); 

Oder Sie können einfach buttonObj das Argument CustomFunction() machen, statt querySelector() zu verwenden.