【问题标题】:Javascript Replace function not working on first instanceJavascript替换功能不适用于第一个实例
【发布时间】:2015-06-21 19:40:52
【问题描述】:

我目前正在尝试创建一个列表,使用 javascript 和 jquery 返回一串关键字,如下所示:keyword+keyword+keyword+keyword

我试图通过在单击关键字时添加一个类“活动”来做到这一点,如下面的代码所示,然后检查它是否处于活动状态,如果是,则将其添加到带有附加 + 号的列表(除了第一个元素,受计数器限制),但是每当我连续单击一个项目 2 次时,它都会成功添加到列表中,但不会从中删除,但通常会添加和减去计数器,以及控制台日志报告类的变化。 代码如下;

        $("ul.cats li, ul.colours li ").click(function(){
            $(this).toggleClass( 'active');
        });

        var taglist = '';
        var tagcounter = 1;

        $("ul.cats li.tag").click(function(){
            var tag = $(this).attr("list-data");

            if ($(this).hasClass('active')) {   

                if (tagcounter <= 0){
                    taglist += '+';
                }
                taglist += tag;
                tagcounter -= 1;
                console.log('Active');

            }  else {

                var tag2 = '+' + tag;
                taglist = taglist.replace(tag2," ");
                tagcounter += 1;
                console.log('inactive');

            }
            console.log(taglist, 'Taglist', tagcounter);

        });

从这里我相信我应该得到一个keyword1+keyword2+keyword3的列表,但是每当一个项目被连续点击两次时,(keyword1连续呈现活动和非活动)关键字没有被删除但计数器增加并且类被呈现为非活动状态。 使用示例关键字“light”,这是控制台返回的内容;

[Log] Active 
[Log] Light Taglist 0 
[Log] inactive 
[Log] Light Taglist 1 (wordpress, line 237)

这表明该类检查并且 if 语句正常运行,但替换功能不正常。 请有人提供解决方案,我将永远感激不尽!

【问题讨论】:

    标签: javascript jquery string if-statement replace


    【解决方案1】:

    问题在于tagcounter &lt;= 0 的检查。 当您第一次检查时,tagcounter 仍然是 1。稍后您将其递减。因此,“+”永远不会被附加。因此,当您尝试删除“+Light”时,它不起作用,因为标签列表中没有“+”。

    将递减代码 tagcounter -=1 移到 tagcounter 检查上方。

                tagcounter -= 1;
                if (tagcounter <= 0){
                    taglist += '+';
                }
                taglist += tag;
    

    它工作正常。这是一个工作演示http://jsfiddle.net/gqgL3dgk/

    这将在您的标记列表的开头附加一个“+”。您可以使用 substring 方法摆脱多余的“+”号。 taglist = taglist.substring(1); //includes all characters except the 0th

    推荐 由于您必须维护一个列表,因此请使用更适合列表(即数组)的数据结构,并在需要时将其转换为“+”分隔的字符串。 您可以继续从数组中推/拉标签,并使用 join() 方法将其转换为“+”分隔的字符串。

    在这里工作http://jsfiddle.net/gqgL3dgk/1/

    这将消除您对 tagcounter 的依赖(因为数组长度可以让您做到这一点)。而且添加和删除元素超级简单。

    【讨论】:

    • 这就是重点,我不希望第一个关键字前面有一个 +,我该如何解决这个问题?
    • 从 taglist 中删除第一个字符。 by taglist = taglist.substring(1);
    • 我进行了编辑。显示解决问题的正确方法。也请看一下
    【解决方案2】:

    .replace() 的第一个参数需要是正则表达式。您可以使用new RegExp()从字符串生成它:

    taglist = taglist.replace(new RegExp(tag2)," ");
    

    编辑: Ooops - 字符串 作为第一个参数有效。它不被视为正则表达式,但在此示例中它不需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 2018-05-24
      • 2017-12-31
      相关资源
      最近更新 更多