【问题标题】:$.proxy does not work when removing dom element$.proxy 在移除 dom 元素时不起作用
【发布时间】:2012-01-07 08:31:54
【问题描述】:

谁能告诉我为什么我不能使用 $.proxy 来删除一个 dom 元素。

更新:我知道我可以使用匿名函数,但我特别想知道为什么 $.proxy 不起作用。

<html>
    <head>
    <title>$.proxy Test</title>
    </head>
<body>
<ul id="test">    
</ul>
<script>
var test = $('#test');
    var li = $('<li>Test Entry</li>').appendTo(test);
    li.click($.proxy(li, 'remove')); // Does not work
    //li.click($.proxy(li.remove, li)); // Does not work
    //li.click(function(){li.remove();}); // Works

</script>
</body>
</html>

更新 2 :我不想使用通常的函数定义语法,因为我不想将单个语句扩展到多行。因此我决定使用以下语法。我不知道这是否是一个好习惯,但对我来说,这样代码看起来更干净。

$.proxy(new Function('this.remove()'), li);

【问题讨论】:

  • 您检查过$.proxy() 期望的参数吗? api.jquery.com/jQuery.proxy 还有,这种情况下为什么需要代理功能?
  • zerkms:据我了解,$.proxy 应该同时支持$.proxy(li, 'remove')(上下文,函数名)和$.proxy(li.remove, li)(函数,上下文)

标签: jquery dom


【解决方案1】:

在您的代码示例中:

li.click($.proxy(li, 'remove'));

它确实在单击时调用li.remove(),但它使用单击事件作为.remove() 的第一个参数来调用它

喜欢:

li.remove(e);

.remove() 期望该参数中有一个选择器。在尝试将其用作选择器时,它显然会导致 .remove() 失败,因此它什么也不做。

因此,代理正在执行您要求它执行的操作,但这不适合此特定用途,因为 .remove() 期望的参数与 .click() 事件传递的参数不兼容。

我自己在单步执行 jQuery 源代码中的代理函数时发现了这一点,但是您也可以看到,当您单击文本以激活对代理函数的调用时,会引发异常。之所以会出现这个特殊的异常,是因为 jQuery 期望选择器参数是一个带有 .replace() 方法的字符串,但它是一个没有此方法的 jQuery 事件对象(来自 click 事件)。

我并不是建议这是一个有意义的解决方案,而是为了说明$.proxy() 在这种情况下的工作原理,当你给它一个函数,除了 jQuery 事件对象之外的函数作为它的第一个参数,这段代码作品:

var test = $('#test');
var li = $('<li>Test Entry</li>').appendTo(test);
li.myRemove = function(e) {this.remove();};
li.click($.proxy(li, "myRemove"));

你可以在这里看到它的工作原理:http://jsfiddle.net/jfriend00/TyaeZ/。在这里,我创建了一个 myRemove 方法,该方法期待 .click() 提供的参数并且它可以工作。

【讨论】:

  • 谢谢。这正是我正在寻找的解释。
【解决方案2】:

Takes a function and returns a new one that will always have a particular context.see docs

你需要.remove

var test = $('#test');
    var li = $('<li>Test Entry</li>').appendTo(test);
li.bind({
    click:function(e){
        e.stopPropagation();
        $(this).remove();
    }
});

http://jsfiddle.net/ZbBAh/21/

【讨论】:

  • 我对使用 $.proxy 做这件事特别感兴趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 2016-03-24
  • 2014-05-04
  • 1970-01-01
相关资源
最近更新 更多