5

目标

我想选择<td>只包含一个复选框的元素。我想使用单个选择器(不使用选择器外部的链接或逻辑)来执行此操作,以便我可以将选择器与 jQuery 函数(如liveor )一起使用delegate

更大的图是我想在这些<td>s上监听点击事件并将点击事件传递给复选框,从而创建更大的点击区域。这很重要,因为<tr>当用户单击并错过复选框时,我不想激活不同的单击事件。

具体情况

我用一个示例场景创建了一个 jsfiddle:http: //jsfiddle.net/ytA3X/

这就是我开始的那个不起作用。换句话说,选择任何具有复选框但没有任何不是复选框的 td 元素。

$('td:has(:checkbox):not(:has(:not(:checkbox)))')
=> []

:not(:has(...))适用于我的jsfiddle 示例

:has(:not(...))适用于我的jsfiddle 示例

:not(:has(:not(...)))似乎总是什么都不选择。

有没有其他方法可以让我只用一个复选框来选择 td 元素,还是我做错了什么?

4

4 回答 4

8

如何使用:only-child

$('td:has(:checkbox:only-child)')...

JSFiddle

于 2012-05-29T18:12:40.513 回答
2

不要只使用一个选择器,它会使您的代码难以阅读,并且极难维护和调试。

$('td:has(input[type="checkbox"])').filter(function(){
    return $(this).children().length === 1
});

现场演示

于 2012-05-29T18:02:19.880 回答
2

您可以使用only-child选择器

$('td:has(:checkbox:only-child)')

在这里,它与您的标记一起使用。

于 2012-05-29T18:13:24.507 回答
1

您可以简单地使用.not并将其拆分为两个单独的选择器:

http://jsfiddle.net/ytA3X/1/

于 2012-05-29T18:06:42.983 回答