javascript全局变量在下一个事件调用时返回到先前的状态

时间:2011-08-04 18:10:39

标签: javascript jquery callback global-variables scope

所以我有全局变量

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.stack将变为空。无法弄清楚原因。

我假设它与不同的回调范围有关,但实际上并不确定。

在firebug中,我可以看到Window INSIDE_GLOBAL正确更改,然后被“重置”到堆栈数组再次为空的位置

1 个答案:

答案 0 :(得分:0)

刚想通了。有意义的是,我会花费数小时试图找出问题,然后在发布后发现它。

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

我在其他地方有一个绑定,只要手风琴最小化就调用一个函数。当用户点击手风琴中的上一部分(在搜索中向后)时,可以使用此选项。它会检查一些参数以确保是这种情况,并在用户单击之后删除手风琴的各个部分。在执行此操作时,它还调用stack.pop()以使后端数据保持最新。

通过使用索引变量更改为长度变量,第一次手风琴最小化时,此检查会错误地传递并将刚刚变量弹出到堆栈...

这是好奇的人的代码的一部分

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); 
}