setTimeout не работает на Safari Mobile - PullRequest
11 голосов
/ 22 ноября 2011

У меня есть функция, которая показывает меню при нажатии на него, и я хочу, чтобы оно исчезло через 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');
}

Где проблема?

Спасибо

Ответы [ 4 ]

5 голосов
/ 12 июня 2012

У меня только что была такая же проблема. Мой код работает отлично в любом браузере на моем 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);
}

Я не вижу .bind в вашем setTimeout, но для других с такой же проблемой это может быть проблемой. Вот почему я выкладываю: -)

2 голосов
/ 01 декабря 2011

Я переместил ваш пример в jsbin, и он работает на моем iphone 4.

Пожалуйста, проверьте это здесь со своих устройств: http://jsbin.com/asihac/5

Вы можете увидеть код здесь http://jsbin.com/asihac/5/edit

В примере используется jQuery - последняя версия, и я только добавил необходимый класс css.

1 голос
/ 05 августа 2013

это не относится к вашему коду, но общая проблема, связанная с ошибками в долго работающих скриптах на устройствах iOS, заключается в том, что MobileSafari уничтожает поток javascript по истечении 10 секунд. вы должны иметь возможность использовать setTimeout и / или setInterval, чтобы обойти это, или вы можете избежать этого, сделав для него ярлык и запустив его как приложение. см. https://discussions.apple.com/thread/2298038, особенно комментарии Дейна Харриган.

0 голосов
/ 16 сентября 2013

Имейте также в виду, что любая функция setTimeout фактически срабатывает, когда элементы DOM рендерится, если для задержки задано слишком короткое значение. Хотя это может показаться очевидным, его можно легко перепутать с отсутствием какого-либо метода стрельбы. Хороший способ проверки - запустить предупреждение.

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

Затем проверьте, сработает ли ваша функция после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...