jQuery `.is(“:visible”)` funktioniert nicht in Chrome
Lesezeit: 8 Minuten
Saad Baschir
if ($("#makespan").is(":visible") == true) {
var make = $("#make").val();
}
else {
var make = $("#othermake").val();
}
Make:<span id=makespan><select id=make></select><span id=othermakebutton class=txtbutton>Other?</span></span><span id=othermakespan style="display: none;"><input type=text name=othermake id=othermake> - <span id=othermakecancel class=txtbutton>Cancel</span></span>
Der obige Code läuft reibungslos in Firefox, scheint aber in Chrome nicht zu funktionieren. In Chrome wird es angezeigt .is(":visible") = false auch wenn es so ist true.
Ich verwende folgende jQuery-Version: jquery-1.4.3.min.js
müssen nicht ” == true ” in der if-Anweisung schreiben: if ($(“#makespan”).is(“:visible”) ) ist genug
– Marcdahan
17. April 18 um 13:16 Uhr
adeneo
Es scheint jQuery zu sein :visible Der Selektor funktioniert bei einigen Inline-Elementen in Chrome nicht. Die Lösung besteht darin, einen Anzeigestil hinzuzufügen, z "block" oder "inline-block" damit es funktioniert.
Beachten Sie auch, dass jQuery eine etwas andere Definition dessen hat, was sichtbar ist als viele Entwickler:
Elemente gelten als sichtbar, wenn sie Platz im Dokument beanspruchen.
Sichtbare Elemente haben eine Breite oder Höhe, die größer als Null ist.
Mit anderen Worten, ein Element muss eine Breite und Höhe ungleich Null haben, um Platz zu verbrauchen und sichtbar zu sein.
Elemente mit visibility: hidden oder opacity: 0 werden als sichtbar betrachtet, da sie immer noch Platz im Layout beanspruchen.
Andererseits, auch wenn es sein visibility ist eingestellt auf hidden oder die Opazität ist Null, es ist still :visible zu jQuery, da es Speicherplatz verbraucht, was verwirrend sein kann, wenn das CSS ausdrücklich sagt, dass seine Sichtbarkeit ausgeblendet ist.
Elemente, die sich nicht in einem Dokument befinden, gelten als ausgeblendet; jQuery hat keine Möglichkeit zu wissen, ob sie sichtbar sind, wenn sie an ein Dokument angehängt werden, da dies von den anwendbaren Stilen abhängt.
Alle Optionselemente gelten als ausgeblendet, unabhängig von ihrem ausgewählten Status.
Bei Animationen, die ein Element ausblenden, wird das Element bis zum Ende der Animation als sichtbar betrachtet. Bei Animationen zum Anzeigen eines Elements gilt das Element zu Beginn der Animation als sichtbar.
Die einfache Art, es zu betrachten, ist, dass, wenn Sie das Element auf dem Bildschirm sehen können, auch wenn Sie seinen Inhalt nicht sehen können, es transparent ist usw., es sichtbar ist, dh es nimmt Platz ein.
Ich habe Ihr Markup ein wenig aufgeräumt und einen Anzeigestil hinzugefügt (dh die Anzeige der Elemente auf “blockieren” usw), und das funktioniert bei mir:
Ab jQuery 3 ist die Definition von :visible hat sich leicht verändert
jQuery 3 ändert leicht die Bedeutung von :visible (und damit von :hidden).
Ab dieser Version werden Elemente berücksichtigt :visible wenn sie Layoutboxen haben, einschließlich solcher mit einer Breite und/oder Höhe von null. Beispielsweise, br Elemente und Inline-Elemente ohne Inhalt werden von ausgewählt :visible Wähler.
Ich habe auch versucht, die einzelnen Komponenten in jsFiddle einzufügen, und es hat gut funktioniert. Ich werde versuchen, den Fehler in jsFiddle zu replizieren und dann den Link zu posten. Wahrscheinlich verursacht etwas anderes im Code diesen Fehler
– Saad Baschir
1. Dezember 11 um 6:45 Uhr
Ich habe das Problem unter folgendem Link repliziert: jsfiddle.net/WJU2r/3
– Saad Baschir
1. Dezember 11 um 15:26 Uhr
Vielen Dank das hat funktioniert! Ich weiß nicht warum, aber setze #makespan { display: block; } hat es funktioniert.
– Saad Baschir
2. Dezember 11 um 4:32 Uhr
Der Kommentar vom Originalposter enthält die eigentliche Lösung, IE, die Ihre Spans display:block macht. Blöd, dass Spans standardmäßig in Chrom unsichtbar sind, aber was auch immer.
– Jeff Davis
10. Juli 2012 um 19:00 Uhr
Es reicht aus, wenn Sie ein zum Element, denn wenn ein Element keinen Inhalt hat, ist es in Chrome unsichtbar
– Briganten
11. Juli 13 um 6:41 Uhr
gion_13
Ich weiß nicht, warum Ihr Code auf Chrome nicht funktioniert, aber ich schlage vor, dass Sie einige Problemumgehungen verwenden:
$el.is(':visible') === $el.is(':not(:hidden)');
oder
$el.is(':visible') === !$el.is(':hidden');
Wenn Sie sicher sind, dass jQuery in Chrome schlechte Ergebnisse liefert, können Sie sich einfach auf die CSS-Regelprüfung verlassen:
Eine browser-/versionsübergreifende Lösung, um festzustellen, ob ein Element sichtbar ist, besteht darin, eine CSS-Klasse zu dem anzuzeigenden/auszublendenden Element hinzuzufügen/zu entfernen. Der standardmäßige (sichtbare) Zustand des Elements könnte beispielsweise so aussehen:
<span id="span1" class="visible">Span text</span>
Entfernen Sie dann beim Ausblenden die Klasse:
$("#span1").removeClass("visible").hide();
Auf Show, fügen Sie es erneut hinzu:
$("#span1").addClass("visible").show();
Um dann festzustellen, ob das Element sichtbar ist, verwenden Sie Folgendes:
if ($("#span1").hasClass("visible")) { // do something }
Dies löst auch die Auswirkungen auf die Leistung, die bei starker Verwendung des Selektors „:visible“ auftreten können, auf die in der jQuery-Dokumentation hingewiesen wird:
Die starke Verwendung dieses Selektors kann Auswirkungen auf die Leistung haben, da er den Browser dazu zwingen kann, die Seite neu zu rendern, bevor er die Sichtbarkeit bestimmen kann. Das Verfolgen der Sichtbarkeit von Elementen über andere Methoden, beispielsweise mithilfe einer Klasse, kann eine bessere Leistung bieten.
vorzugsweise in einem jsfiddle-link? und überprüfen Sie es möglicherweise mit jquery.latest.
– xaxxon
1. Dezember 11 um 6:13 Uhr
Das Makaspan kann angezeigt werden: keine oder Sichtbarkeit: versteckt?
– Arthur Keyan
1. Dezember 11 um 6:15 Uhr
und vielleicht vorübergehend auf die neueste jQuery-Version aktualisieren, nur um einen jQuery-Fehler auszuschließen?
– Strelok
1. Dezember 11 um 6:16 Uhr
Siehe auch: bugs.jquery.com/ticket/13132 Scheint, als würde es in Version 1.12/2.2 behoben! –
– Glen Little
5. September 14 um 21:40 Uhr
müssen nicht ” == true ” in der if-Anweisung schreiben: if ($(“#makespan”).is(“:visible”) ) ist genug
– Marcdahan
17. April 18 um 13:16 Uhr