iteye_4659 2011-06-12 23:04
浏览 204
已采纳

JQuery.attr一个怪异的问题...

一个同事无意中发现的问题,jQuery版本1.4.4

测试代码如下:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>test</title>
    <script type="text/javascript" src="jquery-1.4.4.js"></script>
    <script language="JavaScript">
    <!--
        $(function (){
             //这里添加一个属性aaa,值为true(不是字符串'true',字符串没有问题)
             $('#ttt').attr('aaa',true);
             alert(typeof $('#ttt').attr('aaa'));
             //这里再次修改属性aaa,值为true(不是字符串'true',字符串没有问题)
             $('#ttt').attr('aaa',true);
             alert(typeof $('#ttt').attr('aaa'));
          }); //-->
    </script>
</head>
    <body>
        <textarea id="ttt" rows="" cols=""></textarea>
    </body>
</html>

在IE8中运行,两次alert的结果不同,why...

第一次是String,第二次是boolean,百思不得其解...

火狐,google都是String

 

最后用IE8调试jQuery源码:

if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
    return elem.getAttributeNode( name ).nodeValue;
}

 第二次是在是在这里返回的,有些不理解.

 

在1.6.1中,他重写了这块的代码,没有出现这个怪异的问题,

 

 

if ( !hooks ) {
    // Use boolHook for boolean attributes
    if ( rboolean.test( name ) && (typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) {
        hooks = boolHook;
        // Use formHook for forms and if the name contains certain characters
    } else if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
        hooks = formHook;
    }
}

 难道这是它1.4.4的一个bug...

大家可以讨论这个问题...

 

 


问题补充
有道理,谢谢您的回答...
万恶的IE,经常是一边骂IE一边去调代码去适应它...
jQuery之前可能也是没考虑到这个bug..
还好1.6解决了...
  • 写回答

1条回答 默认 最新

  • weixin_42552673 2011-06-12 23:04
    关注

    你的调试肯定有问题……
    第一次set的时候,因为elem下没有aaa这个property,因此判定对于该元素,aaa这个attribute并没有对应的property,所以走的是elem.setAttribute('aaa', true),根据DOM标准,setAttribute将value转为string,拿出来的是'true'
    第二次set的时候,由于IE6-8不区分attribute和property,且由于前面设置了一次aaa这个属性,导致判断elem下有了aaa这个property,所以直接使用了elem['aaa'] = true来设置,property没有自动转换为string的机制,所以拿出来的是true

    对于其他浏览器,第一次用的是setAttribute,不会影响property的获取,第二次依旧判断没有aaa这个property,依旧用setAttribute

    只是IE的BUG而已,也不能全说是jquery的错

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮