8 Stimmen

Verursachen doppelte ID-Werte Probleme für jQuery-Selektoren?

Wenn ich zwei Divs hätte, beide mit der ID="myDiv", würden beide Divs mit $("#myDiv").fadeOut(); ausgeblendet werden? Oder würde nur das erste/zweite ausgeblendet werden? Oder gar keines?

Wie kann ich festlegen, welches ausgeblendet wird?

Hinweis: Ich weiß, dass doppelte IDs gegen die Standards verstoßen, aber ich verwende das fancybox-Modalpopup und es dupliziert den spezifizierten Inhalt auf Ihrer Seite für den Inhalt des Popups. Falls jemand einen Weg kennt, dies zu umgehen (vielleicht benutze ich fancybox falsch), lassen Sie es mich bitte wissen.

0 Stimmen

Ja, aber ich hatte gehofft, dass wenn ich jemand anderen frage, er mir vielleicht eine Erklärung dafür geben kann, warum nur der erste ausgeblendet wird.

0 Stimmen

Bedeutet es, dass der Inhalt dupliziert wird oder "bewegt" wird an die Position Ihrer Popups?

0 Stimmen

Es verdoppelt es. wenn ich den Quellcode über Firebug anschaue, sehe ich deutlich den Code dort zweimal. Einmal dort, wo ich es platziert habe, und einmal innerhalb des fancybox.

12voto

karim79 Punkte 333786

Element-IDs sollten eindeutig sein. Mehrere DIVs mit derselben ID wären falsch und unvorhersehbar und widersprechen dem Zweck der ID. Wenn Sie das getan haben:

$('.myDiv').fadeOut();

Dann würden beide ausgeblendet werden, vorausgesetzt Sie haben ihnen eine Klasse von myDiv und eindeutige IDs (oder gar keine) gegeben.

7voto

Matthew Flaschen Punkte 266507

"Hinweis: Ich weiß, dass doppelte IDs gegen die Standards verstoßen"

Dann mach es nicht. Sie haben bereits zwei Probleme herausgefunden. Es verstößt gegen Standards und stört die Auswahlmechanismen von jQuery (und tatsächlich des regulären DOMs). Es wird wahrscheinlich weitere Probleme geben.

Möglicherweise verwenden Sie fancybox tatsächlich falsch, in diesem Fall hoffe ich, dass Ihnen jemand, der damit vertraut ist, hilft. Oder noch schlimmer, wenn das Skript selbst fehlerhaft ist, sollten Sie es nicht verwenden.

0 Stimmen

So soll ich also meinen eigenen Modal-Popup schreiben? Ich weiß, ich bin nicht der Einzige, der fancybox benutzt. Das hat meine Frage überhaupt nicht beantwortet...

0 Stimmen

Ich habe nie vorgeschlagen, dass Sie Ihren eigenen Modal-Dialog schreiben.

7voto

William Brendel Punkte 30822

JQuery entspricht genau einem Element beim Abfragen einer ID. Ein Array von höchstens einem Element Objekt wird von $("#foo").get() zurückgegeben. Siehe die jQuery-Dokumentation für weitere Informationen oder probieren Sie es selbst aus.

$(function() {
    alert($("#foo").length);
});

0 Stimmen

$("#foo") gibt kein Array zurück. Es gibt ein Objekt zurück, das mehrere Funktionen enthält. $("#foo").get() ist ein Array.

0 Stimmen

Tatsächlich kannst du das jQuery-Objekt indizieren z. B. $('.foo')[0]. Macht das es zu einem Array ;)

0 Stimmen

Wie von redsquare gesagt, können Sie auf Elemente mit Subskripten zugreifen, und jQuery bietet auch eine "length"-Eigenschaft. In diesem Sinne können Sie es wie ein Array behandeln. Allerdings werden die anderen Array-Funktionen (wie pop, join usw.) nicht bereitgestellt. Ich habe meine Antwort aktualisiert, um die get-Funktion einzuschließen, wie es Matthew angemerkt hat.

2voto

Head Punkte 4541

Da $('#myDiv') nur das erste div mit dieser ID zurückgibt, müssen Sie alle Elemente mit dieser ID finden, indem Sie diesen Trick verwenden:

$('[id=myDiv]');

Also, für Ihren Fall, um das Ausblenden auf alle diese Divs anzuwenden:

$('[id=myDiv]').fadeOut();

Und wenn Sie sicherstellen möchten, dass Ihre Seite diese ID nicht zweimal hat, können Sie die zusätzlichen durch folgendes entfernen:

$('[id=myDiv]:gt(0)').remove();

0 Stimmen

Ich denke, dass jeder zustimmt, dass doppelte IDs zu haben eine der schlimmsten Dinge ist, die man tun kann (schadet kleinen Kätzchen & macht traurige Pandas). Obwohl dieser Trick mir geholfen hat, einen kleinen Bug in einer kleinen Dienstprogramm-Webanwendung zu beheben, die ich geschrieben habe. Tatsächlich habe ich versteckte Tabellen, die als Vorlagen dienen (ich kopiere sie, um neue zu generieren) und diese Vorlagen enthalten IDs, weil ich diese IDs dann für die Übersetzung auf der Client-Seite verwende (ja, ich habe hier ein bisschen Spaß mit JavaScript ^^)

0 Stimmen

Ich finde es idiotisch, dass die Selektoren $("#myid") und $("[id='myid']") unterschiedliche Ergebnisse liefern sollten. Nein, eine Seite sollte nicht mehr als ein Element mit einer bestimmten ID haben, aber Fehler passieren und müssen gefunden werden. Wenn Sie bereits einen Fehler wie diesen vermuten, ist es viel einfacher, eine Abfrage einzugeben, als einen Validierer auszuführen. Das ist so, als würde man die Polizei fragen, wie viele Menschen sich in Gewahrsam umbringen, und die Antwort erhalten, dass das nicht passieren dürfe, und daher die Antwort 0 sei. Ich denke, $(#myid") ist viel schneller, aber immer noch irreführend. Vielleicht könnte eine neue Eigenschaft $(#myid").exists eingeführt werden.

1voto

Steve Ottenad Punkte 11

Sie können auch den Weg über die Verwendung von find() gehen. find wird alle Elemente mit dieser ID zurückgeben, und Sie können den Bereich auf ein bestimmtes übergeordnetes Element beschränken, wenn nötig, versuchen Sie etwas wie $(document).find('#myDiv').fadeOut();

oder

$('.parentElement').find('#myDiv').fadeOut();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X