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>
Powyższy kod działa płynnie w przeglądarce Firefox, ale wydaje się, że nie działa w przeglądarce Chrome. W Chrome pokazuje to .is(":visible") = false
nawet wtedy, gdy jest true
.
Korzystam z następującej wersji jQuery: jquery-1.4.3.min.js
jsFiddle Link: http://jsfiddle.net/WJU2r/4/
jquery
google-chrome
Saad Bashir
źródło
źródło
Odpowiedzi:
Wygląda na to, że
:visible
selektor jQuery nie działa w przypadku niektórych elementów wbudowanych w Chrome. Rozwiązaniem jest dodanie stylu wyświetlania, takiego jak"block"
lub uruchomienie"inline-block"
go.Zauważ też, że jQuery ma nieco inną definicję tego, co jest widoczne niż wielu programistów:
Innymi słowy, element musi mieć niezerową szerokość i wysokość, aby zajmować miejsce i być widoczny.
Z drugiej strony, nawet jeśli
visibility
jest ustawiony nahidden
lub nieprzezroczystość wynosi zero, to nadal:visible
zajmuje jQuery, ponieważ zajmuje miejsce, co może być mylące, gdy CSS wyraźnie mówi, że jego widoczność jest ukryta.Prostym sposobem na to jest to, że jeśli widzisz element na ekranie, nawet jeśli nie widzisz jego zawartości, jest przezroczysty itp., Jest widoczny, tj. Zajmuje miejsce.
Wyczyściłem trochę twój znacznik i dodałem styl wyświetlania ( tj. Ustawianie wyświetlania elementów na „blok” itp. ), A to działa dla mnie:
SKRZYPCE
Oficjalne odniesienie API dla
:visible
Od jQuery 3 definicja
:visible
nieznacznie się zmieniłaźródło
Nie wiem, dlaczego twój kod nie działa na Chrome, ale sugeruję, abyś zastosował kilka obejść:
lub
Jeśli masz pewność, że jQuery daje złe wyniki w chrome, możesz po prostu polegać na sprawdzeniu reguły css:
Ponadto możesz użyć najnowszej wersji jQuery, ponieważ może ona zawierać błędy ze starszej wersji.
źródło
:hidden
i:not(:visible)
. stackoverflow.com/questions/17425543/…Istnieje dziwny przypadek, w którym jeśli element jest ustawiony
display: inline
na jQuery, sprawdzanie widoczności kończy się niepowodzeniem.Przykład:
CSS
jQuery
Aby to naprawić, możesz ukryć element w jQuery i wtedy
show/hide
lubtoggle()
powinien działać dobrze.źródło
Zakładam, że ma to coś wspólnego z dziwactwem w naszym HTML, ponieważ inne miejsca na tej samej stronie działają dobrze.
Jedynym sposobem, w jaki udało mi się rozwiązać ten problem, było:
źródło
Jeśli czytasz dokumenty jquery, istnieje wiele powodów, dla których nie można uznać, że są widoczne / ukryte:
Mają wartość wyświetlania CSS równą none.
Są to elementy form o typie = „ukryty”.
Ich szerokość i wysokość są jawnie ustawione na 0.
Element nadrzędny jest ukryty, więc element nie jest wyświetlany na stronie.
http://api.jquery.com/visible-selector/
Oto mały przykład jsfiddle z jednym widocznym i jednym ukrytym elementem:
http://jsfiddle.net/tNjLb/
źródło
Internet Explorer, Chrome, Firefox ...
Funkcja Cross Browser „isVisible ()”
Pełny przykład:
Pozdrowienia,
Fernando
źródło
Zasadniczo żyję w tej sytuacji, gdy rodzic mojego obiektu jest ukryty. na przykład, gdy HTML jest taki:
jeśli zapytasz, czy dziecko jest widoczne, takie jak:
zwróci false, ponieważ jego rodzic nie jest widoczny, więc div również nie będzie widoczny.
źródło
Rozwiązaniem między przeglądarkami / wersjami, aby ustalić, czy element jest widoczny, jest dodanie / usunięcie klasy css do elementu podczas show / hide. Domyślny (widoczny) stan elementu może wyglądać następująco:
<span id="span1" class="visible">Span text</span>
Następnie ukryj, usuń klasę:
$("#span1").removeClass("visible").hide();
Przy pokazie dodaj go ponownie:
$("#span1").addClass("visible").show();
Następnie, aby ustalić, czy element jest widoczny, użyj tego:
if ($("#span1").hasClass("visible")) { // do something }
To rozwiązuje również wpływ na wydajność, który może wystąpić przy intensywnym używaniu selektora „: visible”, które są wskazane w dokumentacji jQuery:
Oficjalna dokumentacja API jQuery dla selektora „: visible”
źródło
Dodałem następny styl nadrzędny i .is („: visible”) działało.
źródło
Jeśli element potomny elementu, który jest ukryty, to („: visible”) zwróci true, co jest niepoprawne.
Właśnie to naprawiłem, dodając element „display: dziedziczenie” do elementu potomnego. To naprawi to dla mnie:
i CSS:
Teraz element można skutecznie włączać i wyłączać, zmieniając widoczność elementu nadrzędnego, a $ (element) .is („: visible”) zwróci widoczność elementu nadrzędnego
źródło
To jest fragment kodu z jquery.js, który jest wykonywany, gdy nazywa się („: visible”):
Jak widać, wykorzystuje więcej niż tylko właściwość wyświetlania CSS. Zależy to również od szerokości i wysokości zawartości elementu. Dlatego upewnij się, że element ma pewną szerokość i wysokość. Aby to zrobić, konieczne może być ustawienie właściwości display na
"inline-block"
lub"block"
źródło
Muszę użyć widoczności: ukryta instancja wyświetlania: brak, ponieważ widoczność wymaga zdarzeń, a wyświetlanie nie.
Ja również
.attr('visibility') === "visible"
źródło