【问题标题】:setTimeout not working on safari mobilesetTimeout 在 Safari 移动设备上不起作用
【发布时间】:2011-11-22 16:42:06
【问题描述】:

我有一个功能,点击它时会显示一个菜单,我希望它在 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');
}

问题出在哪里?

谢谢

【问题讨论】:

  • 当我在 hideMenu() 函数中放置一个 alert() 时,我在 safari mobile 中触发了超时。它对你有用吗?
  • 我试过了,但没有显示任何东西,似乎它没有触发该功能......
  • 您使用的是什么版本的 jquery、safari 等?它适用于模拟器上的 jquery 1.6.4 和 iOS 4.3。你有错误吗?
  • 我在 iPhone 4 和 iPad 2 和 iOS 5 上试过,在 iPhone 3GS 和 4.3 上试过,但还是不行,我用的是 jquery 1.6.2
  • 我没有错误,只是什么都不做,警报消息也没有......

标签: javascript jquery mobile-safari settimeout


【解决方案1】:

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

我在超时功能上使用了“.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,但对于其他有同样问题的人来说,这可能是问题所在。这就是我发帖的原因:-)

【讨论】:

  • 这是一个大问题。我刚刚尝试调试 20k 行,试图弄清楚为什么它在 iOS 6 而不是 iOS 5 中工作。谢谢!!!
  • 使用你的第一个例子。这适用于 iOS 9.2!谢谢!
【解决方案2】:

我将您的示例移至 jsbin,它在我的 iphone 4 上运行。

请在您的设备上进行测试:http://jsbin.com/asihac/5

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

该示例使用 jQuery - 最新,我只添加了所需的 css 类。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      然后检查你的函数是否在之后触发。

      【讨论】:

        猜你喜欢
        • 2015-04-28
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        • 2022-01-12
        • 2014-04-22
        • 1970-01-01
        • 2017-07-27
        • 1970-01-01
        相关资源
        最近更新 更多