programing

j데이터 속성 값을 기반으로 요소를 찾는 방법을 쿼리합니까?

stoneblock 2023. 5. 19. 23:57

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.

내가 뭘 놓쳤는지 생각나는 거 있어요?

의 가치를 주입해야 합니다.currentAttribute 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