那是因为 HTML 元素上没有 data-detail 属性。
这里有一个关于.data()、.prop()和.attr()的简要说明:
DOM元素是一个对象,它具有来自DOM
的方法
和属性
以及渲染HTML
的属性
。其中一些属性
通过attributes
获取它们的初始值
。
例如:id -> id,class -> className,title -> title,style -> style等等。
考虑这个元素: <input type="checkbox" checked data-detail="somedata" >
以下操作的结果将是:
$('input').prop('id'); // => " "-empty string, property id exist on the element (defined by DOM) , but is not set.
$('input').attr('id');// => undefined - doesn't exist.
如果您执行以下操作:
$('input').attr('id',"someID");
$('input').prop('id');
$('input').attr('id');
并且:
还有:
$('input').prop('id',"someOtherID");
$('input').prop('id');
$('input').attr('id');
因此,一些属性和属性值具有
1:1映射(更改属性的结果会更改属性值,反之亦然)。
考虑以下内容:
<input type="text" data-detail="somedata" value="someValue">
$('input').prop('value'); // => "someValue"
$('input').val(); // => "someValue"
$('input').attr('value'); // => "someValue"
如果你这样做:
$('input').prop('value','newVal');
$('input').val('newVal');
$('input').prop('value');
$('input').val();
$('input').attr('value');
1) 如何获取:
- 请注意,属性名称
是 data-*
,而属性值
是 dataset
,因此:
<input type="checkbox" data-detail="somedata" >
$('input')[0].dataset;
$('input')[0].dataset.detail;
$('input').prop('dataset');
$('input').prop('dataset').detail;
$('input').data('detail');
$('input').attr('data-detail');
2) 如何设置:
I) $('input').prop('dataset').detail='新数据';
$('input').prop('dataset');
$('input').prop('dataset').detail;
$('input').attr('data-detail');
$('input').data('detail');
II) $('input').attr('data-detail','新数据');
$('input').prop('dataset');
$('input').prop('dataset').detail;
$('input').attr('data-detail');
$('input').data('detail');
因此,您可以看到这里有1:1映射,属性更改反映在属性上,反之亦然。
但请注意第三种方式:
III) $('input').data('detail','newData');
$('input').prop('dataset');
$('input').prop('dataset').detail;
$('input').attr('data-detail');
$('input').data('detail');
那么,这里发生了什么?
$(elem).data(key, value)
不会更改元素的 HTML5 data-*
属性。它在内部将其值存储在 $.cache
中。
因此,如果要获取 data-*
,使用 .data()
永远不会出错:
$(".saveBtn").on("click", function() {
var saveBtn = $(this);
var detail = saveBtn.data("detail");
var relevantInput = saveBtn.parent().next();
var value = relevantInput.prop("value");
});