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>
O código acima funciona sem problemas no Firefox, mas parece não funcionar no Chrome. No Chrome, é exibido .is(":visible") = false
mesmo quando está true
.
Estou usando a seguinte versão do jQuery: jquery-1.4.3.min.js
jsFiddle Link: http://jsfiddle.net/WJU2r/4/
jquery
google-chrome
Saad Bashir
fonte
fonte
Respostas:
Parece que o
:visible
seletor do jQuery não funciona para alguns elementos embutidos no Chrome. A solução é adicionar um estilo de exibição, como"block"
ou"inline-block"
fazê-lo funcionar.Observe também que o jQuery tem uma definição um pouco diferente do que é visível do que muitos desenvolvedores:
Em outras palavras, um elemento deve ter largura e altura diferentes de zero para consumir espaço e ser visível.
Por outro lado, mesmo que
visibility
esteja definido comohidden
ou a opacidade seja zero, ainda é o:visible
jQuery, pois consome espaço, o que pode ser confuso quando o CSS diz explicitamente que sua visibilidade está oculta.A maneira mais fácil de ver isso é que, se você pode ver o elemento na tela, mesmo que não possa ver seu conteúdo, é transparente, etc., é visível, ou seja, ocupa espaço.
Limpei um pouco a sua marcação e adicionei um estilo de exibição ( ou seja, definir os elementos para "bloquear" etc ), e isso funciona para mim:
FIDDLE
Referência oficial da API para
:visible
No jQuery 3, a definição de
:visible
mudou ligeiramentefonte
Não sei por que seu código não funciona no chrome, mas sugiro que você use algumas soluções alternativas:
ou
Se você tem certeza de que o jQuery fornece alguns resultados ruins no chrome, basta confiar na verificação da regra css:
Além disso, convém usar o jQuery mais recente, pois ele pode ter erros da versão anterior corrigidos.
fonte
:hidden
e:not(:visible)
. stackoverflow.com/questions/17425543/…Há um caso estranho em que, se o elemento estiver definido como
display: inline
jQuery, a verificação de visibilidade falhará.Exemplo:
CSS
jQuery
Para corrigi-lo, você pode ocultar o elemento no jQuery e que
show/hide
outoggle()
deve funcionar bem.fonte
Suponho que tenha algo a ver com uma peculiaridade em nosso HTML, porque outros lugares na mesma página funcionam muito bem.
A única maneira de resolver esse problema foi:
fonte
Se você ler os documentos do jquery, existem várias razões para que algo não seja considerado visível / oculto:
Eles têm um valor de exibição CSS nenhum.
Eles são elementos de formulário com o tipo = "oculto".
Sua largura e altura são explicitamente definidas como 0.
Um elemento ancestral está oculto, portanto, o elemento não é mostrado na página.
http://api.jquery.com/visible-selector/
Aqui está um pequeno exemplo do jsfiddle com um elemento visível e um elemento oculto:
http://jsfiddle.net/tNjLb/
fonte
Internet Explorer, Chrome, Firefox ...
Função Cross Browser "isVisible ()"
Exemplo completo:
Saudações,
Fernando
fonte
Geralmente eu vivo essa situação quando o pai do meu objeto está oculto. por exemplo, quando o html é assim:
se você perguntar se child é visível como:
ele retornará false porque seu pai não é visível, de modo que div também não será visível.
fonte
Uma solução entre navegadores / versões para determinar se um elemento está visível é adicionar / remover uma classe css ao elemento em show / hide. O estado padrão (visível) do elemento pode ser, por exemplo, assim:
<span id="span1" class="visible">Span text</span>
Em seguida, ocultar, remova a classe:
$("#span1").removeClass("visible").hide();
No programa, adicione-o novamente:
$("#span1").addClass("visible").show();
Em seguida, para determinar se o elemento está visível, use o seguinte:
if ($("#span1").hasClass("visible")) { // do something }
Isso também resolve as implicações de desempenho, que podem ocorrer no uso intenso do seletor ": visible", apontado na documentação do jQuery:
Documentação oficial da API jQuery para o seletor ": visible"
fonte
Eu adicionei o próximo estilo no pai e .is (": visible") funcionou.
fonte
Se um item é filho de um item oculto, (": visible") retornará true, o que está incorreto.
Eu apenas corrigi isso adicionando "display: herdar" ao item filho. Isso irá corrigi-lo para mim:
e o CSS:
Agora o item pode ser ativado e desativado efetivamente alterando a visibilidade do pai, e $ (elemento) .is (": visible") retornará a visibilidade do item pai
fonte
Este é o trecho de código do jquery.js que é executado quando is (": visible") é chamado:
Como você pode ver, ele usa mais do que apenas a propriedade de exibição CSS. Também depende da largura e altura do conteúdo do elemento. Portanto, verifique se o elemento possui alguma largura e altura. E para fazer isso, pode ser necessário definir a propriedade display como
"inline-block"
ou"block"
fonte
Eu preciso usar a visibilidade: instinto oculto da exibição: nenhum porque a visibilidade recebe eventos, enquanto a exibição não.
Então eu faço
.attr('visibility') === "visible"
fonte