Javascript prop()不';有些属性不起作用
我的html页面上有以下元素:Javascript prop()不';有些属性不起作用,javascript,jquery,Javascript,Jquery,我的html页面上有以下元素: <ul class="form-tabs"> <li class="active" data-bind="blah-blah-blah-1"> <li class="" data-bind="blah-blah-blah-2"> </ul> 日志中有两个未定义的。说明:对于尚未设置的属性值,或者如果匹配集没有元素,则返回未定义的。但是,请稍候,我的具有数据绑定属性!另外,当我尝试使用.prop('c
<ul class="form-tabs">
<li class="active" data-bind="blah-blah-blah-1">
<li class="" data-bind="blah-blah-blah-2">
</ul>
日志中有两个未定义的。说明:对于尚未设置的属性值,或者如果匹配集没有元素,则返回未定义的。但是,请稍候,我的
具有数据绑定
属性!另外,当我尝试使用.prop('class')
时,它可以完美地为我提供“活动的”
和“
我说“好”,然后写下:
$("ul.form-tabs > li").each(function (index, element) {
console.log(element.prop('data-bind'));
});
现在我有一个错误:TypeError:element.prop不是函数
所以,问题是:我做错了什么
另外,我使用jquery1.10.1和knockout。这会是一场冲突吗
p.p.S.感谢所有人,此代码工作完美:
$("ul.form-tabs > li").each(function (index, element) {
console.log($(element).attr('data-bind'));
});
“属性”和“属性”之间有区别。“属性”是直接在DOM节点上可用的东西;诸如“id”、“名称”、“标记名”等都是属性
HTML解析器无法识别为特定标记的标准属性的属性在DOM节点上不能作为属性使用。相反,必须通过.setAttribute()
和.getAttribute()
访问它们。在jQuery术语中,这意味着使用.attr()
而不是.prop()
data-*
属性的“家族”有点特殊,因为当请求相应的数据键时,jQuery.data()
机制将隐式地从这些属性中获取值。但是,它将通过setAttribute()
更新属性值。您是否需要它取决于代码的工作方式。当涉及的属性打算由另一个库解释时,那么这些更新需要如何工作取决于该库;可能根本不可能以这种方式处理问题,因为在最初处理元素之后,另一个库可能不会注意DOM属性值
无论如何,当使用.data()
访问数据-*
属性时,jQuery希望键看起来像数据-
前缀后面的属性名称部分。为了(我猜)方便起见,jQuery将把数据键的驼峰大小写版本视为等同于破折号分隔的版本。也就是说,如果HTML元素看起来像
<div id=x data-some-thing=whatever>
另一件需要注意的事情是:有时,将DOM节点属性的值作为属性值而不是属性值获取会得到不同的结果。一个重要的例子是
元素的href
属性或
标记的操作
属性。属性值(无论如何,在大多数浏览器中;可能全部)将被“规范化”,以反映在激活标记时将使用的实际URL。另一方面,属性值将保留最初从HTML源解析的内容。当客户端代码将自己的解释强加给这些类型的属性时,这一点很重要 您做错的第一件事是将属性和属性混为一谈。它们之间并不总是1:1的连接
使用jQueryObject.data('bind')
读取data bind
属性的值
第二件你做错了的事是期望jQuery中的this
每个
循环都是一个jQuery对象。它不是,它将是一个DOM对象
使用jQuery(this).data('prop')
使用data()
$('ul.form-tabs > li').each(function() {
console.log($(this).data('bind'));
});
请尝试$(元素)。prop()
.prop()
应该用于属性.attr()
更适合于数据绑定
使用.data('bind')
来获取数据绑定属性。还请注意Quentin的观察,您试图将DOM节点引用当作jQuery对象来使用。您知道Knockout是否会注意到它的一个指导属性的更新,就像这样吗?编辑-等待;也许这是今天关于更新这样的属性的另一个问题;这篇文章没有提到。
var withDashes = $("#x").data("some-thing");
var camelCase = $("#x").data("someThing");
$('ul.form-tabs > li').each(function() {
console.log($(this).data('bind'));
});