访问在 change 方法之外的 change 方法中更改的变量值?
Accessing the value of variable that is changed in a change method outside of the change method?
我以前试过问过这类问题,但我不明白我想做的事情是否可行。当事情发生变化时,例如 select 下拉列表被更改或复选框被选中或未选中时,是否可以将这些值放在全局变量中,以便我稍后可以在代码中使用这些值
例如我想做这样的事情
var amountChosen;
$('#amountItems').change(function(){
amountchosen = $('#amountItems option:selected').val();
alert(amountchosen)
});
所以我希望 amountChosen 的值在 change 方法中发生变化,因为我知道它是这样工作的,但我不会将其应用于全局变量。
因为我想在另一个函数的深处做这样的事情
if(amountChosen == 2){
do this
}
if(amountChosen == 3){
do this
}
etc.
我永远无法在 change 方法之外获取值,这是个大问题。
如果我的代码中有某个地方,我需要提取信息的部分,比如用户检查过的这个和他选择的项目数量。据我所知,我必须在 .change 方法或 .is('checked') 中完成所有这些工作。如何使更改的变量在远离代码的函数的参数中可用。
总结一下。我有不同的功能根据状态做不同的事情(我猜它就是这样叫的)。我在函数中获取更新状态时遇到问题,因此我可以根据状态采取行动
您可能想要探索使用事件发射器或发布-订阅系统。由于您已经在使用 jQuery,因此很容易创建我们自己的发射器。
$emitter = $({});
function foo() {
$('#amountItems').change(function(){
var amountchosen = $('#amountItems option:selected').val();
$emitter.trigger('amountUpdate', amountchosen);
});
}
function bar() {
$emitter.on('amountUpdate', function(e, amount){
// do something with the amount
});
}
这使您处于相同的情况,两个函数都需要在其范围内包含事件发射器,但发射器可以是许多未耦合或松散耦合的组件相互通信的通道。
一个非常简单的解决方案是简单地将值保存在某处,然后稍后查找:
<input type="text" id="amountItems" data-amount-chosen="0">
$('#amountItems').change(function(){
amountchosen = $('#amountItems option:selected').val();
$('#amountItems').data("amount-chosen", amountchosen);
alert(amountchosen);
});
// somewhere later...
var amountchosen = $('#amountItems').data("amount-chosen");
if(amountChosen == 2){
do this
}
if(amountChosen == 3){
do this
}
etc.
请注意,我们只是更改了 html 标签以添加一个数据元素,将正确的数据保存在那里,然后在需要时再次查找。
您不需要做任何特别的事情:如果您使用定义为 "outside" 函数作用域的变量,则会创建一个闭包,函数将保留对该变量的引用。如此多的函数可以引用同一个变量。
例如在你的代码中非常高(比如在全局级别):
// At the top of your main file.js
var myVar = initialValue;
// somewhere deeper into the code (getter)
function one() {
if (myVar === something) { ... }
}
// Somewhere else like from another file (setter)
function two() {
myVar = something;
}
如果您无法访问这些函数之一的 myVar,则意味着您没有将 myVar 声明得足够高。当我说 "high" 时,我在考虑范围层次结构:
// global level, very high
var rootVariable;
function toto() {
// toto level, has access to rootVariable
var totoVar;
}
function tutu() {
// tutu level, has access to rootVariable but not totoVar
var tutuVar;
}
如果我误解了你的问题或者仍然不起作用,请尝试创建一个 jsfiddle 来重现你的问题。
我以前试过问过这类问题,但我不明白我想做的事情是否可行。当事情发生变化时,例如 select 下拉列表被更改或复选框被选中或未选中时,是否可以将这些值放在全局变量中,以便我稍后可以在代码中使用这些值 例如我想做这样的事情
var amountChosen;
$('#amountItems').change(function(){
amountchosen = $('#amountItems option:selected').val();
alert(amountchosen)
});
所以我希望 amountChosen 的值在 change 方法中发生变化,因为我知道它是这样工作的,但我不会将其应用于全局变量。
因为我想在另一个函数的深处做这样的事情
if(amountChosen == 2){
do this
}
if(amountChosen == 3){
do this
}
etc.
我永远无法在 change 方法之外获取值,这是个大问题。
如果我的代码中有某个地方,我需要提取信息的部分,比如用户检查过的这个和他选择的项目数量。据我所知,我必须在 .change 方法或 .is('checked') 中完成所有这些工作。如何使更改的变量在远离代码的函数的参数中可用。
总结一下。我有不同的功能根据状态做不同的事情(我猜它就是这样叫的)。我在函数中获取更新状态时遇到问题,因此我可以根据状态采取行动
您可能想要探索使用事件发射器或发布-订阅系统。由于您已经在使用 jQuery,因此很容易创建我们自己的发射器。
$emitter = $({});
function foo() {
$('#amountItems').change(function(){
var amountchosen = $('#amountItems option:selected').val();
$emitter.trigger('amountUpdate', amountchosen);
});
}
function bar() {
$emitter.on('amountUpdate', function(e, amount){
// do something with the amount
});
}
这使您处于相同的情况,两个函数都需要在其范围内包含事件发射器,但发射器可以是许多未耦合或松散耦合的组件相互通信的通道。
一个非常简单的解决方案是简单地将值保存在某处,然后稍后查找:
<input type="text" id="amountItems" data-amount-chosen="0">
$('#amountItems').change(function(){
amountchosen = $('#amountItems option:selected').val();
$('#amountItems').data("amount-chosen", amountchosen);
alert(amountchosen);
});
// somewhere later...
var amountchosen = $('#amountItems').data("amount-chosen");
if(amountChosen == 2){
do this
}
if(amountChosen == 3){
do this
}
etc.
请注意,我们只是更改了 html 标签以添加一个数据元素,将正确的数据保存在那里,然后在需要时再次查找。
您不需要做任何特别的事情:如果您使用定义为 "outside" 函数作用域的变量,则会创建一个闭包,函数将保留对该变量的引用。如此多的函数可以引用同一个变量。
例如在你的代码中非常高(比如在全局级别):
// At the top of your main file.js
var myVar = initialValue;
// somewhere deeper into the code (getter)
function one() {
if (myVar === something) { ... }
}
// Somewhere else like from another file (setter)
function two() {
myVar = something;
}
如果您无法访问这些函数之一的 myVar,则意味着您没有将 myVar 声明得足够高。当我说 "high" 时,我在考虑范围层次结构:
// global level, very high
var rootVariable;
function toto() {
// toto level, has access to rootVariable
var totoVar;
}
function tutu() {
// tutu level, has access to rootVariable but not totoVar
var tutuVar;
}
如果我误解了你的问题或者仍然不起作用,请尝试创建一个 jsfiddle 来重现你的问题。