jQuery Data() API를 사용하여 데이터 속성을 설정할 수 없습니다.
MVC 뷰에는 다음 필드가 있습니다.
@Html.TextBoxFor(model => model.Course.Title, new { data_helptext = "Old Text" })</span>
에서 의 js 에서 하고 를 설정하고 .data-helptext
문자열 값에 속성을 지정합니다.제 암호는 이렇습니다.
alert($(targetField).data("helptext"));
$(targetField).data("helptext", "Testing 123");
alert()
호출은 정상적으로 작동하며 경고 대화 상자에 "이전 텍스트" 텍스트가 표시됩니다.만,그를 data-helptext
"Testing 123" 속성이 " Text는 여전히"이전 텍스트"는 여전히 속성의 현재 값입니다.
통화를 데이터()에 잘못 사용하고 있습니까?제가 이걸 인터넷에서 찾아봤는데 제가 뭘 잘못하고 있는지 모르겠어요.
HTML 마크업은 다음과 같습니다.
<input data-helptext="Old Text" id="Course_Title" name="Course.Title" type="text" value="" />
문서에 언급되어 있습니다.
데이터 속성은 데이터 속성에 처음 액세스할 때 풀링되고 더 이상 액세스 또는 변형되지 않습니다(모든 데이터 값은 jQuery에 내부적으로 저장됨).
jQuery $.fn.data()로 변경하면 해당 html 5 data-* 속성을 업데이트하지 않는 이유에 대해서도 다루었습니다.
아래 제 원래 답변에 대한 데모가 더 이상 작동하지 않는 것 같습니다.
업데이트된 답변
다시 말하지만, 문서에서
내장 대시를 사용한 속성 처리는 jQuery 1.6에서 W3C HTML5 사양에 맞게 변경되었습니다.
는.<div data-role="page"></div>
은 참입니다입니다.$('div').data('role') === 'page'
저는 그것을 꽤 확신합니다.$('div').data('data-role')
과거에는 일했지만 이제는 그렇지 않은 것 같습니다.콘솔을 열지 않고 HTML에 기록하는 더 나은 쇼케이스를 만들고 다중 하이픈을 camelCase 데이터 속성으로 변환하는 예를 추가했습니다.
또한 jQuery Data vsAtr?
HTML
<div id="changeMe" data-key="luke" data-another-key="vader"></div>
<a href="#" id="changeData"></a>
<table id="log">
<tr><th>Setter</th><th>Getter</th><th>Result of calling getter</th><th>Notes</th></tr>
</table>
자바스크립트 (jQuery 1.6.2+)
var $changeMe = $('#changeMe');
var $log = $('#log');
var logger;
(logger = function(setter, getter, note) {
note = note || '';
eval('$changeMe' + setter);
var result = eval('$changeMe' + getter);
$log.append('<tr><td><code>' + setter + '</code></td><td><code>' + getter + '</code></td><td>' + result + '</td><td>' + note + '</td></tr>');
})('', ".data('key')", "Initial value");
$('#changeData').click(function() {
// set data-key to new value
logger(".data('key', 'leia')", ".data('key')", "expect leia on jQuery node object but DOM stays as luke");
// try and set data-key via .attr and get via some methods
logger(".attr('data-key', 'yoda')", ".data('key')", "expect leia (still) on jQuery object but DOM now yoda");
logger("", ".attr('key')", "expect undefined (no attr <code>key</code>)");
logger("", ".attr('data-key')", "expect yoda in DOM and on jQuery object");
// bonus points
logger('', ".data('data-key')", "expect undefined (cannot get via this method)");
logger(".data('anotherKey')", ".data('anotherKey')", "jQuery 1.6+ get multi hyphen <code>data-another-key</code>");
logger(".data('another-key')", ".data('another-key')", "jQuery < 1.6 get multi hyphen <code>data-another-key</code> (also supported in jQuery 1.6+)");
return false;
});
$('#changeData').click();
원답
다음 HTML의 경우:
<div id="foo" data-helptext="bar"></div>
<a href="#" id="changeData">change data value</a>
그리고 이 자바스크립트 (jQuery 1.6.2 포함)
console.log($('#foo').data('helptext'));
$('#changeData').click(function() {
$('#foo').data('helptext', 'Testing 123');
// $('#foo').attr('data-helptext', 'Testing 123');
console.log($('#foo').data('data-helptext'));
return false;
});
Chrome DevTools Console을 사용하여 DOM 검사,$('#foo').data('helptext', 'Testing 123');
콘솔에 표시된 것처럼 값을 업데이트하지는 않지만$('#foo').attr('data-helptext', 'Testing 123');
저는 심각한 문제가 있었습니다.
.data('property', value);
은 하지 를 .data-property
기여하다.
jQuery's 사용 시작:
일치하는 요소 집합의 첫 번째 요소에 대한 속성 값을 가져오거나 일치하는 모든 요소에 대해 하나 이상의 속성을 설정합니다.
.attr('property', value)
값을 설정하고
.attr('property')
값을 회수할 수 있습니다.
이제는 효과가 있어요!
@andyb의 대답에 작은 버그가 있습니다.위의 그의 글에 대한 제 의견에 더해서...
다음 HTML의 경우:
<div id="foo" data-helptext="bar"></div>
<a href="#" id="changeData">change data value</a>
다음과 같이 속성에 액세스해야 합니다.
$('#foo').attr('data-helptext', 'Testing 123');
하지만 이와 같은 데이터 방식은 다음과 같습니다.
$('#foo').data('helptext', 'Testing 123');
.data() 메서드에 대한 위의 수정은 "정의되지 않음"을 방지하고 데이터 값이 업데이트됩니다(HTML은 그렇지 않음).
"data" 속성의 포인트는 요소와 값을 바인딩(또는 "link")하는 것입니다.매우 유사합니다.onclick="alert('do_something')"
동작을 요소에 묶는 속성...텍스트는 쓸모가 없습니다. 당신은 그들이 요소를 클릭할 때 작업이 작동하기를 원할 뿐입니다.
데이터나 작업이 요소에 바인딩되면 일반적으로 HTML을 업데이트할 필요가 없으며, 오직 데이터나 메서드만 업데이트할 수 있습니다. 왜냐하면 응용 프로그램(JavaScript)에서는 이를 사용하기 때문입니다.성능 측면에서 HTML을 업데이트하려는 이유를 모르겠습니다. (파이어버그나 다른 콘솔을 제외하고) HTML 속성을 보는 사람은 아무도 없습니다.
생각해 볼 수 있는 한 가지 방법:HTML(속성과 함께)은 텍스트일 뿐입니다.자바스크립트가 사용하는 데이터, 함수, 객체 등은 별도의 평면에 존재합니다.자바스크립트가 지시를 받아야만 HTML 텍스트를 읽거나 업데이트할 수 있지만, 자바스크립트로 만든 모든 데이터와 기능은 Firebug(또는 다른) 콘솔에서 볼 수 있는 HTML 텍스트/속성과 완전히 별개로 작동합니다.
*저는 보통 HTML을 저장하고 내보내야 할 경우(예: 마이크로 포맷/데이터 인식 텍스트 편집기의 일종) HTML을 다른 페이지에 새로 로드하는 경우 HTML도 업데이트해야 할 수 있기 때문에 강조합니다.
저도 마찬가지에요.알고보니.
var data = $("#myObject").data();
삭제할 수 없는 개체를 제공합니다.다음을 사용하여 해결했습니다.
var data = $.extend({}, $("#myObject").data());
그리고 그때부터.data
쓰기 가능한 표준 JS 객체였습니다.
인용하기:
데이터 속성은 데이터 속성에 처음 액세스할 때 풀링되고 더 이상 액세스되거나 변형되지 않습니다(모든 데이터 값은 내부적으로 jQuery에 저장됨).
이(솔직히 이상한) 제한은 사용에 대해서만 보류됩니다..data()
.
해결책? 사용하기.attr
대신.
물론, 여러분 중 몇몇은 전용 방법을 사용하지 않는 것에 불편함을 느낄 수 있습니다.다음 시나리오를 생각해 보십시오.
- 사용자 지정 속성의 데이터 부분이 더 이상 필요하지 않도록 '표준'이 업데이트됩니다./교체됩니다.
상식 - 왜 이미 설정된 속성을 그렇게 바꾸려고 하는 거지?상상해보세요.class
그룹으로 이름 변경을 시작합니다.id
신원을 확인할 수 있습니다.인터넷이 끊길 겁니다.
그리고 심지어 그 때도, 자바스크립트 자체가 이 문제를 해결할 수 있는 기능을 가지고 있습니다. 물론 HTML과 호환되지 않는 것으로 악명이 높지만, REGEX(그리고 비슷한 다양한 방법들)는 여러분의 속성을 이 새로운 신화적인 '표준'으로 빠르게 이름을 바꿀 수 있습니다.
TL;DR
alert($(targetField).attr("data-helptext"));
대로..data()
는로을지data-
attribute,과우된을를은(를을e)el,tf한과,은data-
속성 변경
제 솔루션은 속성의 현재 값과 실제로 일치하는 메서드로 jQuery를 확장하는 것이었습니다.
// Alternative to .data() that updates data- attributes, and reads their current value.
(function($){
$.fn.realData = function(name,value) {
if (value === undefined) {
return $(this).attr('data-'+name);
} else {
$(this).attr('data-'+name,value);
}
};
})(jQuery);
참고: 물론 사용할 수 있습니다..attr()
, 하지만 내 경험으로는 대부분의 개발자들(일명 나)이 보는 실수를 합니다..attr()
그리고..data()
서로 교환할 수 있고, 종종 생각 없이 하나를 다른 것으로 대체합니다.대부분의 경우 효과가 있겠지만, 특히 모든 종류의 동적 데이터 바인딩을 처리할 때 버그를 도입할 수 있는 좋은 방법입니다.그래서 이렇게 해서..realData()
된 행동에 좀 더 수 즉, 된 하게 에 하게 된 에
같은 문제가 있었습니다..data() 메서드를 사용하여 데이터를 얻을 수 있으므로 요소에 쓸 방법만 파악하면 됩니다.이것이 제가 사용하는 도우미 방법입니다.대부분의 사람들이 말했듯이 .attr을 사용해야 합니다.제가 알기로는 아무 것이나 _ 로 교체하고 있습니다.다른 캐릭터를 대체하는 건...그러나 나는 그것을 조사하지 않았습니다.
function ExtendElementData(element, object){
//element is what you want to set data on
//object is a hash/js-object
var keys = Object.keys(object);
for (var i = 0; i < keys.length; i++){
var key = keys[i];
$(element).attr('data-'+key.replace("_", "-"), object[key]);
}
}
편집: 2017년 5월 1일
내장된 메소드를 사용하여 정확한 데이터를 얻을 수 없는 경우가 여전히 있다는 것을 발견하여 지금 사용하는 방법은 다음과 같습니다.
function setDomData(element, object){
//object is a hash
var keys = Object.keys(object);
for (var i = 0; i < keys.length; i++){
var key = keys[i];
$(element).attr('data-'+key.replace("_", "-"), object[key]);
}
};
function getDomData(element, key){
var domObject = $(element).get(0);
var attKeys = Object.keys(domObject.attributes);
var values = null;
if (key != null){
values = $(element).attr('data-' + key);
} else {
values = {};
var keys = [];
for (var i = 0; i < attKeys.length; i++) {
keys.push(domObject.attributes[attKeys[i]]);
}
for (var i = 0; i < keys.length; i++){
if(!keys[i].match(/data-.*/)){
values[keys[i]] = $(element).attr(keys[i]);
}
}
}
return values;
};
언급URL : https://stackoverflow.com/questions/6827810/unable-to-set-data-attribute-using-jquery-data-api
'programing' 카테고리의 다른 글
.apk 패키지 내의 AndroidManifest.xml 파일을 구문 분석하는 방법 (0) | 2023.09.11 |
---|---|
Node.js 스크립트에 적합한 hashbang (0) | 2023.09.06 |
JUNIT-Spring @Asyncvoid 서비스 방법 (0) | 2023.09.06 |
jquery를 한 기능이 끝날 때까지 기다렸다가 다른 기능을 실행하려면 어떻게 해야 합니까? (0) | 2023.09.06 |
특별한 경우:%보다 빠릅니까? (0) | 2023.09.06 |