jQuery 1.3.2中是否有JQuery(..).html()buggy?

t0y*_*yv0 8 jquery

这里的代码没有返回预期的内容:

jQuery('<div>Look here: [ jQuery0="null" ]</div>').html()
Run Code Online (Sandbox Code Playgroud)

相反,你得到:

Look here: [ ]
Run Code Online (Sandbox Code Playgroud)

有问题的jQuery源代码:

html: function( value ) {
        return value === undefined ?
                (this[0] ?
                        this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") :
                        null) :
                this.empty().append( value );
},
Run Code Online (Sandbox Code Playgroud)

这背后的动机是.replace什么?我没有时间来讨论jQuery的其余部分,但这样的代码让我想知道我是否应该在生产中使用jQuery.

bob*_*nce 11

.replace背后的动机是什么?

隐藏jQuery用于内部目的的属性.

像这样的代码让我想知道我是否应该在生产中使用jQuery.

是的,我有完全相同的反应.这真是令人难以置信的草率.试图用regexp处理HTML是你期望从第一次问题海报那种天真的黑客,而不是你希望在框架中看到的那种行为,这么多SO用户似乎崇拜.

通过尝试用正则表达式解析标记,这不是jQuery跳起来的唯一地方; 一些选择器的东西也被破坏了.这些可能是不起眼的角落情况,但对我来说这是一个巨大的红旗,表明错误的方法.

  • 顺便说一下,有一个简单的解决方案.当IE的值为"String"和"Number"之类的简单类型时,IE只在其"innerHTML"序列化中包含expando属性.其他对象(如阵列)不会显示.因此,所有jQuery需要做的是设置`node [expando] = [uuid];`而不是`node [expando] = uuid;`并且所有这些无意义的正则表达式处理都可以消失. (4认同)

Ned*_*der 4

此代码是 1.3.2 中新增的代码,1.3.1 中没有。在我看来,jQuery 使用名称以“jQuery”开头的属性来存储元素上的数据,这是当您请求 html 返回时不向您公开数据的方式。

这显然不是一个错误。作者打算在返回字符串之前删除该 HTML。

这会影响您的代码吗?与任何库一样,您应该在部署生产代码之前对其进行彻底测试。