Javascript 使用jQuery,如何在元素上或元素内查找数据属性?(树遍历)

Javascript 使用jQuery,如何在元素上或元素内查找数据属性?(树遍历),javascript,jquery,html,dom,Javascript,Jquery,Html,Dom,我有几个未知元素(可以是span、input、select、div等等): 使用$myControl是否有办法找到给定数据属性的存在和/或值 我试过: var isDirty = $myControl.find(':has([data-is-dirty]').data('is-dirty'); 如有任何建议,将不胜感激 var isDirty = $myControl.find('[data-is-dirty]'); 小提琴:礼貌:胡言乱语 要选择$myControl本身(如果脏): 或者

我有几个未知元素(可以是span、input、select、div等等):

使用$myControl是否有办法找到给定数据属性的存在和/或值

我试过:

 var isDirty = $myControl.find(':has([data-is-dirty]').data('is-dirty');
如有任何建议,将不胜感激

var isDirty = $myControl.find('[data-is-dirty]');
小提琴:礼貌:胡言乱语

要选择
$myControl
本身(如果脏):

或者更好:

var isDirty = $myControl.parent().find('[data-is-dirty]');

我可以考虑在不使用其他元素的情况下使用它。不是他们中任何一个的粉丝,也许这会激励其他人

var horrible1 = $("#test").find("*").andSelf().filter("[data-is-dirty]").length;

var horrible2 = $("#test").find("[data-is-dirty]").andSelf().filter("[data-is-dirty]").length;


var elem = $("#test");
var horrible3 = elem.parent().find("#" + elem.attr("id") + "[data-is-dirty], #" + elem.attr("id") + " [data-is-dirty]").length;

var elem = $("#test");
var horrible4 = elem.find("[data-is-dirty]").add(elem.filter("[data-is-dirty]")).length;

var horrible5 = $("[data-is-dirty]").filter( "#test, #test *" ).length;

$(“[data='data-is-dirty']”)
,如果要排除父div,只需使用
.not(“#SomeControl”)

试试这个

[编辑]同样的想法,如果您不知道元素id:

var isDirty=$someControl.data("is-dirty")||$("[data-is-dirty]",$someControl).data("is-dirty");

您是否尝试过
.find(“[数据是脏的]”)
?您最好分两步进行。它可以在一行中完成,但不好。这可以工作,但我不喜欢:var isDirty=$myControl.parent().find(“[data is dirty]”)。data('is-dirty');因为您不能在同一元素中拥有控件。@Rodney为什么不呢?还有什么更优雅的解决方案?你的解决方案有效+1也许你被否决是因为你没有投JSFIDLE。。?无论如何,这里有一个你可以补充你的答案-@胡言乱语被否决了,因为即使我的解决方案有效,你也不给我一把小提琴?lolYes,我同意-你不应该被否决(不是我做的!)请随意将我创建的JSFIDLE添加到你的答案中。这不起作用,如果第一级有dirty属性,它将失败!AKA如果$myControl有它。@Rodney即使属性位于顶部,也只需使用.not(),因为您删除了另一个属性<代码>应该是匹配的。你把它排除在外。这就是问题的重点。它需要和孩子们匹配。这是一个有趣的小问题。我猜你刚刚否决了我您想将家长包括在内还是排除在外??您确定您理解了问题,如果理解,请解释!我无法使用该ID。我正在编写一个自定义用户控件,但我无权访问该ID。用户可以将该ID设置为他们想要的任何值。@Rodney ok,我已重写表达式,改为使用$someControl。
var isDirty = $myControl.parent().find('[data-is-dirty]');
var horrible1 = $("#test").find("*").andSelf().filter("[data-is-dirty]").length;

var horrible2 = $("#test").find("[data-is-dirty]").andSelf().filter("[data-is-dirty]").length;


var elem = $("#test");
var horrible3 = elem.parent().find("#" + elem.attr("id") + "[data-is-dirty], #" + elem.attr("id") + " [data-is-dirty]").length;

var elem = $("#test");
var horrible4 = elem.find("[data-is-dirty]").add(elem.filter("[data-is-dirty]")).length;

var horrible5 = $("[data-is-dirty]").filter( "#test, #test *" ).length;
var isDirty=$("#SomeControl[data-is-dirty],#SomeControl [data-is-dirty]").data('is-dirty');
var isDirty=$someControl.data("is-dirty")||$("[data-is-dirty]",$someControl).data("is-dirty");