所以我有一个全局变量
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);
}