29

È proprio vero che il comando attr("href") per un collegamento è gestito in modo molto diverso in IE7 rispetto a tutti gli altri browser?Estrazione errata di .attr ("href") in IE7 rispetto a tutti gli altri browser?

Diciamo che avere una pagina alla http://example.com/page.html e ho questo HTML:

<a href="#someAnchor" class="lnkTest">Link text</a> 

e questo jQuery:

var strHref = $(".lnkTest").attr("href"); 

Poi in IE7 il valore della variabile strHref sarà "http://example.com/page.htm#someAnchor" ma in altri browser sarà "#someAnchor".

Credo che l'ultimo caso menzionato sia il più corretto, quindi è solo un caso in cui IE7 è un cattivo ragazzo o è un bug in jQuery?

+2

È un po 'di entrambi - IE7 è incoerente, ma jQuery dovrebbe ancora gestirlo. – Keith

+0

Questo accade anche in IE8, come ho scoperto recentemente. Non sei sicuro di quale tag rimuovere per poterlo aggiungere. Sicuramente non limitato a jQuery però. Succede quando si usa getAttributeNode ("href"). –

risposta

18

E 'certamente non un bug in jQuery ma invece implementazioni inconsistenti browser di .getAttribute('href') - Io suggerisco di usare solo .get(0).href per coerenza.

Sembra che sia possibile accedere al testo dell'attributo in IE e Mozilla utilizzando .get(0).getAttribute('href', 2) se non si desidera l'URI assoluto. Nota comunque questo non funzionerà in Opera e non ho provato in Safari/Chrome/nient'altro.

È anche possibile rimuovere il dominio o dividere il numero "#" per .get(0).href e utilizzare la seconda parte dell'array assumendo che contenga anche "#" (controllare .length).

http://www.glennjones.net/Post/809/getAttributehrefbug.htm

+0

Non era una domanda su come recuperare la parte di ancoraggio di href. L'ho scoperto io stesso. Ero solo curioso di sapere perché la differenza esiste. Ma grazie mille per aver risposto comunque. Avevo bisogno di ottenere la parte di ancoraggio, quindi ho appena usato la sottostringa per estrarre il valore corretto :) – EmKay

+0

ho incontrato questo problema oggi con IE8. ci rendiamo conto che se abbiamo usato un nome di dominio completo, ad esempio http://app.somedomain.com/virtualDir/page.aspx, il testo dell'attributo è stato restituito. tuttavia se usassimo solo il nome della macchina netbios, l'URL assoluto veniva restituito ... strano. – CedricB

+6

jQuery avrebbe potuto aiutare a standardizzare il comportamento come con gli oggetti Event. –

1

io uso:

var hrefArr = $(this).attr('href').split('/'); 
var id = hrefArr[hrefArr.length-1]; 

quando ho bisogno di tutto dopo l'ultima "/".

+0

Ma allora cosa succede se l'href è "http://example.com/folder/page.htm" o semplicemente "/ cartella/pagina htm "? Quindi riceverai solo "page.htm" e questo non è corretto. – EmKay

+0

Questo era solo per mostrare un semplice esempio. Non ho qui l'esempio di codice, ma potresti eseguire l'array e controllare le stringhe. Ad esempio tutte le stringhe dopo una sottostazione che contiene ".com" alla fine. Straight forward .... – chrwahl

+0

Dovresti usare espressioni regolari per cose come questa. Molto meno probabilità di rompere. – Keyo

4

Credo che sia implementato così in tutti IE 7+.

io uso:

var href=jQuery('#foo').attr('href'); 
href=href.substring(href.indexOf('#')); 

Speranza che aiuta! Saluti.

+0

(Sembra che ci sia una proprietà 'this.hash' che si può usare anche, vedere la pagina JavaScript della Bibbia 603 (http://goo.gl/OF16Q), nella maggior parte dei browser, almeno in IE 7. Quindi non si Ho bisogno di chiamare 'substr'.) – KajMagnus

2

Ho trovato un bug relativo a questo problema: http://bugs.jquery.com/ticket/2747 jQuery ha implementato una soluzione alternativa per il bug di IE7. Tuttavia in jQuery 1.7.1 questo bug è stato reintrodotto. Ho creato un nuovo problema per 1.7.1: http://bugs.jquery.com/ticket/11129

+2

Ho notato che il bug era chiuso in quanto" non può riprodurre "ma il caso di test che hanno dato era difettoso. Ho creato un nuovo test JSFiddle per illustrare il bug: si spera che il ticket venga riaperto. –

+0

..... aaaaa e chiuso di nuovo .... –

+0

Succede anche per me in 1.7.1 – Armand

0

ho finito per creare una variabile tramite PHP, quindi utilizzando il JavaScript replace() metodo della striscia fuori dalla 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> 
1

altro modo è utilizzare semplicemente un attributo di dati, invece di href

<a data-href="#anchor-0">example</a> 

.

var href = $(this).attr('data-href'); 
-1

Il problema è che IE7 e IE8 cambiano anche il testo.Quindi una buona soluzione è fare questo

$('#linkId').attr('href','newlink').text('oldtext');