setTimeout не работает на Safari Mobile
У меня есть функция, которая показывает меню при нажатии на него, и я хочу, чтобы оно исчезло через 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 ответа
У меня просто была такая же проблема. Мой код отлично работает в любом браузере на моем 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, но для других с такой же проблемой это может быть проблемой. Вот почему я выкладываю:-)
Это не относится к вашему коду, но распространенная проблема с сбоями долгоиграющих сценариев на устройствах iOS состоит в том, что MobileSafari уничтожает поток javascript по истечении 10 секунд. вы должны быть в состоянии использовать setTimeout и / или setInterval, чтобы обойти это, или вы можете избежать этого, сделав ярлык к нему и тем самым запустив его как приложение. см. https://discussions.apple.com/thread/2298038, особенно комментарии Дейна Харриган.
Я переместил ваш пример на jsbin, и он работает на моем iphone 4.
Пожалуйста, проверьте это здесь с ваших устройств: http://jsbin.com/asihac/5
Вы можете увидеть код здесь http://jsbin.com/asihac/5/edit
В примере используется jQuery - последний, и я только добавил необходимый класс CSS.
Имейте также в виду, что любая функция setTimeout фактически срабатывает, когда элементы DOM рендерится, если для задержки задано слишком короткое значение. Хотя это может показаться очевидным, его можно легко перепутать с отсутствием какого-либо метода стрельбы. Хороший способ проверить это запустить предупреждение.
window.onLoad(alert("hey!"));
Затем проверьте, сработает ли ваша функция после.