Ich habe versucht, einige meiner Java-Objekte in mein dynamisches Dokument durch die Verwendung von JQuery (1.7.1 oder 2.2.3) zu integrieren. Dazu habe ich die JQuery-Funktion .extend()
verwendet, um ein einfaches JQuery-Objekt zu ergänzen, das ich dann an mein Dokument angehängt habe.JQuery .extend() und Javascript-Klasse
Ich denke, es ist etwas falsch in meiner Herangehensweise (die ich korrigierte wie am Ende der Frage dargestellt), aber ich habe ein irreführendes Verhalten gefunden, das ich nicht erklären konnte und meinen Code teilweise funktionieren ließ, als ich dachte total arbeiten oder gar nicht.
Der allgemeine Zweck meines Codes ist es, ein "Knopf" -Element (in einem <div>
Abschnitt) im Code hinzuzufügen, um eine bestimmte Behandlung anzuwenden, wenn dieses Element angeklickt wird, sowie eine andere Behandlung darauf. Grundsätzlich möchte ich, dass sich mein "Button" JQuery-Objekt wie das Button
JavaScript-Objekt/die Klasse verhält, die ich erstellt habe (wie ich es bei einem objektorientierten Ansatz erwarten würde).
Hier ist der vereinfachte Code für das Button
Objekt:
function Button(myState)
{
this.setState(myState);
}
Button.prototype.printState = function()
{
console.log(this.state);
}
Button.prototype.setState = function(myState)
{
this.state = myState;
}
Hier ist die JQuery + Knopf Basiscode, der das Objekt erstellt:
// Create a "JQuery+Button" object
function createButton()
{
var result = $("<a href='#' id='button'></a>");
result.extend(new Button(false)); // Can also be done with result = $.extend(result, new Button(false));
result.append("clickable button"); // A dummy button text, see below
result.printState(); // OK: print "false"
return result;
}
Und hier ist die "Schaffung + action" Teil des Codes:
function associateButtons()
{
var myButton = createButton();
// Add an action on click => Works "as excepted" => print the state when the button will be clicked
myButton.on("click", myButton, function(event) {
console.log("click inner HTML:" + event.data.html()); // OK: print the JQuery associated HTML
event.data.printState(); // OK: call the associated function
});
$("#buttons_container").append(myButton); // Add the button to the page at the specified place
$("#buttons_container").append(myButton.clone()); // Add the same button a second time, but won't have the "onclick" bind
// Do an action no each button => Does not work! => The function is undefined
$("#buttons_container #button").each(function(index,element) {
console.log("each inner HTML:" + $(element).html()); // OK: print the JQuery associated HTML, same as above ; also works with $(this)
$(element).printState(); // FAIL: "TypeError: undefined is not a function"
});
}
Nun führen Sie den Test:
associateButtons();
Also fragte ich mich, warum funktioniert die "Ereignis" -Methode, während die "Each" -Methode nicht funktioniert? Ich bin zweifelhaft in Bezug auf den Typ des Elements, das vom Event-Manager übergeben wird (eindeutig ein Objekt, das ein JQuery + Button-Objekt durch die Struktur event.data
einkapselt), das sich von dem Element unterscheidet, das von "jedem Manager" übergeben wird (was nicht der JQuery ist) + Button-Objekt, aber ein "einfaches" JQuery-Objekt).
Ich habe es geschafft, Abhilfe zu finden, aber die Schaltfläche in der JQuery Einkapseln durch die Funktion .data()
angefügt:
// Create a "JQuery+Button" object
function createButton()
{
var result = $("<a href='#' id='button'></a>");
result.data("button", new Button(false));
result.append("clickable button"); // A dummy button text, see below
result.data("button").printState(); // OK: print "false"
return result;
}
Und im Falle (event.data.data("button")
) und dem „jeder“ ($(element).data("button")
) mit dem Objekt arbeiten das funktioniert gut.
Allerdings ist es nicht so "objektorientiert", wie ich es gerne durch die Definition meines idealen "JQuery + Button" -Objekts hätte.
Gibt es einen Weg, um es zu erreichen, vermisse ich etwas in der "jeder" Behandlung?
Vielen Dank im Voraus;)
Danke für Ihre Antwort und den Link! 1) Meine schlechten, natürlich IDs müssen nach dem Standard einzigartig sein. 2) Ja. Allerdings würde ich erwarten, dass die Operation ** überhaupt nicht funktioniert ** oder ** komplett funktioniert **. Es funktioniert jedoch für das Ereignis "click" (über die Instanz event.data) und * funktioniert nicht * beim Durchqueren der Struktur. Ich vermute, dass das erstellte Ereignisobjekt von der JQuery-Lib und irgendwo das 'JQuery + Button'-Objekt verfolgt wurde, so dass es verwendbar ist, wenn das Ereignis ausgelöst wird. Also muss es einen Weg geben, dieses 'JQuery + Button' obj zu bekommen. Irgendwo anders. –
Ich habe mehr Erklärung hinzugefügt. Ich hoffe, es würde dir helfen, besser zu verstehen. – laruiss
Danke für deine Antwort, es ist jetzt viel klarer;) –