更新:不知何故,这个答案被否决了,尽管投票最多的解决方案是同时发布的,同样优雅,并且在逻辑上是等效的。另一种解决方案只是选择在函数闭包而不是对象闭包中捕获局部变量。
作为选民的责任是实际阅读和思考这些解决方案的作用,而不是仅仅为熟悉的人或声誉最高的人提供的答案投票。
我的回答责任是只回答不是为了人气竞赛的问题,而是在 (A) 我确定一个有效的答案并愿意花时间解释和维护该答案时;或者(B)对于一些没有什么比“答案”更明确的讨论问题,只有当我在我的经验中多次遇到这个问题并且根据我的实际经验对此有话要说时。
出于这个原因,即使社区中的某个人在没有任何解释原因的情况下匿名决定否决它,我也会留下我的答案(就像我过去所做的那样)。
请记住,Stack Overflow 的答案旨在成为有用问题的有用解决方案的存储库,以造福未来所有程序员。值得展示两种不同的方法,而不是单一的方法。
是的,另一个解决方案很优雅,并且演示了使用匿名函数闭包很好地捕获局部变量。然而,在我看来,我的解决方案在 Stack Overflow 的目的方面稍微好一些,因为这个解决方案可以很容易地修改为一个可重用的函数来创建许多监控变量。另一种解决方案将需要一些反卷积,以使其对一个监控功能的不止一个静态实例有用。
function files() {
var dropResult = {};
$('#button1').on('click', function() {
dropResult.result = true;
});
$('#button2').on('click', function() {
dropResult.result = false;
});
return dropResult;
}
var dropObject = files();
该变量dropObject
是一个“监控变量”,可以在任何地方使用,以检查您正在监控的内容的状态(在这种情况下,用户最近一次单击按钮 1 或按钮 2 时指定了哪个选项。)
在使用您的结果的代码中,files()
您可以执行此操作
if (dropObject.result) {
/* do something here that you want to do when the result is true */
} else {
/* do something here when the result is false */
}
我建议存储一些比true
or更有意义的东西false
(例如,如果您想添加第三个按钮,然后监视三个按钮中的哪一个最后被点击?)。
注意:以下是我将如何编写一个更小、更高效的可重用监控函数供我使用(不在函数内硬连线任何参数或名称)并将其应用于此场景:
function clickMonitor(ids) {
var i, f = function() { i = this; }; ids = ids.match(/(\S+)/g) || [];
for (i=0; i<ids.length; i++)
document.getElementById(ids[i]).onclick = f;
return function() { return i; };
}
下一部分只是创建一个dropResult
“即插即用”的变量来代替您的dropResult
变量,除了您必须检查dropResult()
是真还是假(函数调用)而不仅仅是dropResult
.
dropResult = (function() {
var x = clickMonitor('button1 button2');
return function() { return x().id == 'button1'; };
})();
一般来说,这就是您将如何使用它(当然,如果需要,可以将两个以上的按钮 ID 传递给它):
getMostRecentClickedButton = clickMonitor('button1 button2');
调用getMostRecentClickedButton()
会返回最近单击的整个按钮对象,以便您可以对它进行一些操作,例如使字体加粗等,而无需执行另一个中间 jQuery 或 JavaScript 过程。