Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从选择中的上一个选项获取数据,以及从当前选项获取数据_Javascript_Jquery_Scope - Fatal编程技术网

Javascript 从选择中的上一个选项获取数据,以及从当前选项获取数据

Javascript 从选择中的上一个选项获取数据,以及从当前选项获取数据,javascript,jquery,scope,Javascript,Jquery,Scope,所以我知道JavaScript中的作用域可能有点不稳定,我尝试了一些不同的方法,包括将变量声明附加到窗口(即window.var),并在函数的不同部分内外声明变量,但都没有用。以下是我得到的: $(".some_field").on('focus', function () { // Store the previous option value before the change prev = String($(":selected", $(this)).data('opti

所以我知道JavaScript中的作用域可能有点不稳定,我尝试了一些不同的方法,包括将变量声明附加到窗口(即window.var),并在函数的不同部分内外声明变量,但都没有用。以下是我得到的:

$(".some_field").on('focus', function () {

    // Store the previous option value before the change
    prev = String($(":selected", $(this)).data('option_id'));

}).change( function() {

    alert(prev); // alerts '4'

    current = String($(":selected", $(this)).data('option_id'));
    alert(current) // alerts '5'

    alert(prev); // alerts '5' ..... it should alert '4'
});    

本质上,在change函数中,我需要同时使用前面和当前选项id来执行操作,而不是使用全局,我建议使用旧的值数据属性来装饰输入

试试这个:

例如:

$(".some_field").on('focus', function () {
    $(this).data('oldValue', $(this).data('option_id'));
}).change(function () {
    alert("Old value on focus was: " + $(this).data('oldValue'));
    alert("Current option_id value: "+$(this).data('option_id'));
});

您需要使用一个变量/属性来存储每个元素的上一个值。全局变量没有帮助。实际上,您甚至不需要这些
焦点
事件

$(".some_field").each(function () {
     $(this).data('id_value', $(":selected", this).data('option_id'));
}).change(function(e) {
     var previous = $(this).data('id_value'),
         current = $(":selected", this).data('option_id');

     alert(…); // or whatever

     $(this).data('id_value', current);
});

以@Scott的回答为指导,这就是最终对我有用的东西。我使用父元素来存储数据@不过,伯吉的答案也很有效

$(".some_field").on('focus', function () {
    // Store the previous option value before the change
    $(this).parent().data('prev_option_id', $(":selected", $(this)).data('option_id'));
}).change( function() {
    current = String($(":selected", $(this)).data('option_id'));
    alert("Old value on focus was: " + $(this).parent().data('prev_option_id'));
    alert("Current option_id value: "+current);
});

prev_option_id和option_id是相同的,因为您正在为这两个选项分配相同的id…是的,您是对的。。。我开始意识到这不是一个范围问题。。。但是,我仍然不确定如何获得所需的功能
字符串($(this).data('option_id'))
??我的意思是,当您聚焦一个元素时,选择一个选项,然后聚焦下一个元素,第二个元素上的
焦点
可能在第一个元素上的
更改
之前触发。因此@Bergi我做了一些故障排除,您对问题的回答肯定是正确的,但是如果我多次更改,您建议的解决方案将无法正常工作。除非我认为这是错误的,在哪种情况下,你愿意在评论之外发布一个更正式的回答呢。。。我需要它更改为的选项id和它更改为的选项id。这就是为什么on(‘focus’)从句在这里开头。哦,我明白了。我更新了答案,将上一个值存储在另一个数据属性中。这也避免了全局变量。我们离这里越来越近了。。。问题是在您的第一个警报中,该行中的$(this)未定义为引用新选择的选项,其中“oldValue”数据存储在我们现在已丢失的上一个选项中。。。您的小提琴使用的是输入元素,请记住我们在这里讨论的是选择元素。