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

我有一个非常奇怪的问题,我希望有人可以解释一下。 我正在使用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却没有。

有没有人见过这个,或者知道这里发生了什么? 任何帮助是极大的赞赏!

当访问IE中A元素的href 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部分的name in elem是检查是否已指定DOM属性。 要解决这个问题,你可以用大写字母指定属性 – .attr("HREF") – 因为DOM属性区分大小写。 不幸的是,IE7及更低版本的唯一解决方法是执行字符串替换:

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

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

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

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

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

如果你想validation这一点,只需获得Firebug ! 你可以在那里查看DOM(从IE8开始,IE中也有类似的东西)。

不同的浏览器将为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]; 

所以你想要路径+查询。

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

 linkobj.getAttribute('href',2); 

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