在Javascript事件之间传递参数的干净方法?

时间:2011-01-17 20:11:09

标签: javascript javascript-events

我想在某些事件触发时保留在内存中的值,例如当用户拖动并且我想保存元素索引时。当另一个事件可能触发时,需要该值。我不知道它是否会开火。

我正在使用全局变量来保持这些值。似乎有更好的方法可以将这些值放在具有命名空间的对象中。好处?还有其他建议吗?

4 个答案:

答案 0 :(得分:4)

我最喜欢的是将变量调整到事件处理程序中。 Curry是一个函数原型,当在一个函数上调用它时,它将返回一个带有预置参数的函数版本:

Function.prototype.curry = function curry() {
    var fn = this, args = Array.prototype.slice.call(arguments);
    return function curryed() {
        return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));
    };
};

node.addEventListener('mousedown', handler.curry(var1,var2,etc));

答案 1 :(得分:3)

您可以将数据绑定到父元素,该元素是每个值的相关容器。例如,假设您有一个#dragAndDropContainer,其中有许多拖放项,然后只要一个拖动事件触发(即拖动开始),您就可以(在jQuery中)执行:

$('#dragAndDropContainer').data('lastDragged', $(this).attr('id'));

然后只需在每次需要时查询$('#dragAndDropContainer').data('lastDragged')

答案 2 :(得分:1)

我喜欢davin的解决方案,但如果不适合你,这里有另一种选择。您可以在事件处理程序周围创建一个闭包,如下所示:

var data = { x: 1, y: 2 };
var handler = function() {
  console.log(data);
}

if (node.addEventListener) {
  node.addEventListener('mousedown', handler, false);
} else {
  node.attachEvent('onmousedown', handler);
}

答案 3 :(得分:0)

使用Function.bind(有时称为curry)的替代方法:您可以控制共享变量的范围。这里有一些jQuery伪代码演示它。这两个处理程序和其他任何人都无法访问共享。

$(function(){
  var shared = {a:1, b:2};
   $('#id-1').click(function() {
      alert(shared.a);
   });

   $('#id-2').click(function() {
      alert(shared.b);
   });
});

如果你正在编写jQuery过程代码,那么闭包方法要简单得多。因为我编写的大多数内容都是一个对象,所以我宁愿不进入太多级别的内部闭包,所以如果处理程序需要访问共享变量,我更喜欢设置带有绑定/ currying的处理程序(如Martin的示例)。 p>