代码之家  ›  专栏  ›  技术社区  ›  Craig Walker

在javascript中引用和调用方法

  •  3
  • Craig Walker  · 技术社区  · 16 年前

    我有一些javascript/jquery代码,用于监视复选框上的“已更改”事件:

    $(control).change(function() {
        alert("changed to: " + $(this).is(":checked"));
    });
    

    这个很好用。

    我想在特定对象上创建对change()函数的引用,并间接调用它,如下所示:

    var onSomeChange = $(control).change;
    onSomeChange(function() {
        alert("changed to: " + $(this).is(":checked"));
    });
    

    我需要间接调用它,因为我想根据具体情况,使用不同的方法切换分配给OnSomeChange的方法。(OnSomeChange的单一分配仅用于说明)。

    这不管用。在Firebug中,我得到这个错误:

    this.bind不是函数

    如何获取对对象方法的引用并在不直接从对象调用它的情况下调用它?

    背景

    背景可能很重要;如果有一种完全不同的方式来做我想做的事情,那也没关系。

    的行为 change 对于复选框和单选按钮,javascript中的事件稍有不同。复选框在其状态更改(选中或未选中)时激发更改。但是,单选按钮(至少在Firefox中,我认为在其他浏览器中更为复杂)只会对整个单选按钮组进行更改。这是可以理解的,但我想将不同的操作绑定到各个单选按钮的状态。(具体来说,我希望根据单选按钮的状态隐藏或显示某些div)。

    我认为我可以通过将自定义事件绑定到每个收音机,然后根据 改变 在小组中。所以我扩展了jquery来添加radiochange()方法。这种方法

    现在,我想用一些根据控件类型调用不同事件处理方法的代码来替换此代码。(旁白:这是因为单选按钮的处理方式与复选框不同,所以我有一个不同的特定于单选按钮的事件)。我在jquery中添加了一个radioChanged()扩展方法来支持这一点。

    现在我想要一个方法,根据对象的类型,将侦听器注册为changed()或radiochanged()。确定这一点很容易:

    var change = $(control).is(":radio") ? $(control).radioChange : $(control).change;
    

    问题是我不能在 改变 引用而不生成上面的错误。

    我还有什么事要做吗?

    2 回复  |  直到 16 年前
        1
  •  3
  •   Craig Walker    16 年前

    原始问题的答案:

    您需要将它应用到一个绑定为原型的对象上。可能足以将$(control)作为相关对象传递,或者$就足够了。

    var $control = $(control);
    var change = $control.change;
    change.call( $control, 
        function() {
          alert("changed to: " + $(this).is(":checked"));
        }
    );
    
        2
  •  2
  •   Tom Brothers    16 年前

    听起来您只需要调用绑定事件并将其传递给目标事件字符串

    $(control).bind($(control).is(":radio") ? "radioChange", "change", function () {});