C'est ce qui a fonctionné pour moi et la découverte étape par étape :
La sortie est de la console de chrome
Tout d'abord, localisez le nœud parent qui contient le vilain espace blanc.
$('.controls label[class="radio"]').parent();
[<div class="controls">
<label class="radio">…</label>
" "
" "
<label class="radio">…</label>
" "
" "
</div>]
Vous pouvez voir qu'il s'agit d'un tableau grâce aux crochets []. jQuery retournera toujours une structure de type tableau, même si un seul élément a été trouvé.
Donc, pour atteindre le HTMLElement, nous prenons le premier élément du tableau à l'index 0.
$('.controls label[class="radio"]').parent()[0];
<div class="controls">
<label class="radio">…</label>
" "
" "
<label class="radio">…</label>
" "
" "
</div>
Notez qu'il n'y a plus de crochets []. La raison pour laquelle nous devons faire cela est que jQuery ignorera les espaces dans le dom mais pas HTMLElement, regardez ce qui se passe lorsque nous accédons à la propriété childNodes
$('.controls label[class="radio"]').parent()[0].childNodes;
[<label class="radio">…</label>,
" ",
" ",
<label class="radio">…</label>,
" ",
" "]
Nous avons à nouveau un tableau, oui vous repérez les crochets [] mais vous voyez une autre différence, regardez toutes les virgules, que nous ne pouvions pas avoir avec jQuery. Merci HTMLElement mais maintenant nous pouvons revenir à jQuery parce que je veux utiliser each au lieu d'une boucle for, vous êtes d'accord avec moi ? Donc, enveloppons le tableau dans jQuery et voyons ce qui se passe :
$($('.controls label[class="radio"]').parent()[0].childNodes);
[<label class="radio">…</label>,
" ",
" ",
<label class="radio">…</label>,
" ",
" "]
Parfait ! Nous avons toujours exactement la même structure, mais maintenant dans un objet jQuery, alors appelons chacun d'eux et imprimons "this" dans la console pour voir ce que nous avons.
$($('.controls label[class="radio"]').parent()[0].childNodes).each(function () {
console.log('|'+$(this).html()+'|');
});
|<input id="gender_f" name="gender" type="radio" value="f">Female|
|undefined|
|undefined|
|<input id="gender_m" name="gender" type="radio" value="m" checked="">Male|
|undefined|
|undefined|
Donc, nous utilisons jQuery pour obtenir le html de chaque élément, le truc standard `$(this).html et parce que nous ne pouvons pas voir les espaces blancs, nous les remplissons avec un pipe |, bon plan mais qu'est-ce que nous avons ici ? Comme vous pouvez le voir, jQuery n'est pas capable de transformer l'espace blanc en html et maintenant nous avons undefined. Mais c'est encore mieux parce que là où un espace peut être vrai, undefined est définitivement faux =)
Alors, débarrassons-nous de ces suceurs avec jQuery. Tout ce dont nous avons besoin est $(this).html() || $(this).remove();
Voyons voir :
$($('.controls label[class="radio"]').parent()[0].childNodes).each(function () {
$(this).html() || $(this).remove();
});
[<label class="radio">…</label>,
" ",
" ",
<label class="radio">…</label>,
" ",
" "]
Oh là là mais n'ayez crainte ! Chacun d'eux renvoie toujours la structure précédente et non celle que nous avons modifiée, regardons ce que notre requête initiale renvoie maintenant.
$('.controls label[class="radio"]').parent();
[<div class="controls">
<label class="radio">…</label>
<label class="radio">…</label>
</div>]
Et Wallah ! Tout sexy et joli =)
Voilà donc comment supprimer les espaces entre les éléments/balises à la manière de jQuery.
nJoy !