2

我有以下JS代码

$('body').on({
    click: function()
    {
        var el = $(this);
        lookUpTask(el);

        el.bind('blur', function(){
            timeOutTask = setInterval(function(){
                if( timeOutTask )
                {
                    clearInterval(timeOutTask);
                    el.trigger('remove_match');
                }
            }, 500);

            $('body').on({
                click: function(event)
                {
                    var match = $(this);
                    var color = match.attr('color');

                    // Check color to change brightness
                    var brightness = hexToLuminance(color);
                    var text_color = '#000';
                    if( brightness < 128 ) {
                        text_color = '#fff';
                    }

                    // Change color according to brightness
                    el.css('color',text_color);
                    el.parent().parent().children('.remove').css('color',text_color);
                    el.parent().parent().children('.resize').css('color',text_color);

                    // Change the background and task name
                    el.parent().parent().css('background-color', color);
                    el.val(match.html());

                    // Update DB


                    // Remove the task_match
                    el.trigger('remove_match');
                }
            },'.match');
        });

        el.bind('remove_match', function(){
            if( el.val == "" ) {
                el.val('Select Task');
            }
            el.css('text-align','center');
            el.parent().children('.match_results').remove();
            clearInterval(timeOutTask);
        });
    },
    keyup: function(event)
    {
        lookUpTask($(this));
    }
},'.task_select');

我想要做的是当用户点击 .task_select 时,我会调出匹配的结果并将其显示在屏幕上。现在,用户可以选择其中一个选项,也可以单击外部。如果在外面,那么匹配的结果应该关闭。如果选择了其中一个选项,则中间的整个代码都会运行。

问题是匹配的结果覆盖在另一个 div 的顶部,如果单击它,则会发生其他事情。当我点击匹配的结果时,代码注册为点击外部(所以匹配的选择消失了,效果就好像我点击了我不想点击的另一个div。

所以我的解决方案是在执行外部点击之前放置一个计时器。一切正常,除了 clearInterval 不清除计时器!所以我第二次加载某些东西时,就好像计时器没有被清除一样!

为什么?!

4

1 回答 1

2

您正在timeOutTask使用新的间隔覆盖。您可以将间隔缓存到数组中,如下所示:

var timeOutTasks = [];
$('body').on({
    ...
    el.bind('blur', function(){
        timeOutTasks.push(setInterval(function(){
            clearInterval(timeOutTasks.pop());
                         ...
        }, 500);
            ...
    }
           ...
}
于 2013-07-09T07:05:13.360 回答