与所有其他浏览器相比,IE7 中的 .attr("href") 提取错误?
Posted
技术标签:
【中文标题】与所有其他浏览器相比,IE7 中的 .attr("href") 提取错误?【英文标题】:Wrong extraction of .attr("href") in IE7 vs all other browsers? 【发布时间】:2010-12-08 06:26:35 【问题描述】:与所有其他浏览器相比,IE7 对链接的attr("href")
命令的处理方式是否真的有很大不同?
假设我在http://example.com/page.html 有一个页面,并且我有这个 HTML:
<a href="#someAnchor" class="lnkTest">Link text</a>
还有这个 jQuery:
var strHref = $(".lnkTest").attr("href");
那么在 IE7 中 strHref
变量的值将是 "http://example.com/page.htm#someAnchor"
但在其他浏览器中它将是 "#someAnchor"
。
我相信最后提到的情况是最正确的,那么它只是IE7是一个坏男孩的情况还是jQuery中的一个错误?
【问题讨论】:
两者兼而有之——IE7 不一致,但 jQuery 仍应处理。 这也发生在 IE8 中,正如我最近发现的那样。不确定要删除哪个标签才能添加它。绝对不限于jQuery。使用 getAttributeNode("href") 时发生。 【参考方案1】:问题是 IE7 和 IE8 也改变了文本。所以一个好的解决方法是这样做
$('#linkId').attr('href','newlink').text('oldtext');
【讨论】:
【参考方案2】:另一种方法是只使用数据属性,而不是 href
<a data-href="#anchor-0">example</a>
.
var href = $(this).attr('data-href');
【讨论】:
【参考方案3】:我最终通过 php 创建了一个变量,然后使用 javascript replace() 方法将其从 href 中删除:
<script>var domain = 'http://<?=$_SERVER['HTTP_HOST']?>';</script>
<script>
$(function()
/* prevent default action of all anchors with hash class */
$('#canvas').on('click', 'a.hash', function(event)
event.preventDefault();
// get the href of the anchor
var hash = '!' + $(this).attr('href');
// remove the absolute url if it exists
hash = hash.replace( domain, '' );
// redirect
window.location.hash = hash;
);
);
</script>
【讨论】:
【参考方案4】:我发现了一个与此问题相关的错误:http://bugs.jquery.com/ticket/2747 jQuery 为 IE7 的“错误”实现了解决方法。然而,在 jQuery 1.7.1 中,这个错误被重新引入。 我为 1.7.1 创建了一个新错误:http://bugs.jquery.com/ticket/11129
【讨论】:
我注意到该错误已关闭为“无法重现”,但他们提供的测试用例有问题。我创建了一个新的 JSFiddle 测试来说明这个错误 - 希望票可以重新打开。【参考方案5】:我相信它在所有 IE 7+ 中都是这样实现的。
我用:
var href=jQuery('#foo').attr('href');
href=href.substring(href.indexOf('#'));
希望对您有所帮助! 干杯。
【讨论】:
(似乎有一个this.hash
属性也可以使用,请参阅JavaScript圣经页面603(goo.gl/OF16Q),在大多数浏览器中,至少在IE 7中。那么你不会需要致电substr
。)【参考方案6】:
我用:
var hrefArr = $(this).attr('href').split('/');
var id = hrefArr[hrefArr.length-1];
当我需要最后一个“/”之后的所有内容时。
【讨论】:
但是如果href是“example.com/folder/page.htm”或者只是“/folder/page.htm”呢?那么你只会得到“page.htm”,这是不正确的。 这只是为了展示一个简单的例子。我这里没有代码示例,但您可以遍历数组并检查字符串。例如,在结尾包含“.com”的 substing 之后的所有字符串。直截了当.... 你应该对这样的东西使用正则表达式。破裂的可能性要小得多。【参考方案7】:这当然不是 jQuery 中的错误,而是浏览器对 .getAttribute('href')
的不一致实现 - 我建议仅使用 .get(0).href
以保持一致性。
如果您不想要绝对URI,您似乎可以使用.get(0).getAttribute('href', 2)
访问IE 和Mozilla 中的属性文本。但是请注意,这在 Opera 中不起作用,我还没有在 Safari/Chrome/其他任何东西中进行测试。
您还可以去掉域或拆分 .get(0).href
的“#”并使用数组的第二部分,假设它甚至包含“#”(检查 .length
)。
http://www.glennjones.net/Post/809/getAttributehrefbug.htm
【讨论】:
这不是关于如何检索href的锚部分的问题。我自己想出了一个。我只是好奇为什么存在差异。但是还是非常感谢您的回答。我需要获取锚部分,所以我只是使用子字符串来提取正确的值:) 我今天在使用 IE8 时遇到了这个问题。我们了解到,如果我们使用完全限定的域名,即app.somedomain.com/virtualDir/page.aspx,则返回属性文本。但是,如果我们只使用 netbios 机器名称,那么绝对 url 将被返回......怪异。 jQuery 可以帮助标准化事件对象的行为。 现在确实如此,但不知道何时“修复”,用 1.7.1 测试以上是关于与所有其他浏览器相比,IE7 中的 .attr("href") 提取错误?的主要内容,如果未能解决你的问题,请参考以下文章