j데이터 속성 값을 기반으로 요소를 찾는 방법을 쿼리합니까?
다음과 같은 시나리오가 있습니다.
var el = 'li';
그리고 5개가 있습니다.<li>
각각의 페이지에 있습니다.data-slide=number
속성(각각 1, 2, 3, 4, 5인 숫자).
이제 매핑된 현재 활성 슬라이드 번호를 찾아야 합니다.var current = $('ul').data(current);
슬라이드가 변경될 때마다 업데이트됩니다.
지금까지 현재 슬라이드와 일치하는 셀렉터를 구성하는 데 실패했습니다.
$('ul').find(el+[data-slide=+current+]);
일치하는 항목이 없습니다.
하드코드를 할 수 없는 이유는li
필요한 경우 다른 요소로 변경할 수 있는 사용자 액세스 가능 변수이기 때문에 항상 다음과 같은 변수가 아닐 수 있습니다.li
.
내가 뭘 놓쳤는지 생각나는 거 있어요?
의 가치를 주입해야 합니다.current
Attribute Equals(속성 동일) 선택기로:
$("ul").find(`[data-slide='${current}']`)
이전 JavaScript 환경(ES5 및 이전 버전)의 경우:
$("ul").find("[data-slide='" + current + "']");
이 모든 것을 입력하지 않으려는 경우 다음은 데이터 속성별로 쿼리할 수 있는 더 짧은 방법입니다.
$("ul[data-slide='" + current +"']");
참고로: http://james.padolsey.com/javascript/a-better-data-selector-for-jquery/
[data-x=...]로 검색할 때 jQuery.data(...) setter에서 작동하지 않습니다.
$('<b data-x="1">' ).is('[data-x=1]') // this works
> true
$('<b>').data('x', 1).is('[data-x=1]') // this doesn't
> false
$('<b>').attr('data-x', 1).is('[data-x=1]') // this is the workaround
> true
대신 다음을 사용할 수 있습니다.
$.fn.filterByData = function(prop, val) {
return this.filter(
function() { return $(this).data(prop)==val; }
);
}
$('<b>').data('x', 1).filterByData('x', 1).length
> 1
JQuery, ES6 사용 안 함
document.querySelectorAll(`[data-slide='${CSS.escape(current)}']`);
질문이 JQuery에 관한 것이라는 것은 알지만 독자들은 순수한 JS 방법을 원할 수도 있습니다.
싸이코브름의 filterByData를 jQuery로 확장하여 개선하였습니다.
이전 확장명이 키-값 쌍에서 검색된 경우 이 확장명을 사용하여 값에 관계없이 데이터 속성의 존재 여부를 추가로 검색할 수 있습니다.
(function ($) {
$.fn.filterByData = function (prop, val) {
var $self = this;
if (typeof val === 'undefined') {
return $self.filter(
function () { return typeof $(this).data(prop) !== 'undefined'; }
);
}
return $self.filter(
function () { return $(this).data(prop) == val; }
);
};
})(window.jQuery);
용도:
$('<b>').data('x', 1).filterByData('x', 1).length // output: 1
$('<b>').data('x', 1).filterByData('x').length // output: 1
// test data
function extractData() {
log('data-prop=val ...... ' + $('div').filterByData('prop', 'val').length);
log('data-prop .......... ' + $('div').filterByData('prop').length);
log('data-random ........ ' + $('div').filterByData('random').length);
log('data-test .......... ' + $('div').filterByData('test').length);
log('data-test=anyval ... ' + $('div').filterByData('test', 'anyval').length);
}
$(document).ready(function() {
$('#b5').data('test', 'anyval');
});
// the actual extension
(function($) {
$.fn.filterByData = function(prop, val) {
var $self = this;
if (typeof val === 'undefined') {
return $self.filter(
function() {
return typeof $(this).data(prop) !== 'undefined';
});
}
return $self.filter(
function() {
return $(this).data(prop) == val;
});
};
})(window.jQuery);
//just to quickly log
function log(txt) {
if (window.console && console.log) {
console.log(txt);
//} else {
// alert('You need a console to check the results');
}
$("#result").append(txt + "<br />");
}
#bPratik {
font-family: monospace;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="bPratik">
<h2>Setup</h2>
<div id="b1" data-prop="val">Data added inline :: data-prop="val"</div>
<div id="b2" data-prop="val">Data added inline :: data-prop="val"</div>
<div id="b3" data-prop="diffval">Data added inline :: data-prop="diffval"</div>
<div id="b4" data-test="val">Data added inline :: data-test="val"</div>
<div id="b5">Data will be added via jQuery</div>
<h2>Output</h2>
<div id="result"></div>
<hr />
<button onclick="extractData()">Reveal</button>
</div>
또는 바이올린: http://jsfiddle.net/PTqmE/46/
jQuery 및 data-* 속성을 사용하여 요소를 가져오는 동안 동일한 문제에 직면했습니다.
참고로 가장 짧은 코드는 다음과 같습니다.
다음은 내 HTML 코드입니다.
<section data-js="carousel"></section>
<section></section>
<section></section>
<section data-js="carousel"></section>
내 jQuery 선택기입니다.
$('section[data-js="carousel"]');
// this will return array of the section elements which has data-js="carousel" attribute.
이 선택기$("ul [data-slide='" + current +"']");
다음 구조에서 작동합니다.
<ul><li data-slide="item"></li></ul>
이 동안에$("ul[data-slide='" + current +"']");
다음에 사용할 수 있습니다.
<ul data-slide="item"><li></li></ul>
$("ul").find("li[data-slide='" + CSS.escape(current) + "']");
이것이 더 잘 되기를 바랍니다.
감사해요.
요소 유형을 미리 알지 못한 상태에서 이 작업을 수행하는 방법에 대한 원래 질문으로 돌아가면 다음과 같습니다.
$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");
언급URL : https://stackoverflow.com/questions/4191386/jquery-how-to-find-an-element-based-on-a-data-attribute-value
'programing' 카테고리의 다른 글
넷캣을 사용하는 최소 웹 서버 (0) | 2023.05.19 |
---|---|
ListBox에서 세로 스크롤 막대를 가져오려면 어떻게 해야 합니까? (0) | 2023.05.19 |
bash의 함수 내에서 글로벌 변수를 수정하는 방법은 무엇입니까? (0) | 2023.05.19 |
Bash 스크립트에서 예상을 사용하여 SSH 명령에 암호 제공 (0) | 2023.05.19 |
cmake에서 매크로의 정의를 추가하려면 어떻게 해야 합니까? (0) | 2023.05.19 |