我可以在Javascript中使用指针吗?

时间:2014-07-30 13:35:01

标签: javascript events pointers hook

有什么方法可以将元素onclick事件挂钩到变量?

如果我更改变量,onclick事件也会更新吗?为什么不这样呢?

当我写一个框架时,有时我在页面的不同部分有一些按钮,但这些按钮挂钩到同一个事件功能。

当我想更改事件功能时,我必须更改所有这些按钮的事件!

我可以这样做吗?

var publicFunc = function(){console.log('aaa');},
    button1 = document.getElementById('button1'),
    button2 = document.getElementById('button2');
button1.onclick = publicFunc;
button2.onclick = publicFunc;

//i hope when i change publicFunc, all onclick event change
publicFunc = function(){console.log('bbb');};
//how to tell all the buttons this event function has changed?!
//i hope button1.onclick now is "function(){console.log('bbb');};"
//but of course it's "function(){console.log('aaa');};"
//is there any smart way to change it to "bbb"???

我想到的第一个想法是找到一种在Javascript中使用指针的方法,就像在C / C ++中一样,但在硬搜索之后,我找不到有关它的信息。

2 个答案:

答案 0 :(得分:3)

执行button2.onclick = publicFunc;时,您将函数分配给.onclick属性,而不是变量。因此,当您为该变量分配新函数时,.onclick不会受到影响。

要完成你想要做的事情,你需要第二个功能。您的处理程序调用第二个可以替换的函数。

http://jsfiddle.net/jre2N/1/

var changeable = function () {
    console.log("aaaa");
};
var publicFunc = function () {
    changeable();
};

var button1 = document.getElementById('button1');
var button2 = document.getElementById('button2');
button1.onclick = publicFunc;
button2.onclick = publicFunc;

//change the behavior
changeable = function () {
    console.log('bbb');
};

答案 1 :(得分:3)

术语存在问题,即指针与引用。没有办法在JavaScript中模拟C ++引用。

也就是说,您无法更改一个变量并影响对它的其他引用。

要解决您的问题,您可以执行以下操作

var publicFunc = function(){console.log('aaa');},
    button1 = document.getElementById('button1'),
    button2 = document.getElementById('button2');
button1.onclick = button2.onclick = function(e) {
    publicFunc();
};

publicFunc = function(){console.log('bbb');};

在不同的情况下说同样的事情(引用一个对象,一个函数是一个对象)

var a = {prop: 2};
var b = a;
a = {anotherprop: 3};
// b still points to the original object {prop:2}

在这种情况下解决这个问题,你必须添加另一个间接级别,就像我们对函数一样;

var a = {indirection: {prop:2} };
var b = a;
a.indirection = {anotherprop: 3};

最后,这只能用于对象,即它永远不会使用数字,布尔值或字符串,因为它们总是按值传递(除非你使用包装器new Number(), new String...