【问题标题】:Accessing the value of variable that is changed in a change method outside of the change method?访问在更改方法之外的更改方法中更改的变量的值?
【发布时间】:2015-02-03 03:37:29
【问题描述】:

我之前尝试过问这种类型的问题,但我不明白我想做的事情是否可行。当事情发生变化时,例如更改选择下拉列表或选中或取消选中复选框时,是否可以将这些值放入全局变量中,以便稍后在代码中使用这些值 例如我想做这样的事情

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 方法或 .is('checked') 中完成所有这些工作。如何使更改的变量在远离代码的函数的参数中可用。

总结一下。我有不同的功能根据状态做不同的事情(我猜它就是这样)。我在获取函数中的更新状态时遇到问题,因此我可以根据状态进行操作

【问题讨论】:

  • 我知道谢谢。但这不是我现在的问题。我没有在我试图犯的应用程序中犯这个错误。我只是在试图解释我的问题时在这里犯了这个错误。生病改变它。我想我的问题可能是关于代码结构
  • 发布显示您的问题的运行代码(如Code Snippet)。
  • 听起来像是一个范围界定问题,你能给我们看看这个“深度函数”的代码吗
  • 这是我之前的工作。如果你去小提琴jsfiddle.net/ot38Lz70/3 并转到下面的部分//如果我将此代码从点击事件中取出,它不会起作用评论。它行不通。你会看到我不能在 click 事件之外使用 withones 变量。假设我想使用 withones 的值在其他地方显示选中或未选中。基本上我想让你告诉我如何在点击事件之外使用更新的withone。

标签: javascript function variables onchange


【解决方案1】:

您可能想使用事件发射器或发布-订阅系统进行探索。由于您已经在使用 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
  });
}

这使您处于相同的情况,即两个函数都需要将事件发射器置于其范围内,但发射器可以是许多非耦合或松耦合组件相互通信的通道。

【讨论】:

  • 使用来自api.jquery.com/trigger 的触发器?您创建了一个名为 amountUpdate 的事件类型,它具有更新的 val。那么你在 obj 的 on 方法中使用事件类型呢?我不认为我会做这么先进的事情。这看起来很有趣。我以前从来没有这样做过。感谢您的回复。
  • 听起来你明白了。这是一种常见的模式,您已经熟悉 jQuery,因为触发和订阅自定义事件使用与 DOM 事件相同的 API。
  • 很抱歉打扰您,但我在执行此操作时遇到了麻烦。我还是个新手。我不知道如何/在哪里调用这些函数视图 jsfiddle --jsfiddle.net/ob2bybcq 我想我希望能够在 bar 函数中做一些事情,比如 if(amount == 3) alert(3)。我只是无法获得一个简单的 console.log 。如果您能早点联系我,那就太好了
  • 我喜欢@Jack 的解决方案,因为它非常干净/是此用例的最佳实践:它不会污染全局范围,同时准确地完成您想要实现的目标,仅此而已,无副作用。 PubSub 是一种非常常见的模式。 Here's it is in a separate gist,其中列出了实现相同模式的一些其他变体。
  • @jack 感谢您的帮助,但我仍然无法理解如何分离事件,因此我可以在对象类型的事物中获得它们的结果。我提出了一个更详细的问题。 stackoverflow.com/questions/28332651/… .. 如果你有机会能回答这个问题,我将不胜感激。
【解决方案2】:

您不需要做任何特别的事情:如果您使用在函数范围“外部”定义的变量,则会创建一个闭包,并且该函数将保留对该变量的引用。这么多函数可以引用同一个变量。

例如在您的代码中非常高(如在全局级别):

// 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 声明得足够高。当我说“高”时,我在考虑范围层次结构:

// 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 来重现您的问题。

【讨论】:

    【解决方案3】:

    一个非常简单的解决方案是简单地将值保存在某处,然后再查找它:

    <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 标记以添加数据元素,将正确的数据保存在那里,然后在需要时再次查找。

    【讨论】:

    • 我还没有测试这个。但我在看第一行&lt;input type="text" id="amountItems" data-amount-chosen="0"&gt;do 我需要有data-amount-chosen 这里我使用选择框。我是否必须这样做&lt;select name="" id="amountItems" data-amount-chosen="0"&gt; 而不是&lt;select name="" id="amountItems" &gt;
    • 是的,您可以将数据元素添加到大多数类型的元素中
    • 您好,我相信我尝试实施您告诉我的内容,但数量选择的测试似乎不正确。你可以在小提琴中看到它。 jsfiddle.net/L4oamm2s 。当我在选择框中更改为 2 时,我没有收到任何警报。它应该说“选择了数量 2”
    • 你看到问题了吗?
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2018-12-02
    • 2010-10-04
    相关资源
    最近更新 更多