【问题标题】:JQuery pseudo selector :visible is working at one place but not at other placeJQuery 伪选择器:可见在一个地方工作,但在其他地方不工作
【发布时间】:2014-05-25 14:57:00
【问题描述】:

我正在尝试选择页面上的那些输入字段以验证哪些在布局上可见。我可以通过一种方式找到它,但用另一种方式它实际上并没有工作。我得到的是我的选择器适用于直系子女,但不适用于孙子女。

我只想选择那些在布局上实际可见的元素 id 来验证它们,因为它们不应该是空白的。

Jsfiddle Demo

HTML

<div id="createdDiv1">
    <div id="row11">
        <div class="hide">
            <input type="text" class="blk" id="inp_11"/>
        </div>
    </div>
    <div id="row12">
        <div>
            <input type="text" class="blk" id="inp_12" />
        </div>
    </div>
</div>
<div id="createdDiv2">
    <div id="row21" class="hide">
        <div>
            <input type="text" class="blk" id="inp_21" />
        </div>
    </div>
    <div id="row22" class="">
        <div>
            <input type="text" class="blk" id="inp_22" />
        </div>
    </div>
</div>
<button onclick="subCheck('#createdDiv1 :visible')">check 1st</button>
<button onclick="subCheck('#createdDiv2 :visible')">check 2nd</button>

JavaScript

function subCheck(inBlock) {
    inBlock=(inBlock==undefined)?'':inBlock;
    var ids=[];

    $(inBlock+' .blk').each(function(){
        ids.push($(this).attr('id'));
    });

    console.log(ids);
}

CSS

.hide{
    display:none;
}

注意:我不想更改我的 subCheck() 函数,因为它适用于所有验证,我需要知道如何使它与 :visible 选择器或类似的东西一起使用让它与可见元素的多级检查一起工作。

对不起,如果我让你模棱两可。我不知道具体用什么语言来解释。

【问题讨论】:

  • 您对示例中的警报显示有何看法?
  • 我的警报正在显示所选元素,我希望只有那些在布局上可见的元素才会出现警报。 @IrvinDomininaka爱德华
  • 你试过使用 .is() 吗? jsfiddle.net/rKwCy

标签: javascript jquery html css jquery-selectors


【解决方案1】:

使用:not 排除类.hide

<button onclick="subCheck('#createdDiv1 .inputDiv:not(\'.hide\')')">
    check 1st
</button>
<button onclick="subCheck('#createdDiv2 .inputDiv:not(\'.hide\')')">
    check 2nd
</button>

小提琴:http://jsfiddle.net/Z4PSV/1/

虽然我根本不建议使用onclick,但是:

<button class="subcheck" data-id="createdDiv1">check 1st</button>
<button class="subcheck" data-id="createdDiv2">check 2nd</button>

<script>
    $(document).on('click', '.subcheck' function() {
        //Creates string as: '#createdDiv1 .inputDiv:not('hide')
        var ft = "#" + $(this).data('id') + " .inputDiv:not('.hide')";
        subCheck( ft );
    });
</script>

小提琴:http://jsfiddle.net/kY8Wh/

最后,如果您希望实现 :visible,那么:

<button onclick="subCheck('#createdDiv1 .inputDiv:visible')">
    check 1st
</button>
<button onclick="subCheck('#createdDiv2 .inputDiv:visible')">
    check 2nd
</button>

小提琴:http://jsfiddle.net/Zgm78/

也够了。

【讨论】:

  • @DeepakGoswami 道歉,已修复 =),除非我把你的问题弄错了!
  • hide 只是一个例子,它可以是任何类或隐藏 div 的 css。我只想选择可见元素。使用的其他类可能不存在。查看我要发布的编辑
  • @DeepakGoswami 我明白了!好吧,我已经包括了最后一个例子;否则道歉!
  • 感谢您帮助我度过难关,但我想似乎没有什么对我有用。我的运气不好 :(
  • @DeepakGoswami 好吧,我仍然不知道我们(我和另一个答案)做错了什么,我们错过了什么?所有解决方案都排除了隐藏的输入! :o
【解决方案2】:

问题是您使用 each 扫描可见顶部元素的所有内部 .blk 元素,在这种情况下,元素本身是可见的,但对中间父元素隐藏。

我知道您不会更改您的 subCheck 函数,但是您可以通过检查子元素 .blk 的可见性来简单地解决问题。

Visibile selector 负责元素的有效可见性(直接或嵌套):

如果元素占用了文档中的空间,则认为它们是可见的。 可见元素的宽度或高度大于零。

具有可见性的元素:隐藏或不透明度:0 被认为是可见的, 因为它们仍然会占用布局中的空间。

不在文档中的元素被认为是隐藏的; jQuery 没有办法知道它们何时可见 附加到文档,因为它取决于适用的样式。

我认为此更改不会破坏您代码中的任何内容。

代码:

function subCheck(inBlock) {
    inBlock=(inBlock==undefined)?'':inBlock;
    var ids=[];

    $(inBlock+' .blk:visible').each(function(){
        ids.push($(this).attr('id'));
    });

    //console.log(ids);
    alert(ids);
}

演示:http://jsfiddle.net/IrvinDominin/her4Y/

【讨论】:

  • 我已经提到我不想更改我的subCheck 函数,因为它在很多地方都使用过。 :(
  • 但是在代码的其他地方,您必须只检查可见元素还是隐藏元素?副作用只在这里
  • 不,这些代码 $(inBlock+' .blk') 起始选择器的所有子元素(可见与否);通过在末尾添加 :visibile,您将获得所有子 VISIBLE 元素
  • 是的,代码实际上在我的函数中:),这就是为什么我问我是否可以选择元素而不更改它,因为我有这个函数用于各种验证,所以我没有把所有代码放在这里这与我的问题无关。
  • 我认为不改变它你必须指定更具体的选择器作为参数(a:visible b:visibile c:visible),但恕我直言,这是最糟糕的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-04
  • 2011-08-17
相关资源
最近更新 更多