2010-10-27 6 views
2

J'ai ce balisage HTMLjQuery: Déplacer les attributs entre les éléments

<a href="#" title=""> 
    <img src="#" title="image1" /> 
</a> 

<a href="#" title=""> 
    <img src="#" title="image2" /> 
</a> 

<a href="#" title=""> 
    <img src="#" title="image3" /> 
</a> 

et je dois prendre le titre de chaque image et de le mettre sur leur « une ». J'ai essayé de le faire avec cette fonction

$(function() { 

    var title = $('a').find('img'); 

    var updateTitle = title.attr('title'); 

    $('a').attr({ 
     title: updateTitle, 
     alt: 'lol' 
    }); 
}); 

Mais le seul résultat est le même titre pour tous « a » (le premier titre qu'il trouve)

Toute aide ????

Merci beaucoup

Répondre

0

Essayez ceci:

$('a').each(function() { 
    var title = $(this).find('img'); 

    var updateTitle = title.attr('title'); 

    $(this).attr({ 
     title: updateTitle, 
     alt: 'lol' 
    }); 
}; 

La méthode attr() agit uniquement sur le premier élément de l'ensemble enroulé. La même chose s'applique aux autres méthodes jQuery. L'utilisation de chaque méthode utilitaire est très pratique pour les cas comme celui-ci.

1
$(function() { 
    $('a > img').each(function() { 
     this.parentNode.title = this.title; 
     this.parentNode.alt = 'lol'; 
    }); 
}); 

ou

$(function() { 
    $('a:has(img)').attr('title', function() { 
     return $(this).children('img').attr('title'); 
    }).attr('alt', 'lol'); 
}); 
+0

Ceci est essentiellement le même que le mien, en arrière. Je pense que le mien aura de meilleures performances, car le sélecteur est plus simple ('a' vs' a> img'). Qu'est-ce que tu penses? – lonesomeday

+0

@lonesomeday - Le problème est que 'firstChild' échouera dans les navigateurs compatibles W3C, car le premier enfant sera un nœud de texte vide, alors que dans IE, les espaces vides ne sont pas transformés en nœuds de texte. Je suggère également que la vérification d'un «» serait nécessaire pour éviter de toucher aux éléments «» qui n'ont pas d'image enfant. – user113716

+0

Fair points. +1 – lonesomeday

0

Voici fonction modifiée. Vous devez parcourir chaque balise d'ancrage et mettre à jour ses attributs en conséquence

$('a').each(function(){ 

    var title = $(this).find('img'); 

    var updateTitle = title.attr('title'); 

    $(this).attr({ 
     title: updateTitle, 
     alt: 'lol' 
    }); 
}); 
0

Utilisez la fonction de rappel de attr:

$(function(){ 
    $('a').attr('title', function() { 
     return $(this).find('img').attr('title'); 
    }); 
}); 

Modifié fonctionne de manière fiable Notez que cela est moins efficace que la version de patrick dw .

Questions connexes