【问题标题】:jQuery settimeout not working with anonymous functionjQuery settimeout 不适用于匿名函数
【发布时间】:2012-09-03 16:37:29
【问题描述】:

我有这个设置来为我的每个 DIV 添加一个 mouseenter 事件:

  $(document).ready(function () {
  $('div[id^=domainEnter]').mouseenter(function () {


                toggleSearchDisplay($(this).attr('domaincount'), 'show');

            });
 });

然后我定义了这个函数:

  function toggleSearchDisplay(num, showhide) {

            if ($('div[id=domainDiv' + num + ']').css('display') == "block" || showhide == "hide") {
                $('div[id=domainDiv' + num + ']').hide('fast');
                $('a[id = domainLink' + num + ']').text('+');
                $('input[id ^= SearchControls_' + num + '__SearchControlVisible]').val('false');
            } else {

                $('div[id=domainDiv' + num + ']').show('fast');
                $('a[id = domainLink' + num + ']').text('-');
                $('input[id ^= SearchControls_' + num + '__SearchControlVisible]').val('true');


            }
        }

这一切都很好,可以满足我的需要,但现在 我正在尝试在第一个块中的 MouseEnter 位上设置超时/延迟... 我试过了,它永远不会执行:

$('div[id^=domainEnter]').mouseenter(setTimeout(function () {

                toggleSearchDisplay($(this).attr('domaincount'), 'show');

            },1000));

然后我尝试了这个,它执行了,但是没有延迟......它运行正常:

 $('div[id^=domainEnter]').mouseenter(function () {

            setTimeout(toggleSearchDisplay($(this).attr('domaincount'), 'show'),1000);

        });

我不知道该怎么办...有什么想法吗?

【问题讨论】:

    标签: jquery scope settimeout anonymous-function


    【解决方案1】:

    在您的第一次尝试中,您没有将函数作为参数提供给mouseenter,而是setTimeout 的结果,即计时器。

    在第二个中,当执行提供给setTimeout 的回调时,this 是窗口。

    这是一种解决方法:

    $('div[id^=domainEnter]').mouseenter(function(){
         var $this = $(this);
         setTimeout(function () {
            toggleSearchDisplay($this.attr('domaincount'), 'show');
         },1000)
    });
    

    【讨论】:

    • 另外,它不是闭包,而是对函数的直接调用。
    • 我发现在 vanilla JS 中,setTimeout() 和 setInterval() 对匿名函数不起作用(至少在我的浏览器上)。您必须为这些调用提供命名函数。我不知道 JQuery 是否有内置的解决方法,但值得检查。
    • @DavidEdwards 我可以向您保证 setTimeout 和 setInterval 确实可以与匿名函数一起使用。他们总是这样做。
    • 你能举个例子让我试试吗?只有你这样做了,并且你的例子有效,我可能会发现一些关于 Chrome 处理 setTimeout() 等的有趣的东西......
    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多