【问题标题】:can I reset an unbinded function with setTimeout?我可以使用 setTimeout 重置未绑定的函数吗?
【发布时间】:2012-05-30 16:07:03
【问题描述】:

天哪,我经常在这里...无论如何,这是问题所在。我有一个未绑定的功能,我需要它在一定时间后恢复(最好是在视频停止播放时,但现在我只播放一定的秒数)。

我找到了一个人有一个类似于我的here (on the jquery forums) 的问题,当我尝试应用解决方案(第一个响应)时,它没有用。这是我试图做的
$('li', '.thumbs').bind('touchend click', playVideo);


$('li', '.thumbs').bind('touchend click', function() {
        //some code
        playVideo( $(this).index() );
        $("li", ".thumbs").unbind('click');
        setTimeout(function(){
            $('li', '.thumbs').bind('touchend click');
            },5000);
        });

那么,为什么?

**编辑好吧,我得到了绑定以超时返回,但由于某种原因它没有完成函数playVideo。它会停止正在播放的视频,但不会开始新的视频...

【问题讨论】:

  • 你是说settimeout中onclick的绑定不起作用?
  • @jmort253 是的,绑定甚至没有回来

标签: javascript jquery binding bind unbind


【解决方案1】:
$('li', '.thumbs').bind('touchend click', onPlayClick);

function onPlayClick(){
    //some code
    playVideo( $(this).index() );
    $("li", ".thumbs").unbind('click', onPlayClick);
    setTimeout(function(){
        $('li', '.thumbs').bind('click', onPlayClick);
    },5000);
}

此外,如果您使用的是 jQuery 1.7+,则首选 on() / off()。 示例:

$('li', '.thumbs').on('click', onPlayClick);
$('li', '.thumbs').off('click', onPlayClick);

【讨论】:

  • 嗨,ahren,你能举个开/关的简单例子吗?好建议! +1
  • 在这种情况下,开/关几乎是一样的——在语法上。
  • 我确实按照您的建议应用了on()/off(),并且它有效,所以......
  • 一个问题,是否也值得一提的是'on'是委托,这意味着如果Natasha添加更多匹配li.thumbs的元素,他们将自动应用点击事件?这可能是也可能不是她正在寻找的东西,也可能值得澄清一下,以防其他人对这些差异有疑问。祝你好运! :)
  • @Nata2haMayan2 - 我更新了上面的内容,因为函数名称之前会发生冲突。
【解决方案2】:

这应该可行。

$('li', '.thumbs').bind('touchend click', playVideo);    
$('li', '.thumbs').bind('touchend click', function() {
    //some code
    playVideo( $(this).index() );
    setTimeout(function(){
        $('li', '.thumbs').unbind().bind('touchend click',playVideo);
        },5000);
    });

因为,在这种情况下,每次设置超时时,您都必须取消绑定之前的绑定函数,然后再绑定。而且绑定时必须有回调函数。

或者,如果您知道点击的位置,您可以触发 Click 而不是绑定。
例如,如果要单击类拇指。那么

  $('.thumbs').trigger('click');   

【讨论】:

    【解决方案3】:

    在您的 setTimeout 中,您没有将元素绑定到函数。添加你的回调函数,问题就解决了。

    setTimeout(function(){
        $('li', '.thumbs').bind('touchend click', playVideo);  // added callback
    },5000);
    

    请记住,每当您重新绑定一个事件时,您必须明确地传递一个函数以在事件触发时调用,即使您之前已经注册了该事件并对该元素的事件调用了 unbind。

    另外,请记住 setTimeout 和 setInterval 回调函数具有全局范围,这意味着它们在“窗口”级别具有可见性。您需要确保函数 playVideo 是在全局范围内定义的,它对 setTimeout 可见。

    【讨论】:

    • 这可行,但由于某种原因,该功能一旦“重新绑定”就无法正常工作
    • @Nata2haMayan2 - 请看最后一段。 “playVideo”是否在全局范围内定义? ahren 还指出,您可能与函数名称发生冲突或使用了错误的名称。我没有看到足够多的代码来确定,但你一定要检查一下。
    • 故障排除步骤可能是在您知道有效的 setTimeout 绑定事件中绑定某些内容,例如 function natashaWasHere() { alert("yo!"); },然后传递 .bind("click",natashaWasHere);。如果警报没有触发,那么这是一个范围问题,如果它确实触发了,那么可能是播放器出了问题。这可以为您提供故障排除的起点并帮助您缩小问题范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多