0

是否可以使用 YUI 的 .on("click", ) 将参数传递给函数?例如,这是我正在查看的一些代码:

function foo1() {
  var curObj = this;

    this.foo2 = function() {
         curObj.test = "foo2";
    }

    this.foo3 = function() {
         curObj.test = "foo3";
    }

  // called by
  this.blah = {};
  var blah = this.blah;
  blah['x'] = new YAHOO.widget.Button(x)
  blah['x'].on("click", foo2)

  blah['y'] = new YAHOO.widget.Button(y)
  blah['y'].on("click", foo3)
}

我想通过执行以下操作来消除一些冗余:

function setTest(this, foo) {
  this.test = foo;
}

function foo1() {
  var curObj = this;

  // called by
  this.blah = {};
  var blah = this.blah;
  blah['x'] = new YAHOO.widget.Button(x);
  blah['x'].on("click", thisTest("foo2"));

  blah['y'] = new YAHOO.widget.Button(y);
  blah['y'].on("click", thisTest("foo3"));
}

据我了解,YUI 会将“this”对象传递给从 .on(“click”, function) 调用的任何函数。

谢谢你的帮助。

4

2 回答 2

2

您可以根据此处的 API 文档发送单个参数:http: //developer.yahoo.com/yui/docs/YAHOO.util.Element.html#method_on

例如:

function setTest(this, foo) {
  this.test = foo;
}

function foo1() {
  var curObj = this;

  // called by
  this.blah = {};
  var blah = this.blah;
  blah['x'] = new YAHOO.widget.Button(x);
  blah['x'].on("click", thisTest, "foo2");

  blah['y'] = new YAHOO.widget.Button(y);
  blah['y'].on("click", thisTest, "foo3");
}

如果您想传递多个值,则需要创建一个包含您要传递的所有值的数组或对象。这是 API 中的一个限制。

于 2013-03-07T06:55:42.010 回答
1

您可以使用 JavaScript 闭包来实现这一点。这也将使您能够更好地控制您希望事件处理程序能够访问的参数的数量和类型。此外,此方法与框架无关。

例如,在问题中给出的代码片段中,thisTest 可以按如下方式执行闭包。

var thisTest = function (arg1, arg2) {

    return function () { // handler function

        // arg1 and arg2 will be available inside this function.

        // also any arguments passed to the handler by the caller will be 
        // available without conflicting with arg1 or arg2.

    }
}

这是一个演示这一点的 jsFiddle 链接。 http://jsfiddle.net/M98vU/4/

这里必须记住两件事:

  1. 通过闭包附加事件处理程序引起的循环引用可能会导致旧(ish)浏览器中的内存泄漏。在不需要或在页面卸载时分离处理程序可能是一个好主意。

  2. 在附加处理程序时,传递的固定/静态参数必须是已知的(可确定的)。

于 2013-03-07T07:35:46.703 回答