setTimeout不适用于safari mobile

我有一个function,当点击它时显示一个菜单,我希望它在5秒后消失。 这是我的javascript – 它可以在桌面浏览器上正常运行,但它不会在移动设备上消失。

$(function() { $('#prod_btn').click(function() { $(this).addClass('selected').next('ul').css('display', 'block'); setTimeout(hideMenu, 5000); }); }); function hideMenu() { $('#prod_btn').removeClass('selected').next('ul').css('display', 'none'); } 

问题出在哪儿?

谢谢

我刚遇到同样的问题。 我的代码在我的Mac上的任何浏览器中都运行良好,但在iOs设备上它不起作用。

我在我的超时function上使用“.bind(this)”,这就是导致问题的原因。 当我在我的脚本中使用“.bind”扩展函数对象时,它就像一个魅力。

我的代码是这样的:

 searchTimeout = setTimeout(function() { ... }.bind(this),250); 

为了在iOs设备上工作,我(如上所述)刚添加了这个:

 Function.prototype.bind = function(parent) { var f = this; var args = []; for (var a = 1; a < arguments.length; a++) { args[args.length] = arguments[a]; } var temp = function() { return f.apply(parent, args); } return(temp); } 

我没有在你的setTimeout上看到任何.bind,但对于有同样问题的其他人,这可能就是问题所在。 这就是我发帖的原因:-)

我把你的例子移到了一个jsbin,它正在我的iphone 4上工作。

请从您的设备上测试一下: http : //jsbin.com/asihac/5

你可以在这里看到代码http://jsbin.com/asihac/5/edit

这个例子是使用jQuery – 最新的,我只添加了所需的css类。

这不适用于您的代码,但iOS设备上长时间运行的脚本失败的常见问题是MobileSafari在10秒后杀死了一个javascript线程。 你应该可以使用setTimeout和/或setInterval来解决这个问题,或者你可以通过创建它的快捷方式来避免它,从而将其作为应用程序运行。 请参阅https://discussions.apple.com/thread/2298038 ,特别是Dane Harrigan的评论。

还要记住,如果将延迟设置为太短的值,那么任何setTimeout函数实际上都可能在DOM元素呈现时触发。 虽然这看起来很明显,但很容易将其与任何无法触发的方法相混淆。 测试的一个好方法是运行警报提示。

 window.onLoad(alert("hey!")); 

然后检查你的function是否会触发。