代码之家  ›  专栏  ›  技术社区  ›  Keith Bentrup

是这样吗?删除数据存储的jQuery错误?

  •  6
  • Keith Bentrup  · 技术社区  · 15 年前

    比较一下:

    $('body').data('x',1);
    $(thisx).remove();
    console.log($('body').data('x'));
    

    为此:

    $('body').data('x',1);
    $(this.x).remove();
    console.log($('body').data('x'));
    

    注意到区别了吗?如果 thisx 如果未定义,它将立即抛出引用错误。如果 x this ,jQuery将返回文档作为其结果集。下一步jQuery将尝试删除您的文档(它无法删除),但在此之前,它将删除附加到文档任何子元素的所有数据。 因此,清除您的数据存储。

    注: 可以是任何元素引用或对象。您只需要让jQuery尝试访问未定义的属性。

    (谈论一种痛苦。它默默地失败了,我试图找出我的数据突然丢失的原因。我将其追溯到一种特殊情况,即元素引用在特定情况下未定义。)

    下面是我的问题:

    1) 在我提交错误报告之前 ,我的分析正确吗?如果有人碰巧知道这是一个已知的问题,请告诉我。我在bug跟踪器中找不到它,但是界面不是很好(或者我可能弄错了)。

    2) 为什么最终会有什么不同?我猜 this.x 是在被调用函数中传递和计算的引用,对吗?(我认为这条线在哪里 selector = selector || document ; 是罪魁祸首。

    3) 如何处理这一问题的建议? 任何/每 删除某个对象时,在我将其传递给jQuery之前,定义了对象的元素引用或属性(例如存储的选择器字符串)。

    2 回复  |  直到 15 年前
        1
  •  3
  •   sth    15 年前

    为什么最终会有什么不同?

    二者都 thisx this.x 在调用函数时计算。第一个引用未定义的变量名,这会引发引用错误。第二个方法访问对象的未定义属性,这将导致 undefined . 这就是javascript在这些情况下的行为。

    现在,在第二种情况下调用JQuery时 $(this.x) 评估为 $(undefined) 就好像你会打电话一样 $() . 因为在JQuery看来似乎没有提供任何参数,所以它使用默认值,在本例中,默认值是 document . 然后继续尝试删除 文件 ,因为它实际上被称为 $().remove() ,在这种情况下,这是意料之中的。

    如何处理这一问题的建议?

    ReferenceError 是Javascript的一个根本区别,对此我们无能为力。JQuerys的行为是不幸的,是通过 arg = arg||default . 一个人可以使用它 arguments.length 而是获取调用参数的实际数量,但这样的更改肯定会导致大量的代码被破坏,这些代码依赖于在调用时使用的默认值 0 通过了,所以不太可能发生。

        2
  •  3
  •   cobbal    15 年前

    > a
        ReferenceError: Can't find variable: a
    > b = {}
        Object
    > b.a
        undefined
    

    一个是javascript错误,一个默默地返回undefined(jQuery将解释为 $() 因为javascript和jQuery无法识别函数 $() $(undefined) (分开)

    这就是javascript的工作方式,bug或特性我留下了争论的余地,但我不认为这是jQuery的错误或问题。

    编辑: $() 定义

    从文档中:

    默认情况下,如果未指定上下文, 当前HTML文档的上下文。 如果确实指定了上下文,例如 DOM元素或jQuery对象 表达式将与 该上下文的内容。

    :文档引用传递给的上下文参数 ,不要打电话 没有论据,所以这里不相关。

    还要注意

    $().get(0) == $("").get(0)