我想在某些事件触发时保留在内存中的值,例如当用户拖动并且我想保存元素索引时。当另一个事件可能触发时,需要该值。我不知道它是否会开火。
我正在使用全局变量来保持这些值。似乎有更好的方法可以将这些值放在具有命名空间的对象中。好处?还有其他建议吗?
答案 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>