extraction de mauvais .attr ( « href ») dans IE7 vs tous les autres navigateurs?
-
22-09-2019 - |
Question
Peut-il vraiment vrai que la commande attr("href")
un lien est géré très différent IE7 par rapport à tous les autres navigateurs?
Disons que j'ai une page http://example.com/page.html et je cette HTML:
<a href="#someAnchor" class="lnkTest">Link text</a>
et ce jQuery:
var strHref = $(".lnkTest").attr("href");
Ensuite, dans IE7 la valeur de la variable strHref
sera "http://example.com/page.htm#someAnchor"
mais dans d'autres navigateurs, il sera "#someAnchor"
.
Je crois que le dernier cas est le plus correct, donc est-ce juste un cas de IE7 être un mauvais garçon ou est-ce un bogue dans jQuery?
La solution
Il est certainement pas un bogue dans jQuery mais les implémentations incompatibles des navigateurs de .getAttribute('href')
-. Je suggère d'utiliser simplement .get(0).href
pour la cohérence
On dirait que vous pouvez accéder au texte d'attribut dans IE et Mozilla en utilisant .get(0).getAttribute('href', 2)
si vous ne voulez pas l'URI absolue. Notez cependant cela ne fonctionnera pas dans Opera et je n'ai pas testé dans Safari / Chrome / quoi que ce soit d'autre.
Vous pouvez dépouilleront le domaine ou fendu sur « # » pour .get(0).href
et utiliser la deuxième partie du tableau en supposant qu'il contient même « # » (vérifier .length
).
Autres conseils
Je crois qu'il est mis en œuvre comme ça dans tous les + IE 7.
J'utilise:
var href=jQuery('#foo').attr('href');
href=href.substring(href.indexOf('#'));
it helps! Vive.
J'ai trouvé un bug lié à cette question: http://bugs.jquery.com/ticket/2747 jQuery mis en œuvre une solution de contournement pour « bug » IE7. Cependant, dans jQuery 1.7.1 ce bug a été réintroduite. J'ai créé un nouveau bug pour 1.7.1: http://bugs.jquery.com/ticket/11129
J'utilise:
var hrefArr = $(this).attr('href').split('/');
var id = hrefArr[hrefArr.length-1];
quand je dois tout après le dernier « /".
Une autre façon est d'utiliser simplement un attribut de données, au lieu de href
<a data-href="#anchor-0">example</a>
.
var href = $(this).attr('data-href');
I fini par créer une variable via PHP, puis en utilisant la bande de javascript méthode replace () hors de la href:
<script>var domain = 'http://<?=$_SERVER['HTTP_HOST']?>';</script>
<script>
$(function(){
/* prevent default action of all anchors with hash class */
$('#canvas').on('click', 'a.hash', function(event) {
event.preventDefault();
// get the href of the anchor
var hash = '!' + $(this).attr('href');
// remove the absolute url if it exists
hash = hash.replace( domain, '' );
// redirect
window.location.hash = hash;
});
});
</script>
Le problème est que le changement IE7 et IE8 également le texte. Donc, une bonne solution consiste à faire comme ceci
$('#linkId').attr('href','newlink').text('oldtext');