1

如果我执行以下操作:

image[i].onmousedown = whatever;

它可以正常工作并在单击时运行whatever() 函数。但是,如果我执行以下操作:

image[i].onmousedown = whatever( name, what, when, where, how );

它将在分配属性时运行该函数。假设我创建了 30 张图像并希望为它们提供所有 onmousedown 函数,它会在加载时运行该函数 30 次,因为我在之后添加了 ()。但是我如何为我的函数分配我想要的属性呢?

是使函数运行该函数的唯一方法吗?所以做类似的事情

image[i].onmousedown = whatever;

function whatever() {
   anotherWhatever( this, name, what, when, where, how );
}

我似乎还必须为“ this ”分配一个新值?你们有什么建议或请告诉我你有更好的方法。提前感谢您的帮助

4

2 回答 2

2

您可以使用 ecmaScript5绑定函数来绑定上下文并设置要传入的参数。

image[i].onmousedown = whatever.bind(this, name, what, when, where, how );  

this这将是您绑定事件的当前上下文。如果要获取元素本身的上下文,则:

image[i].onmousedown = whatever.bind(image[i], name, what, when, where, how );  

正如 MDN 中提到的,您可以将此脚本放在您的 js 中以获得旧版浏览器的支持。

if (!Function.prototype.bind) {
  Function.prototype.bind = function (oThis) {
    if (typeof this !== "function") {
      // closest thing possible to the ECMAScript 5 internal IsCallable function
      throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var aArgs = Array.prototype.slice.call(arguments, 1), 
        fToBind = this, 
        fNOP = function () {},
        fBound = function () {
          return fToBind.apply(this instanceof fNOP && oThis
                                 ? this
                                 : oThis,
                               aArgs.concat(Array.prototype.slice.call(arguments)));
        };

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();

    return fBound;
  };
}
于 2013-06-22T01:39:17.847 回答
1

您需要将其包装在一个匿名函数中:

image[i].onmousedown = function () { whatever.call(this, name, what, when, where, how ); };
于 2013-06-22T02:12:06.623 回答