【问题标题】:JQuery/Backbone remove not working in JasmineJQuery/Backbone 删除在 Jasmine 中不起作用
【发布时间】:2015-03-13 22:50:49
【问题描述】:

我正在 Jasmine 中测试主干视图。当我调用视图的 remove 方法时,该元素实际上并没有被删除。

我认为有这个事件处理程序:

onModelChange: function() {
  this.$el.html('');
  this.render();
}

我必须这样写,因为手动设置 html 是删除它的唯一方法。调用 remove 不会做任何事情,当视图再次呈现自身时,它只会呈现附加到旧内容的新内容。我什至尝试从 Chromium 的开发人员工具中调用 remove,但这也不起作用。但是,当我在浏览器中手动测试它时,remove 确实有效,但它在 Jasmine 中不起作用,而且它搞砸了我的测试。

【问题讨论】:

  • 假设您的测试没有因为忘记包含 jQuery 源而失败,我们可能需要更多的上下文。扔一个 JSFiddle 什么的?
  • @brianvaughn 我想我能够弄清楚发生了什么。我在下面发布了答案。

标签: javascript jquery backbone.js jasmine


【解决方案1】:

我认为问题的答案在于jQuery源码:

remove: function( selector, keepData /* Internal Use Only */ ) {
        var elem,
            elems = selector ? jQuery.filter( selector, this ) : this,
            i = 0;

        for ( ; (elem = elems[i]) != null; i++ ) {
            if ( !keepData && elem.nodeType === 1 ) {
                jQuery.cleanData( getAll( elem ) );
            }

            if ( elem.parentNode ) {
                if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
                    setGlobalEval( getAll( elem, "script" ) );
                }
                elem.parentNode.removeChild( elem ); // right here to be specific
            }
        }

        return this;
    },

remove 函数依赖于节点的父节点来进行删除。我猜当测试在 karma 中运行时,主干视图的节点没有父节点。为了进一步探索,我调试了测试。在控制台中,如果我查询视图元素的子元素并将其删除,它会起作用。

【讨论】:

    猜你喜欢
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2011-05-01
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多