2012-04-04 48 views
2

我已经建立了它看起来像这样的功能jQuery选择:jQuery选择。不是()不工作

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

但不知何故,它不是在所有的过滤,我不明白为什么。 即使我只是离开('.table-main')对于选择器,我仍然在点击表格时触发该函数......这是什么问题?

使用文件“身体”,而不是“HTML”没有帮助,因为文件是不是在所有。不触发()和“体”的结果相同。

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

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> 
+1

此外,它可以是事件冒泡问题。阅读更多关于事件顺序的信息http://www.quirksmode.org/js/events_order.html – antyrat 2012-04-04 17:04:02

+0

所以你试图选择每个未被选中的tr?看看[选择]选择器的[jQuery文档](http://api.jquery.com/selected-selector/)。你的语法看起来有点偏离。但是,一些DOM示例会帮助您更好地帮助您。 – Primus202 2012-04-04 17:04:42

回答

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有它的selected类:

$(document).on('mousedown', function(e) { 
    // mouse down and it wasn't in a selected row of your table) 
    e.stopPropagation(); 
    if (!$(e.target).closest(".table-main tr.selected").length) { 
     console.log("mousedown not in selected row of table-main") 
    } 
});​ 

这里有一个演示:http://jsfiddle.net/jfriend00/5QD6N/

+0

作出反应。这实际上起作用了(不知道为什么)如果我使用**。table-main ** only并单击细胞。不,如果我直接点击单元格。我是否必须将表内的每个类都分配给选择器? – Nikom 2012-04-04 17:40:04

+0

将表格的实际HTML添加到您的问题中,我们可以提供更具体的帮助。您还需要更具体地确定您执行哪些点击操作,而不希望在此处理程序中处理。这使用事件冒泡和事件委托来优雅地解决问题。另外,您尝试了两种选择中的哪一种? – jfriend00 2012-04-04 17:42:55

+0

以较短的形式发布呈现的html,因为真正的表格像5英里长 – Nikom 2012-04-04 17:59:12

2

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

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

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

实际上它应该是通过.data()分配的布尔值,但我想它是不正确的语法 – Nikom 2012-04-04 17:15:11

1

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

.not('.table-main tr[selected]')删除所有属于table-main类成员的元素的所有属性(此处存在错误,该属性未出现在TR上)的TR元素。由于HTML元素不是TR元素,并且不能从任何东西继承,所以这不会消除任何元素,也不会产生任何效果。

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

猜测(因为你实际上并没有说你想达到什么)要捕获未选择在TR元素的点击次数。假设您切换到使用类,使HTML有效...

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

<tr class="selected"> 
+0

我想在这个唯一的表格行中除了mousedown以外的任何地方调用事件。 [selected]应该是通过.data()分配给行的布尔值。 为了简化我只能使用表格的事情,但它不起作用。 使用$('html:not(.table-main)')仍然对.table-main – Nikom 2012-04-04 17:20:50