jquery正则表达式replace()只运行两次...然后没有

时间:2011-10-28 22:46:21

标签: javascript jquery regex

我对这个问题感到羞愧和沮丧。我写的应该是一个非常简单的脚本,删除“y”并用“i”替换它们。当发生这种情况时,我将一个类添加到新的“i”中,以便我可以撤消它。由于某种原因,第一次更换工作...切换回工作......它再次工作...然后停止。我不知道还能做什么,只是发布整个丑陋的剧本。

不要担心粗糙的正则表达式(它只针对某些有时用于编写Mohawk的“y”)。

编辑:这是关于jfiddle的实时版本:http://jsfiddle.net/vkVBk/

$(document).ready(
function() {

    function swap_out_y(x) {
        //alert(x);
        x = x.replace(/y/, "i");
        x = x.replace(/Y/, "I");
        alert('swap_out_y just ran. x = '+x);
        return x;   
    }

    function swap_out_i(x) {
        //alert(x);
        x = x.replace(/i/, "y");
        x = x.replace(/I/, "Y");
        alert('swap_out_i just ran. x = '+x);
        return x;   
    }

    $('body').delegate('.y_to_i', 'click', y_to_i);
    //$('body').delegate('.i_to_y', 'click', i_to_y);

    function y_to_i() {

        $("span.mohawk_word").each(
            function() {
                $(this).html(
                    $(this).text().replace(/(y[aevu])|(y[oe]n)/ig, function(s) {
                        return '<span class="consonant">'+swap_out_y(s)+'</span>'; 
                        })
                );
            }
        );



        $('.y_to_i').undelegate('click');       
        $('.y_to_i').addClass('i_to_y');
        $('.y_to_i').removeClass('y_to_i');
        $('body').delegate('.i_to_y', 'click', i_to_y);
        //alert('A');
    } //end y_to_i


    function i_to_y(){

        $("span.consonant").each(
            function() {
                $(this).html($(this).text().replace(/i/ig, 
                    function(s) {
                        return swap_out_i(s);
                    }
                )//replace...
                );//html
                //$(this).removeClass('replacement_i');
            }//function(){
        );//each(   

        $('.i_to_y').undelegate('click');
        $('.i_to_y').addClass('y_to_i');
        $('.i_to_y').removeClass('i_to_y');
        $('body').delegate('.y_to_i', 'click', y_to_i);
    }

} //function
); //document ready

2 个答案:

答案 0 :(得分:1)

你在'body'上调用委托,然后在某些类而不是body上调用undelegate。所以你最终会遇到多个代表。

工作小提琴。 http://jsfiddle.net/5HdSC/1/

答案 1 :(得分:0)

你忘记了你的i_to_y函数中的跨度,所以它没有跨度$(“span.mohawk_word”)在你删除并用consonate替换它两次之后迭代,它就消失了。

修改 实际上你已经在你的html中有了span,所以你不需要在你的回报中添加额外的跨度......只需让其他函数也使用mohawk_word span 替换为mohawk_word跨越整个问题。

        function y_to_i() {

        $("span.mohawk_word").each(
            function() {
                $(this).html(
                    $(this).text().replace(/(y[aevu])|(y[oe]n)/ig, function(s) {
                        return swap_out_y(s); 
                        })
                );
            }
        );



        $('.y_to_i').undelegate('click');        
        $('.y_to_i').addClass('i_to_y');
        $('.y_to_i').removeClass('y_to_i');
        $('body').delegate('.i_to_y', 'click', i_to_y);
        //alert('A');
    } //end y_to_i


    function i_to_y(){

        $("span.mohawk_word").each(
            function() {
                $(this).html(
                    $(this).text().replace(/i/ig, 
                    function(s) {
                        return swap_out_i(s); 
                    }
                ) );                  
            }
        );

        $('.i_to_y').undelegate('click');
        $('.i_to_y').addClass('y_to_i');
        $('.i_to_y').removeClass('i_to_y');
        $('body').delegate('.y_to_i', 'click', y_to_i);
    }

}