【问题标题】:how to select elements based on one attribute and excluding those with another attribute?如何根据一个属性选择元素并排除具有另一个属性的元素?
【发布时间】:2012-02-13 14:08:48
【问题描述】:

我被困在这里:

我想选择所有具有 data-role="page" 属性但不带有 data-internal-page="true" 属性的 div。 p>

这不起作用:

$('div:jqmData(role="page")').not('div:jqmData(internal-page="true")')

谁能告诉我语法有什么问题?第二个属性总是被忽略。

感谢您的帮助!

【问题讨论】:

  • 是数据内部页面吗?如果是这样,那么不应该是 div:jqmData(data-internal-page="true")。
  • jquery-mobile 使用 jqmData(some="thing"),这将导致 data-some="thing"。

标签: jquery jquery-mobile jquery-selectors


【解决方案1】:

我不使用jqmData,但它可能不会查找所有data-attributes,而只会查找与jQuery Mobile 关联的那些。尝试使用常规属性选择器:

$('div[data-role="page"]').not('div[data-internal-page="true"]')

这是一个演示:http://jsfiddle.net/Y4mxw/

请注意,如果您不使用 tagName,您的选择器会运行得更快:

$('[data-role="page"]').not('[data-internal-page="true"]')

【讨论】:

  • 我也想过这一点,但我也得到了 6 个 div 中的 6 个返回,它应该只有 1。此外,您的表达式会触发:未捕获的异常:语法错误
  • 我在第二个选择器中留下了一个冒号,现在在我的示例中已修复,尝试演示:jsfiddle.net/Y4mxw
  • 是的。也有效。谢谢。因为我更喜欢 .not over :not... 你得到点头 :-)
  • 在 jQuery 中使用等效的函数几乎总是比使用伪选择器快。 $('ul li a') 比 $('ul').children('li').find('a') 慢,$('a:not(".some-class")') 比 $('a').not('.some-class') 慢。每次测试性能差异时,我发现使用函数更快。
【解决方案2】:

您可以使用 native jquery 来实现(无需任何选择器插件/扩展):

var $divs = $('div[data-role="page"]:not([internal-page="true"])');

DEMO

【讨论】:

  • 不。也是 6. 但我发现出了什么问题......我在其他脚本分配 data-internal-page 之前打电话
  • 对不起。我总共有 6 个 div 元素,其中 5 个具有第二个属性,不应包含在选择中。
  • 好吧,选择器工作正常,只是,正如你所描述的,你的属性没有设置的问题。
【解决方案3】:

Timing... 我正在调用选择器 correclty,但在分配第二个属性之前。像这样设置超时显示如下:

window.setTimeout(function() {
    console.log( $('div:jqmData(role="page")').not('div:jqmData(internal-page="true")').length );       
    },500);

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 2014-12-18
    • 2016-11-10
    相关资源
    最近更新 更多