Javascript全局变量在下次事件调用时返回到之前的状态

javascript global variable returning to previous state on next event call

本文关键字:状态 返回 全局变量 下次 事件 调用 Javascript      更新时间:2023-09-26

所以我有一个全局变量

var INSIDE_GLOBAL = {} ;
INSIDE_GLOBAL.current_search = get_new_current_search();
function get_new_current_search() {
    return {
        stack:[],
        search_options: {
            keywords: ""
            },
        };
}

然后,设置用于单击手风琴中的不同div节的处理程序。这将向手风琴添加一个新节,使其成为当前查看的节,并使用相同的函数(setup_search_click_handlers)为下一个节设置单击处理程序。

function setup_search_click_handlers() {
    $('.search_option').unbind("click");
    $('.search_option').bind("click", function(e) {
        var new_sub_group = $(this).attr('id');
        $("#new_search_panel").bind("accordionchange", function(event, ui) { 
            $("#new_search_panel").unbind("accordionchange");
            //push new section onto the current searches
            INSIDE_GLOBAL.current_search.stack.push(new_sub_group);
            /* pseudo code */
            accordion_add_section_and_select_that_section( with_callback: setup_search_click_handlers );
        });
        $("#new_search_panel").accordion("activate",-1);    //Collapse the accordion, calls the newly binded change             
    });
}

在第一次点击结束时,INSIDE_GLOBAL.current_search。Stack中有一个元素;但是,当下一次单击事件发生时,绑定的函数调用INSIDE_GLOBAL.current_search。堆栈返回为空。我不知道为什么。

我假设它与不同回调的作用域有关,但真的不确定。

在firebug中,我可以看到窗口INSIDE_GLOBAL正确地改变,然后被"重置"到堆栈数组再次为空的地方

刚刚明白了。我花了几个小时试图找出问题,然后在发帖后不久就找到了,这是有道理的。

我刚刚将堆栈数组添加到我的代码中,并将一些在方法中传递的索引更改为仅使用堆栈。长度字段。

我在其他地方有一个绑定,当手风琴最小化时调用一个函数。当用户单击手风琴中的前一节(在搜索中向后移动)时使用。它检查几个参数以确保是这种情况,并在用户单击后删除手风琴的部分。在执行此操作时,它还调用stack.pop()以使后端数据保持最新。

通过从使用索引变量更改为长度变量,第一次手风琴最小化时,这个检查将错误地通过并将just变量弹出到堆栈…

这里有一部分代码给好奇的人

function setup_return_to_previous_handlers() {
    var event_function = function(event, ui) { 
        var active_index = $("#new_search_panel").accordion( "option", "active" );
        var index = INSIDE_GLOBAL.current_search.stack.length; //BUG here: needs to be length-1;
        //alert("accord_change: active:"+active_index+" index:"+index);
        if (    typeof active_index==="number" &&   //Filter's active === false, if user clicked last section
                active_index >= 0 &&                //Filters refreshes
                active_index != index ) {           //User clicked previous section
            $("#new_search_panel").unbind("accordionchange");
            bind_search_buttons();
            //alert("inside");
            for ( ; index > active_index; --index) {
                /* remove accordion sections */
                INSIDE_GLOBAL.current_search.stack.pop(); //Bug: Shouldn't have been called
            }
        }
    };
    $("#new_search_panel").unbind("accordionchange");
    $("#new_search_panel").bind("accordionchange", event_function); 
}