jQuery的attr()在IE7中没有返回值

4
这个问题让我很困惑。我在一些链接上使用“for”属性来标识它们所要操作的元素。在Firefox、IE9和IE8中,一切都运行得很好...但是IE7会出现问题并返回“undefined"。
以下是我正在使用的jQuery代码要点:
$(document.ready(function() {
    var editor_icons = $('.edit-button');

    editor_icons.each(function() {
        var $this = $(this),
            parent = $('#' + $this.attr('for'));

        var left = parent.position().left + parent.innerWidth() - 58 - 3,
            top = parent.position().top + 3;

        // ... you get the point ...
    });
});

一个要操作的示例HTML元素:

<div id="content_wrapper">
    <a class="edit-button" href="javascript:void(0);" for="index_primary_content" />
    <div id="index_primary_content">
        ....
    </div>
</div>

在此之前,我意识到锚点不应该是自动关闭元素。 我从我的应用程序发送的HTML是<a></a>,而IE将其解释为<a />。 我在元素之间添加了&nbsp;以确保这不是一个解释问题,但我得到了完全相同的错误。
问题在于$this.attr('for')返回“undefined”,因此parent.position()。left抛出“对象为null或未定义”的错误。
我使用观察变量进行了深入挖掘,我可以看到选择器正在工作,并且在此上下文中的$this确实选择了正确的元素并且已设置“for”属性……但我认为jQuery没有找到它。
正如我所说,Firefox,IE9和IE8都可以正常工作……只有IE7不能。 有什么想法吗?
供参考,我正在使用jQuery 1.6.2 ...

你需要使用 for 的原因是什么?或许你可以尝试给 <a> 和对应的 <div> 分配相同的类,然后通过这种方式找到它们? - Jack
这是一个ASP.Net MVC项目。锚链接是使用可重用控件动态创建的 - 我将锚点映射到它链接到的元素的ID,但控件不知道正在使用哪些类。我可以用其他方法来实现,但自定义属性最简单,而且似乎在其他地方都能正常工作。 - EAMann
然后给它一个不同的名称。不要使用for,而是使用target_ele或其他名称,它应该仍然可以工作。你的编辑器会警告你,但它应该能够工作。 - Jack
杰克,把它作为解决方案发布。虽然不是理想的...但它能正常工作。 - EAMann
2个回答

2
我认为这是您的问题。jQuery Bug Ticket 引用: 这是因为在 HTML 中使用“for”属性实际上是“htmlFor”,例如在标签元素中。我认为对于 jQuery.props 中的所有特殊情况都是如此。XML 文档不会获得此特殊处理,因此在那里,“for”将是“for”。我不确定这是否值得修复,还是只需记录。

1
结果证明,在IE7之外,“for”被翻译为“htmlFor”。我仔细查看了实际的.attr()扩展,它会在检查.getAttribute()之前自动将“for”转换为“htmlFor”。在我的情况下,.getAttribute('for')返回了正确的值,但是.getAttribute('htmlFor')返回null…所以jQuery返回undefined - EAMann

1

不要使用 for,而是使用自定义属性,例如 target_ele

你的编辑器可能会警告你,但它会起作用。


决定使用“parent”作为我的自定义属性,因为它与我所做的事情相关。我仍然想知道为什么“for”被禁止。它是其他HTML元素中有效的属性,那么为什么jQuery只限制它在标签中使用?我猜这是另一个问题的答案,留待以后再探讨... - EAMann
1
使用 data-for 来创建 HTML5 自定义属性。 - zzzzBov
此外,“for”并未被禁用……请查看我在@Hexxagonal答案评论中的解释,为什么这对IE7不起作用。 - EAMann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接