jQuery选择器.not()不工作

时间:2012-04-04 17:00:16

标签: javascript jquery

我为一个函数构建了一个jQuery选择器,如下所示:

    $('html').not('.table-main tr[selected]').mousedown( function( e ) {

但不知何故它根本没有过滤,我不太明白为什么。 即使我只是为选择器留下('。table-main'),我仍然会在点击表格时触发该功能......这有什么问题?

使用文档'正文'而非'html'无效,因为文档根本没有触发.not( )和'身体'的结果相同。

编辑: 刚尝试使用表外的另一个块,它的工作原理。我有可能不能在桌子上使用它吗?

Update2:根据要求,这是表格的渲染html代码:

    <table border="0" cellspacing="2px" cellpadding="5px" class="table-main">
      <tr id="tablefields">
        <th style="padding: 0;">
          <table cellpadding="0" cellspacing="0" border="0" align="center">
            <tr><th><div class="tr-head-get" id="tr-get-0">Name</div></th></tr>
            <tr><th><div class="th-header" id="th-header-0" style="top: 54px;">Name</div></th></tr>
          </table>
        </th>    
      <th style="padding: 0;"></th>
    </tr>
      <tr id='table_form_new_device' class='table_form_class'>
      <form accept-charset="UTF-8" action="/devices" class="new_device" data-remote="true" id="new_device" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="T2dSeZpxxvgJdTP+yoE7BrVODzqJ95gyVu9Wh/v7oP8=" /></div>
        <th class='tablefield'>
          <input id="device_devicename" name="device[devicename]" size="10" type="text" />
        </th>
        <th>
          <div class='submitbox' id='submitbox_new_device'>S</div>
          <script>
            $('#submitbox_new_device').click(function (event) {
              $('#new_device').submit();
            });
          </script>
        </th>
    </form></tr>
    </table>
    <div class="dropdown-button" style="margin: 0 2px;">Filter</div>

3 个答案:

答案 0 :(得分:3)

您真的非常希望使用委托事件处理,因为您不希望将事件处理程序附加到文档中的每个元素。您希望在文档级别拦截冒泡事件,并检查mousedown是否来自不是表中所选行的元素。

此外,tr[selected]似乎不太可行。我认为您需要在所选行中添加一个类"selected",然后使用tr.selected作为选择器。

如果你做了那个改变,我会建议像这两个选项中的一个:

$(document).mousedown(function(e) {
    if (!$(e.target).is('.table-main tr.selected')) {
       // mouse down and it wasn't in a selected row of your table)
    }
})

您也可以让jQuery委派进行更多工作:

$(document).on('mousedown', ':not(.table-main tr.selected)', function() {
   // mouse down and it wasn't in a selected row of your table)

});

在看到您的实际HTML后,如果我正确理解了问题,这应该可行。只要该点击不在table-main的{​​{1}}类中,就会在发生点击时为您提供一个事件:

selected

以下是演示:http://jsfiddle.net/jfriend00/5QD6N/

答案 1 :(得分:2)

使用[selected]tr类型的元素没有意义。您使用选定的输入(checkbox,radio)。您可以在.selected中的tr元素中添加一个类.table-main,然后使用:

编辑:就像上面发布的人一样,你想要选择嵌套在体内的元素。

$('body').find(':not(.selected)').mousedown(function(e){})

答案 2 :(得分:1)

$('html')创建一个包含HTML元素的jQuery对象。

.not('.table-main tr[selected]')删除任何具有所选属性的TR元素(此处存在错误,该属性不会出现在TR上),这些属性来自属于table-main类成员的元素。由于HTML元素不是TR元素,不能是任何元素的后代,因此不会删除任何元素,也不会产生任何影响。

mousedown( function( e )将事件处理程序绑定到HTML元素。除非某些东西停止传播,否则任何点击都会最终冒泡到那里。

猜测(因为你实际上没有说出你想要实现的目标),你想要捕获未被选中的TR元素的点击。假设您切换到使用类来使HTML有效...

$('.table-main tr:not(.selected)').mousedown(…);

<tr class="selected">