我有一个非常奇怪的问题,我希望有人可以解释一下。我正在使用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却没有。
有没有人见过这个,或者知道这里发生了什么?非常感谢任何帮助!
答案 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);