J'ai un peu de mal à comprendre pourquoi mon code ne fonctionne pas. Dans l'exemple ci-dessous html, j'ai trois éléments d'onglet de navigation. J'essaye de cibler le deuxième élément (onglet Produits) afin d'apporter les modifications suivantes:
Je sais que cela peut facilement être fait en modifiant le CSS et le HTML, mais j'essaie de le faire en utilisant uniquement jQuery.
Dans mon script, j'essaie de créer une variable jQuery puis utilisez les méthodes .hover et .find dessus, mais j'obtiens toujours l'erreur ".find -or- .hover n'est pas une fonction".
De plus, il se peut que je veuille ajouter plus d'onglets au début de la barre de navigation ultérieurement, donc je ne veux pas utiliser quelque chose comme un sélecteur de classe et cibler le deuxième élément, car lorsque j'ajoute plus d'onglets plus tard, cela finira par ne pas cibler l'onglet Produits. par exemple ...
<nav>
<div class="nav-tab">
<a class="nav-link" data-name="About">
<div class="item-menu">
<span>About</span>
</div>
</a>
</div>
<div class="nav-tab">
<a class="nav-link" data-name="Products">
<div class="item-menu">
<span>Products</span>
</div>
</a>
</div>
<div class="nav-tab">
<a class="nav-link" data-name="Contact">
<div class="item-menu">
<span>Contact</span>
</div>
</a>
</div>
</nav>
<script>
$( document ).ready(function() {
let products = $( ".nav-tab" ).has( '[data-name="Products"]' ).get( 0 );
products.hover(
function() {$(this).addClass("red-border")},
function() {$(this).removeClass("red-border")}
);
products.find('span').innerText="Merchandise";
});
</script>
Je suis sûr qu'il existe un moyen simple de le faire. Quelqu'un pourrait-il s'il vous plaît donner quelques conseils sur la meilleure façon d'apporter les modifications en utilisant simplement jQuery? Merci d'avance!
J'ai créé un exemple de fiddle
$( ".nav-tab" )[1].hover...
4 Réponses :
Essayez ceci:
$( document ).ready(function() {
var products = $(".nav-tab a[data-name=Products]");
$(products).hover(function(){
$(this).addClass('red-border');
}, function(){
$(this).removeClass('red-border');
});
$('span',products)[0].innerText="Merchandise";
});
Les réponses basées uniquement sur le code ne sont pas utiles. Qu'est-ce que tu as fait? Pourquoi ça marche? Pensez à ajouter quelques commentaires / description / explication de ce que vous avez fait et pourquoi.
Lorsque vous utilisez $ (". nav-tab") [1] vous échappez le wrapper de jQuery autour de l'objet, c'est pourquoi il ne permet pas d'utiliser des éléments liés à jQuery, non testés mais vous pouvez essayer de corriger cela en l'enveloppant à nouveau comme $ ($ (". nav-tab") [1]). hover (), mais ce n'est pas la façon dont vous devriez le faire.
La meilleure façon serait pour utiliser une combinaison du sélecteur CSS et de la fonction .parent () de jQuery, comme ceci:
products.find("span").text("Merchandise");
De cette façon, vous sélectionnez simplement le premier parent de l'élément trouvé ci-dessus.
Peut également ajouter un sélecteur spécifique ci-dessus pour le faire comme ceci (pas obligatoire cependant):
let products = $("[data-name='Products']").parent(".nav-tab");
https://api.jquery.com/parent/
Et pour les modifications de texte, utilisez simplement la fonction .text () de jQuery :
let products = $("[data-name='Products']").parent();
https://api.jquery.com / text /
Peut également vérifier ceci pour savoir comment sélectionner le premier objet parmi de nombreux objets avec jQuery https://api.jquery.com/first/
EDIT : Puisque vous obtenez le deuxième objet, le .first () ci-dessus n'est pas pertinent, .get () est ce que vous voulez, mais ce n'est toujours pas la façon dont vous devriez le faire, car comme vous mentionné si vous ajoutez un autre onglet de navigation, cela gâchera tout.
Utilisez ce code:
$( document ).ready(function() {
var products = $( ".nav-tab").find("[data-name='Products']");
products
.mouseover(function(){
$(this).find("span").text("Merchandise").closest(".nav-tab").addClass("red-border");
})
.mouseout(function(){
$(this).parent(".nav-tab").removeClass("red-border");
//Again if you want to replace "Merchandise" to "Product" then active this commanded line
//$(this).closest(".nav-tab").removeClass("red-border").find("span").text("Products");
});
});
J'ai mis à jour votre code dans Fiddler: https://jsfiddle.net/Arif2009/gksoynLq/31/
Lorsque vous utilisez ... .get (0) code > (ou ... [0] ) vous déréférencer l'objet jQuery, le transformant ainsi en un objet JavaScript simple. Aucun objet ne peut être "vu" par les méthodes de l'autre. N'utilisez pas .get (0) , il suffit généralement de stocker un objet jQuery dans une variable seule.
La méthode IMO .hover () est problématique et est facilement remplacée par la pseudo-classe CSS : hover . En tant que solution jQuery, la méthode .on () avec les événements mouseenter et mouseleave est meilleure afin que vous puissiez gérer chaque événement séparément. .innerText est une propriété JavaScript simple qui ne reconnaît pas les objets jQuery, utilisez plutôt la méthode jQuery .text () .
Aussi, au lieu de CSS border , utilisez plutôt outline . contour n'ajoute pas sa longueur tandis que border provoque ainsi le décalage des éléments voisins.
Détails commentés dans la démo.
<nav>
<div class="nav-tab">
<a class="nav-link" data-name="About">
<div class="item-menu">
<span>About</span>
</div>
</a>
</div>
<div class="nav-tab">
<a class="nav-link" data-name="Products">
<div class="item-menu">
<span>Products</span>
</div>
</a>
</div>
<div class="nav-tab">
<a class="nav-link" data-name="Contact">
<div class="item-menu">
<span>Contact</span>
</div>
</a>
</div>
</nav>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
.red-border {
outline: 3px dashed red
}
$(document).ready(function() {
// Reference as a jQuery Object
const products = $('[data-name="Products"]');
// Register both events on element...
products.on('mouseenter mouseleave', function(event) {
// if the type of event is 'mouseenter...
if (event.type === 'mouseenter') {
// Get it's descendant <span>, change it's text, then add .red-border to it
$(this).find('span').text("Merchandise").addClass("red-border");
// Otherwise do the opposite
} else {
$(this).find('span').text("Product").removeClass("red-border");
}
});
});
c'est ce que tu veux ? jsfiddle.net/kLev24gy
Lorsque vous utilisez
.get (0), vous déréférencer l'objet jQuery, le transformant ainsi en un objet JavaScript simple. Aucun objet ne peut être "vu" par les méthodes de l'autre.