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>&nbsp;-&nbsp;<span id=othermakecancel class=txtbutton>Cancel</span></span>

上面的代码在Firefox中运行流畅,但在Chrome中似乎行不通。在Chrome中,它显示.is(":visible") = false,即使它是真的。

我使用以下jQuery版本:jQuery -1.4.3.min.js

jsfiddle.net/wju2r/4/


当前回答

这是来自jquery.js的一段代码,当is(":visible")被调用时执行:

if (jQuery.expr && jQuery.expr.filters){

    jQuery.expr.filters.hidden = function( elem ) {
        return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
    };

    jQuery.expr.filters.visible = function( elem ) {
        return !jQuery.expr.filters.hidden( elem );
    };
}

如您所见,它使用的不仅仅是CSS display属性。它还取决于元素内容的宽度和高度。因此,要确保元素有一定的宽度和高度。为此,你可能需要将display属性设置为"inline-block"或"block"

其他回答

有一种奇怪的情况,如果元素被设置为显示:内联jQuery检查可见性失败。

例子:

CSS

#myspan {display: inline;}

jQuery

$('#myspan').show(); // Our element is `inline` instead of `block`
$('#myspan').is(":visible"); // This is false

要解决这个问题,你可以在jQuery中隐藏元素,然后show/hide或toggle()应该可以正常工作。

$('#myspan').hide()
$('#otherElement').on('click', function() {
    $('#myspan').toggle();
});

我在父样式上添加了next样式,.is(":visible")起作用了。

显示:inline-block;

这是来自jquery.js的一段代码,当is(":visible")被调用时执行:

if (jQuery.expr && jQuery.expr.filters){

    jQuery.expr.filters.hidden = function( elem ) {
        return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
    };

    jQuery.expr.filters.visible = function( elem ) {
        return !jQuery.expr.filters.hidden( elem );
    };
}

如您所见,它使用的不仅仅是CSS display属性。它还取决于元素内容的宽度和高度。因此,要确保元素有一定的宽度和高度。为此,你可能需要将display属性设置为"inline-block"或"block"

我认为这与我们HTML中的一个怪癖有关,因为同一页面上的其他地方工作得很好。

我能够解决这个问题的唯一方法是:

if($('#element_id').css('display') == 'none')
{
   // Take element is hidden action
}
else
{
   // Take element is visible action
}

如果一个项是隐藏项的子项,is(":visible")将返回true,这是不正确的。

我只是通过添加“display:inherit”到子项来修复这个问题。这将为我解决这个问题:

<div class="parent">
   <div class="child">
   </div>
<div>

和CSS:

.parent{
   display: hidden;
}
.child{
   display: inherit;
}

现在可以通过改变父元素的可见性来有效地打开和关闭项目,$(element).is(":visible")将返回父元素的可见性