Lir*_*n H 7 html javascript jquery prop attr
我只想从两个元素中获取几个属性.value从input元素获取属性按预期工作.问题是data-detail从button元素获取属性属性.它undefined在使用时返回.prop(),但在使用时按预期工作.attr().
任何人都可以解释我目睹的这种奇怪的行为吗?
HTML
<div class="formRow">
<label for="firstName">First name</label>
<div class="detailsControlBtns">
<button id="editFirstName" class="btn ctaBtn greenBtn editBtn">Edit</button>
<button class="btn ctaBtn greenBtn saveBtn" data-detail="firstName">Save</button>
<button id="closeFirstName" class="btn ctaBtn greyBtn closeBtn">Close</button>
</div>
<input type="text" id="firstName" name="firstName" value="[+firstName+]" readonly>
</div>
Run Code Online (Sandbox Code Playgroud)
JS
$(".saveBtn").on("click", function() {
var saveBtn = $(this);
// The following statement yields undefined. When using .attr() it works as expected.
var detail = saveBtn.prop("data-detail");
var relevantInput = saveBtn.parent().next();
// The following statement works as expected.
var value = relevantInput.prop("value");
// ...
});
Run Code Online (Sandbox Code Playgroud)
The*_*ess 18
那是因为HTML元素上没有 data-detail 属性.
下面是一个快速的解释.数据() ,.prop()和.attr() :
DOM元素是一个对象,其具有methods,和properties(从DOM)和attributes(从所呈现的HTML).其中一些人通过考虑这个元素properties得到他们:
以下结果将是:initial valueattributes
id->id, class->className, title->title, style->style etc.
<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.
Run Code Online (Sandbox Code Playgroud)
$('input').attr('id',"someID");
$('input').prop('id'); // => "someID"
$('input').attr('id'); // => "someID"
Run Code Online (Sandbox Code Playgroud)
并且:
$('input').prop('id',"someOtherID");
$('input').prop('id');// => "someOtherID"
$('input').attr('id');// => "someOtherID"
Run Code Online (Sandbox Code Playgroud)
因此,某些属性和属性具有1:1映射.(改变支柱的attr结果变化,反之亦然).
<input type="text" data-detail="somedata" value="someValue">
$('input').prop('value'); // => "someValue"
$('input').val(); // => "someValue"
$('input').attr('value'); // => "someValue"
Run Code Online (Sandbox Code Playgroud)
如果你这样做:
$('input').prop('value','newVal');
// or
$('input').val('newVal');
$('input').prop('value'); // => "newVal" -value of the property
$('input').val(); // => "newVal" -value of the property
$('input').attr('value'); // => "someValue" -value of the attr didn't change, since in this case it is not 1:1 mapping (change of the prop value doesn't reflect to the attribute value).
Run Code Online (Sandbox Code Playgroud)
1)如何获得:
-有想法那attribute name是data-* 和property name是dataset,那么:
<input type="checkbox" data-detail="somedata" >
Run Code Online (Sandbox Code Playgroud)
$('input')[0].dataset; //=> [object DOMStringMap] { detail: "somedata"}
$('input')[0].dataset.detail; // => "somedata"
$('input').prop('dataset'); //=>[object DOMStringMap] { detail: "somedata"}
$('input').prop('dataset').detail; // => "somedata"
$('input').data('detail'); // => "somedata"
$('input').attr('data-detail'); // => "somedata"
Run Code Online (Sandbox Code Playgroud)
2)如何设置:
一世) $('input').prop('dataset').detail='newData';
$('input').prop('dataset'); //=> [object DOMStringMap] { detail: "newData"}
$('input').prop('dataset').detail; // => "newData"
$('input').attr('data-detail'); // => "newData"
$('input').data('detail'); // => "newData"
Run Code Online (Sandbox Code Playgroud)
II) $('input').attr('data-detail','newData');
$('input').prop('dataset'); //=> [object DOMStringMap] { detail: "newData"}
$('input').prop('dataset').detail; // => "newData"
$('input').attr('data-detail'); // => "newData"
$('input').data('detail'); // => "newData"
Run Code Online (Sandbox Code Playgroud)
所以你可以看到这里是1:1映射,attr变化反映了prop,反之亦然.
但检查第三种方式:
III) $('input').data('detail','newData');
$('input').prop('dataset'); // => [object DOMStringMap] { detail: "somedata"}
$('input').prop('dataset').detail; // => "somedata"
$('input').attr('data-detail'); // => "somedata"
$('input').data('detail'); // => "newData" <-----******
Run Code Online (Sandbox Code Playgroud)
那么,这里发生了什么?
$(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");
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6930 次 |
| 最近记录: |