2010-02-26 9 views
5

Tengo un problema realmente extraño que espero que alguien pueda arrojar algo de luz. Estoy usando Jquery para recuperar una respuesta Http de otro sitio web (que yo poseo). Una vez que recibo el DOM, lo analizo para obtener cierta información. Sin embargo, cuando trato de obtener el atributo href de un enlace, IE agrega el dominio local al comienzo de la href.JQuery no analiza correctamente attr ("href") en IE

Aquí está mi código:

$.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"); 
               } 
       }); 

Mi PageLink variable debe ser "/pages/getThisPage.aspx?id=8347". Sin embargo, se devuelve como "http://myserver/pages/getThisPage.aspx?id=8347".

Esto SÓLO está sucediendo en IE. FireFox está bien. Esto también solo sucede cuando lo pongo en el servidor. Cuando lo ejecuto localmente, todo funciona bien, tanto en IE como en FF. Pero cuando lo pongo en el servidor, FF sigue funcionando bien, pero IE no funciona.

¿Alguien ha visto esto antes, o sabe lo que está pasando aquí? ¡Cualquier ayuda es muy apreciada!

+0

No sé lo que está pasando, pero yo muy serias dudas de que se trata de un problema de jQuery. No hay código en jQuery para hacer algo como reescritura de URL en una situación como esta. – Pointy

Respuesta

9

Al acceder a la propiedad DOM href de un elemento A en IE, devolverá la ruta absoluta a la url. Lo mismo es cierto para getAttribute() en IE7 y menor (ya que getAttribute se rompió hasta IE8).

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

Internet Explorer 8 o posterior. En modo IE8, el valor de HREF depende del contexto de la referencia al atributo. Cuando se lee como un atributo de Modelo de objetos de documento (DOM), HREF devuelve una URL relativa al dominio que aloja la página web. HREF devuelve el valor especificado por el autor de la página cuando se lee como atributo de contenido cuando la página se muestra en un modo de compatibilidad de documento anterior o cuando la página se visualiza con una versión anterior del navegador. Para obtener más información, vea Diferencias de atributos en Internet Explorer 8.

jQuery siempre va a buscar a la propiedad DOM si el convenio de denominación es la misma:

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

La parte name in elem aquí está comprobando para ver si una propiedad DOM se ha especificado. Para evitar esto para IE8, puede especificar la propiedad en mayúsculas: .attr("HREF"), porque las propiedades DOM distinguen entre mayúsculas y minúsculas. Por desgracia, la única solución para IE7 e inferior es llevar a cabo una cadena reemplazar:

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

Gracias Andy. Definitivamente aprecio tu ayuda. Parece que tendré que agregar algunos códigos para verificar las versiones del navegador para IE y realizar algunas manipulaciones. ¡Gracias de nuevo! – vcuankit

+0

Esto se corrigió en jQuery 1.3.2: http://bugs.jquery.com/ticket/2747. Pero todavía está roto para el marcado que llega a través de llamadas Ajax. Ver http://blog.rapiddg.com/2010/08/ie7-href-normalization-and-ajax/ – Aaron

2

Esto no es un problema de jquery, es una peculiaridad. Es fácil remediar "http://myserver/pages/getThisPage.aspx?id=8347" .replace ('http://myserver', '').

+0

No olvide que las rutas relativas son relativas al directorio actual, no a la raíz del sitio. –

+0

@Andy: no si mantienes una barra al comienzo del uri, como hace el usuario280823. Pero supongo que ya no es un camino relativo. ;) –

+2

¿Cómo no es un problema de jQuery? ¿JQuery no normaliza otras "peculiaridades de IE"? Si no otros, ¿por qué no esto? – Aaron

1

El "problema" es que lo que se ve en sus fuentes HTML no es lo jQuery "ve" en los navegadores DOM-árbol.

Eso significa que IE probablemente solo guarda URL absolutas dentro de los nodos a (aunque otros navegadores no lo hacen, pero eso no es realmente relevante para el navegador, ya que solo puede trabajar con URL absolutas de todos modos, tiene que calcular esta URL absoluta tarde o temprano).

Ahora jQuery simplemente devuelve los valores que están almacenados en el árbol DOM.

Si quiere verificar esto, ¡solo obtenga Firebug! Puede ver el DOM allí (y desde IE8 también hay algo similar en IE).

0

diferentes navegadores volverán cosas diferentes para los atributos de URL. La normalización de la URL es su trabajo. Uso una expresión regular como esta:

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

Así que quieres la ruta + consulta.

Cuestiones relacionadas