2010-02-26 8 views
5

J'ai un problème vraiment bizarre que j'espère que quelqu'un peut faire la lumière sur. J'utilise Jquery pour récupérer une réponse Http d'un autre site Web (que je possède). Une fois que je reçois le DOM, je l'analyse pour obtenir certaines informations. Cependant, quand j'essaye d'obtenir l'attribut href d'un lien, IE ajoute le domaine local au début de l'href!JQuery ne pas analyser correctement attr ("href") dans IE

Voici mon code:

$.ajax({ 
        type: "POST", 
        url: "MyPage.aspx/GetWebResponse", 
        data: "http://myWebSite/pages/AnotherPage.aspx", 
        contentType: "application/json; charset=utf-8", 
        dataType: "json", 
        asynch: false, 
        success: function(data) 
        { 
         var __htmlForMainPage = data.d;     


         var PageLink = $(__htmlForMainPage).find("a:contains('Get This Link')").attr("href"); 
               } 
       }); 

Ma Pagelink variable doit être "/pages/getThisPage.aspx?id=8347". Cependant, il est renvoyé sous la forme "http://myserver/pages/getThisPage.aspx?id=8347".

Cela se passe UNIQUEMENT dans IE. FireFox va bien. Cela ne se passe aussi que lorsque je le mets sur le serveur. Quand je l'exécute localement, tout fonctionne bien, à la fois dans IE et FF. Mais quand je l'ai mis sur le serveur, FF fonctionne toujours bien, mais IE ne fonctionne pas.

Est-ce que quelqu'un a déjà vu ça ou sait ce qui se passe ici? Toute aide est grandement appréciée!

+0

Je ne sais pas ce qui se passe, mais je doute sérieusement que c'est une question jQuery. Il n'y a pas de code dans jQuery pour faire quelque chose comme la réécriture d'URL dans une situation comme celle-ci. – Pointy

Répondre

9

Lors de l'accès à la propriété DOM href d'un élément A dans IE, le chemin d'accès absolu à l'URL est renvoyé. La même chose est vraie pour getAttribute() dans IE7 et inférieur (puisque getAttribute a été cassé jusqu'à IE8).

http://msdn.microsoft.com/en-us/library/cc848861(VS.85).aspx:

Internet Explorer 8 ou version ultérieure. En mode IE8, la valeur du HREF dépend du contexte de la référence à l'attribut. Lorsqu'il est lu en tant qu'attribut DOM (Document Object Model), HREF renvoie une URL relative au domaine hébergeant la page Web. HREF renvoie la valeur spécifiée par l'auteur de la page lorsqu'il est lu en tant qu'attribut de contenu lorsque la page est affichée dans un mode de compatibilité de document antérieur ou lorsque la page est affichée avec une version antérieure du navigateur. Pour plus d'informations, consultez Différences d'attributs dans Internet Explorer 8.

jQuery toujours chercher la propriété DOM si la convention de nommage est le même:

// If applicable, access the attribute via the DOM 0 way 
if (name in elem && notxml && !special) { 
    // ... 
} 

La partie name in elem vérifie ici pour voir si une propriété DOM a été spécifié. Pour contourner ce problème pour IE8, vous pouvez spécifier la propriété en majuscules - .attr("HREF") - car les propriétés DOM sont sensibles à la casse. Malheureusement, la seule solution pour IE7 et inférieure est d'effectuer une chaîne remplacer:

var base = window.location.href.substring(0, window.location.href.lastIndexOf("/") + 1); 
PageLink = PageLink.replace(base, ""); 
+0

Merci Andy. J'apprécie vraiment votre aide. Il semblerait que je devrais ajouter un peu de codage pour vérifier les versions du navigateur pour IE, et effectuer une manipulation. Merci encore! – vcuankit

+0

Cela a été corrigé dans jQuery 1.3.2: http://bugs.jquery.com/ticket/2747. Mais il est toujours cassé pour le balisage qui arrive via les appels Ajax. Voir http://blog.rapiddg.com/2010/08/ie7-href-normalization-and-ajax/ – Aaron

2

Ce n'est pas un problème de jquery, c'est un ie quirk. Il est facile de remédier à "http://myserver/pages/getThisPage.aspx?id=8347" .réplace ('http://myserver', '').

+0

N'oubliez pas que les chemins relatifs sont relatifs au répertoire courant et non à la racine du site. –

+0

@Andy: pas si vous gardez une barre oblique au début de l'uri, comme le fait user280823. Mais je suppose que ce n'est plus un chemin relatif. ;) –

+2

Comment est-ce pas un problème de jQuery. JQuery ne normalise-t-il pas d'autres "caprices IE"? Si pas d'autres, pourquoi pas ça? – Aaron

1

Le « problème » est que ce que vous voyez dans vos sources HTML est pas ce que jQuery « voit » dans les navigateurs DOM-Tree. Cela veut dire que IE ne sauvegarde probablement que des URL absolues à l'intérieur des nœuds de votre DOM (contrairement aux autres navigateurs, mais ce n'est pas vraiment important pour le navigateur, car il ne peut fonctionner qu'avec des URL absolues, donc il doit calculer cette URL absolue tôt ou tard).

Maintenant jQuery renvoie simplement les valeurs qui sont stockées dans l'arborescence DOM.

Si vous voulez vérifier cela, il suffit d'obtenir Firebug! Vous pouvez voir le DOM là (et IE8, il y a quelque chose de similaire dans IE).

0

Différents navigateurs renverront choses différentes pour les attributs URL. La normalisation de l'URL est votre travail. J'utilise une regex comme ceci:

var urlParts = /^(https?:\/\/.+?)?(\/.+?)(\?.*?)?$/.exec(href); 
var server = urlParts[1]; // maybe be '' depending on the browser 
var path = urlParts[2]; 
var query = urlParts[3]; 

Donc vous voulez le chemin + requête.

Questions connexes