JQuery没有在IE中正确解析attr(“href”)

时间:2010-02-26 16:03:25

标签: jquery ajax internet-explorer

我有一个非常奇怪的问题,我希望有人可以解释一下。我正在使用Jquery从另一个网站(我拥有)中检索Http响应。收到DOM后,我会解析它以获取某些信息。但是,当我尝试获取链接的href属性时,IE将本地域添加到href的开头!

这是我的代码:

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

我的变量PageLink应该是“/pages/getThisPage.aspx?id=8347”。但是,它会以“http://myserver/pages/getThisPage.aspx?id=8347”返回。

这只发生在IE中。 FireFox很好。这也只有在我把它放在服务器上时才会发生。当我在本地运行它时,一切正常,在IE和FF中。但是当我把它放在服务器上时,FF仍然可以正常工作,但IE却没有。

有没有人见过这个,或者知道这里发生了什么?非常感谢任何帮助!

5 个答案:

答案 0 :(得分:9)

在IE中访问href元素的A DOM属性时,它将返回url的绝对路径。对于IE7及更低版本中的getAttribute()也是如此(因为getAttribute在IE8之前被破坏)。

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

  

Internet Explorer 8或更高版本。在IE8模式下, HREF 的值取决于对该属性的引用的上下文。当读取为文档对象模型(DOM)属性时, HREF 将返回相对于托管网页的域的URL。当在早期文档兼容模式下显示页面时,或者使用早期版本的浏览器查看页面时, HREF 会在读取内容属性时返回页面作者指定的值。有关更多信息,请参阅Internet Explorer 8中的属性差异。

如果命名约定相同,jQuery将始终获取DOM属性:

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

这里的name in elem部分正在检查是否已指定DOM属性。要解决此问题,您可以使用大写 - .attr("HREF")指定属性 - 因为DOM属性区分大小写。不幸的是,IE7及更低版本的唯一解决方法是执行字符串替换:

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

答案 1 :(得分:2)

这不是一个jquery问题,它是一个怪癖。很容易补救“http://myserver/pages/getThisPage.aspx?id=8347”。replace('http://myserver','')。

答案 2 :(得分:1)

“问题”是您在 HTML源中看到的内容不是浏览器 DOM-Tree 中jQuery“看到”的内容。

这意味着IE很可能只是将绝对URL保存在DOM的a-Nodes中(而其他浏览器则没有,但这与浏览器并不相关,因为它无论如何都可以使用绝对URL,所以它必须迟早计算这个绝对URL。

现在 jQuery只返回存储在DOM树中的值

如果您想验证这一点,只需获取Firebug!你可以在那里查看DOM(因为IE8中也有类似的东西)。

答案 3 :(得分:0)

不同的浏览器会为URL属性返回不同的内容。规范化URL是你的工作。我使用这样的正则表达式:

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

所以你想要路径+查询。

答案 4 :(得分:0)

将第二个属性传递给getAttribute函数:

linkobj.getAttribute(‘href’,2);

更多信息 - http://glennjones.net/2006/02/getattribute-href-bug/