J'ai le scénario suivant:
var el = 'li';
et il y a 5 <li>
sur la page, chacun avec un attribut data-slide=number
(le nombre étant respectivement 1,2,3,4,5).
Je dois maintenant trouver le numéro de la diapositive actuellement actif qui est associé à var current = $('ul').data(current);
et qui est mis à jour à chaque changement de diapositive.
Jusqu'à présent, mes tentatives ont échoué, tentant de construire le sélecteur qui correspondrait à la diapositive actuelle:
$('ul').find(el+[data-slide=+current+]);
ne correspond/retourne rien…
La raison pour laquelle je ne peux pas coder en dur la partie li
est qu'il s'agit d'une variable accessible à l'utilisateur qui peut être remplacée par un élément différent si nécessaire. Par conséquent, il se peut que ce ne soit pas toujours un li
.
Des idées sur ce que je manque?
Vous devez injecter la valeur de current
dans un sélecteur attribut égal :
$("ul").find(`[data-slide='${current}']`)
Pour les anciens environnements JavaScript (ES5 et versions antérieures):
$("ul").find("[data-slide='" + current + "']");
au cas où vous ne voudriez pas taper tout cela, voici un moyen plus rapide d'interroger par attribut de données:
$("ul[data-slide='" + current +"']");
FYI: http://james.padolsey.com/javascript/a-better-data-selector-for-jquery/
Lors de la recherche avec [data-x = ...], faites attention, cela ne fonctionne pas avec 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
Vous pouvez utiliser ceci à la place:
$.fn.filterByData = function(prop, val) {
return this.filter(
function() { return $(this).data(prop)==val; }
);
}
$('<b>').data('x', 1).filterByData('x', 1).length
> 1
J'ai amélioré extension filterByData de psycho brm à jQuery.
Lorsque l'ancienne extension a été recherchée sur une paire clé-valeur, cette extension permet également de rechercher la présence d'un attribut de données, quelle que soit sa valeur.
(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);
Usage:
$('<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>
Ou le violon: http://jsfiddle.net/PTqmE/46/
J'ai rencontré le même problème lors de la récupération d'éléments à l'aide de jQuery et de l'attribut data- *.
donc pour votre référence le code le plus court est ici:
Ceci est mon code HTML:
<section data-js="carousel"></section>
<section></section>
<section></section>
<section data-js="carousel"></section>
Voici mon sélecteur jQuery:
$('section[data-js="carousel"]');
// this will return array of the section elements which has data-js="carousel" attribute.
document.querySelectorAll(`[data-slide='${current}']`);
Je sais que la question concerne JQuery, mais les lecteurs voudront peut-être une méthode JS pure.
$("ul").find("li[data-slide='" + current + "']");
J'espère que cela fonctionnera mieux
merci
Ce sélecteur $("ul [data-slide='" + current +"']");
fonctionnera pour la structure suivante:
<ul><li data-slide="item"></li></ul>
Alors que cette $("ul[data-slide='" + current +"']");
fonctionnera pour:
<ul data-slide="item"><li></li></ul>
Pour en revenir à sa question initiale, à savoir comment faire fonctionner ce travail sans connaître le type d'élément à l'avance, voici ce qui suit:
$(ContainerNode).find(el.nodeName + "[data-slide='" + current + "']");