Javascript push替换数组中的旧值

Javascript push替换数组中的旧值,javascript,arrays,push,Javascript,Arrays,Push,也许是因为我工作了一整天,看不出问题所在。但在以下代码中,警报仅显示最后添加的值,而不会将值推送到数组中:( 一些html: <div class='sortcriteria advanced'> <label>Sort by: </label> <div class='controlWrapper'> <input type="text

也许是因为我工作了一整天,看不出问题所在。但在以下代码中,警报仅显示最后添加的值,而不会将值推送到数组中:(

一些html:

<div class='sortcriteria advanced'>

                <label>Sort by: </label>
                <div class='controlWrapper'>
                    <input type="text" placeholder='Any' value='Any' class='dropDownExpand'>
                    <span  class='icon dropDownExpand' title='Select property type'></span>
                    <ul class='dropdownContent'>
                        <li><a href='#' class='price'>Price ascending</a></li>
                        <li><a href='#' class='price'>Price descending</a></li>
                        <li><a href='#' class='party'>Party size ascending</a></li>
                        <li><a href='#' class='party'>Party size descending</a></li>
                        <li><a href='#' class='bedrooms'>Number of bedrooms ascending</a></li>
                        <li><a href='#' class='bedrooms'>Number of bedrooms descending</a></li>
                        <li><a href='#' class='star'>Star rating ascending</a></li>
                        <li><a href='#' class='star'>Star rating descending</a></li>                           
                    </ul>
                </div> ...

排序方式:

...
  • 没有JavaScript错误
  • 内容和脚本通过ajax加载
  • 所有其他语句都按照它们应该做的做

  • 您需要将
    var currentSelectedGroups=[];
    移动到每个循环之外。您为每个实例声明一次它-它们都使用自己版本的变量,因为它位于每个函数的局部范围内

    请记住,在javascript functions=scope

    中,正如我在前面的评论中询问(并怀疑)的那样,您需要移动:

    var currentSelectedGroups = [];
    
    .each()
    循环外部。实际上,在循环的每次迭代中,您都将其重新初始化为一个空数组,因此它的值不会超过一个。您可以这样做:

    var currentSelectedGroups = [];
    
    $.each(sortControl.advancedDropdownContent.parent(), function () {
    
            var dropdownContent = $(this).find('.dropdownContent');
            var input = $(this).find('input');
    
            $(this).find('.dropDownExpand').live('click', function (event) {
                sortControl.advancedDropdownContent.not(dropdownContent).hide('fast');
                dropdownContent.toggle('fast');
                event.preventDefault();
            });
    
            $(this).find('li a').bind('click', function (event) {
    
                var criteria = $(this).text();
                //if (!currentSelectedGroups.inArray($(this).attr('class'), true)) {
                input.attr('value', criteria);
                currentSelectedGroups.push($(this).attr('class'));
    
                //}
    
                dropdownContent.toggle('fast');
    
                event.preventDefault();
                alert(currentSelectedGroups);
            });
    
        });
    

    其中是
    var currentSelectedGroups=[]
    声明?它是在全局范围内,从一次单击到下一次单击都能存活下来吗?还是它是某个局部变量,并且被销毁和重新创建,因此它只包含您刚才添加到它的值?我更新了代码的更多部分并提出了问题我不知道您的意图是什么,但您正在创建一个新的
    currentSelectedGroups是数组每次迭代的
    元素。非常感谢。我想我快瞎了。今天已经做了9个小时了……这只是瞎了。请添加您的评论作为回答。还请注意,使用
    $(this)。查找('.dropDownExpand').live('click',…
    ,the
    .live()
    处理程序不会将自身局限于
    的后代。基本上,您正在执行
    $('.dropDownExpand')。live('click',…
    每次迭代一次,因此您可能会绑定冗余处理程序。错过这一次我感到非常羞愧。不,我们每隔一段时间都会有很长的一天,有时您只是因为所有的树而看不到森林;)
    var currentSelectedGroups = [];
    
    $.each(sortControl.advancedDropdownContent.parent(), function () {
    
            var dropdownContent = $(this).find('.dropdownContent');
            var input = $(this).find('input');
    
            $(this).find('.dropDownExpand').live('click', function (event) {
                sortControl.advancedDropdownContent.not(dropdownContent).hide('fast');
                dropdownContent.toggle('fast');
                event.preventDefault();
            });
    
            $(this).find('li a').bind('click', function (event) {
    
                var criteria = $(this).text();
                //if (!currentSelectedGroups.inArray($(this).attr('class'), true)) {
                input.attr('value', criteria);
                currentSelectedGroups.push($(this).attr('class'));
    
                //}
    
                dropdownContent.toggle('fast');
    
                event.preventDefault();
                alert(currentSelectedGroups);
            });
    
        });