Errado extração .attr("href") no IE7 vs todos os outros navegadores?
-
22-09-2019 - |
Pergunta
Pode ser verdade que o attr("href")
comando para um link é um tratamento muito diferente no IE7, em comparação a todos os outros navegadores?
Vamos dizer que eu tenho uma página no http://example.com/page.html e eu tenho essa HTML:
<a href="#someAnchor" class="lnkTest">Link text</a>
e jQuery:
var strHref = $(".lnkTest").attr("href");
Em seguida, no IE7 o valor da strHref
variável será "http://example.com/page.htm#someAnchor"
mas em outros navegadores, ele vai ser "#someAnchor"
.
Eu acredito que o último mencionado caso é o mais correto, então, é apenas um caso de IE7 ser um bad boy ou é um bug do jQuery?
Solução
É certamente não um bug no jQuery, mas em vez de navegar as implementações inconsistentes de .getAttribute('href')
- Eu sugiro usar apenas .get(0).href
para consistência.
Parece que você pode acessar o texto do atributo no IE e Mozilla usando .get(0).getAttribute('href', 2)
Se você não quer o URI absoluto. Observe, no entanto, isso não funcionará na Opera e eu não testei no Safari/Chrome/mais nada.
Você também pode retirar o domínio ou se dividir em '#' para .get(0).href
e use a segunda parte da matriz, assumindo que ela contém '#' (check .length
).
Outras dicas
Eu acredito que é implementado assim em todo o IE 7+.
Eu uso:
var href=jQuery('#foo').attr('href');
href=href.substring(href.indexOf('#'));
Espero que ajude! Felicidades.
Encontrei um bug relacionado a este problema: http://bugs.jquery.com/ticket/2747 JQuery implementou uma solução alternativa para o 'bug' do IE7. No entanto, no jQuery 1.7.1, esse bug foi reintroduzido. Eu criei um novo bug para 1.7.1: http://bugs.jquery.com/ticket/11129
Eu uso:
var hrefArr = $(this).attr('href').split('/');
var id = hrefArr[hrefArr.length-1];
Quando eu preciso de tudo depois do último "/".
Outra maneira é apenas usar um atributo de dados, em vez de href
<a data-href="#anchor-0">example</a>
.
var href = $(this).attr('data-href');
Acabei criando uma variável através do PHP, em seguida, usando javascript() substituir o método de tira-lo para fora do 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>
O problema é que o IE7 e o IE8 mudam também o texto. Então, uma boa solução alternativa é fazer assim
$('#linkId').attr('href','newlink').text('oldtext');