Dies ist ein seltsames Verhalten, da die Schaltfläche den Dialog in jsFiddle ordnungsgemäß schließt, aber nicht den Dialog in meinem Projekt.
Nur aus Neugier, warum verwenden Sie selector.bind anstelle von selector.click?
– eugenK
15. Juni 2011 um 7:53 Uhr
Gute Frage. Nur aus Gewohnheit. und wirkt sich das auf die Leistung aus?
– Schahin
15. Juni 2011 um 7:55 Uhr
Ich weiß es nicht genau, aber ich denke, Bindeschleifen durch die Sammlung von Ereignissen für das von Ihnen bereitgestellte Element und dann die gleiche Funktion wie beim Klicken anwenden. Ich wette, es wirkt sich auf die Leistung aus, aber so würde ich dieses Modul schreiben. John Resig und andere in der jQuery-Crew haben vielleicht viel bessere Ideen.
– eugenK
15. Juni 2011 um 7:59 Uhr
@eageneK Ich habe überprüft: $(‘#test’).click(function() { //whatever… }); ist ein Alias für den folgenden Code. $(‘#test’).bind(‘click’, function() { //whatever… });
– Schahin
16. Juni 2011 um 8:41 Uhr
Da dies früh bei der Suche nach der Erstellung eines dynamischen Dialogs in jquery auftaucht, möchte ich auf eine bessere Methode hinweisen, um dies zu tun. Anstatt Ihr Dialog-Div und Ihren Inhalt zum HTML hinzuzufügen und es dann aufzurufen, können Sie dies viel einfacher tun, indem Sie das HTML direkt in ein jquery-Objekt schieben, wie folgt:
$(function () {
$("a:contains('sometext')").click(function() {
var NewDialog = $('<div id="MenuDialog">\
<p>This is your dialog content, which can be multiline and dynamic.</p>\
</div>');
NewDialog.dialog({
modal: true,
title: "title",
show: 'clip',
hide: 'clip',
buttons: [
{text: "Submit", click: function() {doSomething()}},
{text: "Cancel", click: function() {$(this).dialog("close")}}
]
});
return false;
});
});
Ich habe auch gezeigt, wie Sie mehrere Schaltflächen mit Inline-Funktionen platzieren können, anstatt eine live()-Funktion an die Schaltfläche anzuhängen. Ich habe diese Methode an ein paar Stellen verwendet und sie funktioniert großartig für mich. Es unterstützt auch Formulare (ich habe die Daten in doSomething() geholt und über Ajax übermittelt, aber andere Methoden funktionieren auch) usw.
Ich habe versucht, diesen Code größtenteils so zu verwenden, wie er ist, und FireBug zeigt Dialogfelder, die am Ende des Body-Tags im DOM gestapelt sind (einmal für jedes Mal, wenn ich klicke, um das Dialogfeld zu öffnen). Ich denke, für diese Art von dynamischem Dialog möchten Sie vielleicht “destroy” anstelle von “close” verwenden — $(this).dialog(“destroy”)
– eselk
1. Juni 2013 um 5:35 Uhr
Sie sollten wahrscheinlich keine IDs für dynamisch erstellte Inhalte verwenden, da Sie am Ende mehr als ein Element mit derselben ID haben könnten – das heißt document.getElementById (wovon ich annehme, dass Sizzle es für die verwendet #id selector) gibt nur den ersten (möglicherweise nicht sichtbaren) zurück.
Wie wäre es damit: if (Selector.lenght) { //Create Content dynamic }
– Schahin
15. Juni 2011 um 7:47 Uhr
Ich brauchte eine Möglichkeit, einen JSON-Webservice zu verwenden, um Dinge wie Warnungen und Updates auf der Client-Seite zu steuern, ohne dass der Client eine Aktion initiiert. Ich hoffe, dies aktualisieren zu können, um Web-Sockets zu verwenden, aber im Moment ist es ein zeitgesteuerter Pull und jeder Pull enthält die Verzögerung für den nächsten Pull, sodass ich das sogar verwalten kann, sobald der Client mein System geladen hat.
Ich verwende auch show/expire und moment.js, um nach Datum und Uhrzeit zu filtern, und verwende dann Cookies mit der ID jeder Warnung (hier nicht gezeigt), um doppelte Benachrichtigungen zu verhindern. Das kommt gut voran und ich könnte mich entscheiden, es bald als Bibliothek zu verpacken, wenn ich genug Interesse bekomme.
Das für diese Frage spezifische Bit besteht jedoch aus zwei Teilen. 1) JSON, das die Parameter für jQuery.dialog() und 2) den Code enthält, um diesen JSON zu verwenden und einen Dialog zu erstellen. Der Schlüssel hier ist, darauf zu achten, wie ich auf die ‘n’-Objektparameter verweise und sie verwende, um den Dialog dynamisch zu erstellen. Das tDlg-Objekt spielt dabei eine große Rolle, da es letztlich den Dialog darstellt und an $().dialog() übergeben wird.
JSON-Snippet, das meine Dialogparameter enthält:
"doAlert":{
"modal":false
,"height":240
,"width":380
,"title":"Welcome to the new BatchManager"
,"body":"<div style="text-align:center;">Welcome to the new and enhanced<br/>BatchManager!</div><div style="text-align:center;">Enjoy!</div>"
,"buttons":[
{
"text":"Ok"
,"click":"$(this).dialog('close');"
}
]
}
JavaScript-Snippet (mit jQuery) zum Initialisieren eines Dialogs basierend auf meinem JSON (n entspricht doAlert, das in diesem Beispiel Teil eines Arrays von “Notices” ist):
OnDialogClose du solltest dich lösen #MenuDialog von DOM, um mehrere Objekte mit derselben ID zu vermeiden, oder Sie können prüfen, ob div#MenuDialog existiert, bevor eins hinzugefügt wird.
var Selector = $("a:contains('sometext')"); ist eine sinnlose Linie, es sei denn, Sie verwenden sie an anderer Stelle wieder.
Sie nutzen $('#MenuDialog') mehrmals. Es wäre besser, es einer Variablen zuzuweisen, anstatt es abzufragen var Selector = $('#MenuDialog'); alles noch einmal.
Mir persönlich ist es so gelungen:
1) Erstellen Sie das HTML des Dialogs mit zwei Spannen mit xxx als Standardwert
<div id="dialog1" title="Title of the dialog">
<p>There are two variables: <span id="var1">xxx</span> and
<span id="var2">xxx</span></p>
</div>
Nur aus Neugier, warum verwenden Sie selector.bind anstelle von selector.click?
– eugenK
15. Juni 2011 um 7:53 Uhr
Gute Frage. Nur aus Gewohnheit. und wirkt sich das auf die Leistung aus?
– Schahin
15. Juni 2011 um 7:55 Uhr
Ich weiß es nicht genau, aber ich denke, Bindeschleifen durch die Sammlung von Ereignissen für das von Ihnen bereitgestellte Element und dann die gleiche Funktion wie beim Klicken anwenden. Ich wette, es wirkt sich auf die Leistung aus, aber so würde ich dieses Modul schreiben. John Resig und andere in der jQuery-Crew haben vielleicht viel bessere Ideen.
– eugenK
15. Juni 2011 um 7:59 Uhr
@eageneK Ich habe überprüft: $(‘#test’).click(function() { //whatever… }); ist ein Alias für den folgenden Code. $(‘#test’).bind(‘click’, function() { //whatever… });
– Schahin
16. Juni 2011 um 8:41 Uhr