【问题标题】:Getting setTimeout to work让 setTimeout 工作
【发布时间】:2013-05-15 21:12:11
【问题描述】:

我有以下使用 Jquery UI 拖放的代码。当项目被拖放到该区域时,拖放区变为公司徽标,然后我想要延迟并重定向到拖放链接中的 URL。

我可以更改徽标或重定向 url,但不能同时设置两者,当我同时设置时,延迟不会发生,并且重定向会开始。我认为我在 setTimeout 上做错了什么。

代码如下:

// let the trash be droppable, accepting the gallery items
$( "#droparea" ).droppable({
  accept: "ul.gallery > li a",
  activeClass: "ui-state-highlight",
  drop: function( event, ui ) {

      var thelink = $(ui.draggable).attr("href");
      $('#droparea').prepend('<img id="theImg" src="../img/logo_navigation.jpg" />');

      setTimeout(redirectLink(url),5000);
  }
});

// URL REDIRECT FUNCTION
function redirectLink(url)
{
   window.location.replace(url);
}

【问题讨论】:

    标签: javascript jquery jquery-ui jquery-draggable jquery-droppable


    【解决方案1】:

    说明

    您需要将函数引用(或 JavaScript 代码字符串)传递给 setTimeout,以便在达到超时时执行它。

    在您的代码中,您立即调用了该函数(无论如何return 没有任何内容,因此它的返回值为undefined...所以当超时时间为到达)。

    方法 1

    使用运行您的代码的匿名函数:

    setTimeout(function () {
        redirectLink(url);
    }, 5000);
    
    function redirectLink(url) {
       window.location.replace(url);
    }
    

    方法2

    使您的redirectLink 函数返回 一个函数并像原来那样调用它:

    setTimeout(redirectLink(url), 5000);
    
    function redirectLink(url) {
        return function () {
            window.location.replace(url);
        };
    }
    

    方法 3

    你可以使用.bind():

    setTimeout(redirectLink.bind(null, url), 5000);
    
    function redirectLink(url) {
       window.location.replace(url);
    }
    

    请注意,.bind() 对于某些旧版浏览器需要 polyfill。


    参考资料:

    【讨论】:

    • @pXL 你没有像我一样返回函数。看:jsfiddle.net/pQGKv/2
    • @bfavaretto 我认为他们试图证明我的第二个示例不起作用,但他们没有正确实施
    • 啊……谢谢。
    • @pXL 不,不应该。 setTimeout 不是这样工作的。我已经指出了 - 第一个参数必须是一个字符串(要执行的 JavaScript)或一个函数 reference
    • @pXL 酷,很高兴你现在明白了 :)
    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多