2011-11-22 150 views
9

我有一個功能,當點擊它時顯示一個菜單,並且我希望它在5秒後消失。這是我的javascript - 它可以在桌面瀏覽器上正常工作,但不會在移動設備上消失。setTimeout無法在safari mobile上工作

$(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'); 
} 

問題在哪裏?

感謝

+1

當我在hideMenu()函數中添加alert()時,超時時間會在safari mobile中觸發。它對你有用嗎? –

+0

我試過但它沒有顯示任何東西,它似乎不會觸發該功能... – pugia

+1

你使用jQuery,safari等的哪些版本?它適用於模擬器上的jquery 1.6.4和iOS 4.3。你有錯誤嗎? –

回答

5

我剛剛遇到同樣的問題。我的代碼在我的Mac上的任何瀏覽器上運行良好,但在iOs設備上無法運行。

我用「.bind(本)」我的超時功能,這是什麼原因造成的問題,對我來說。 當我在腳本中用「.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上,但對於其他同樣的問題,這可能是問題。這就是爲什麼我發佈:-)

+1

我只是想知道.bind如何連接到這個問題。 – Andy

+1

這是一個主要問題。我剛剛嘗試調試20k線路,試圖找出它爲什麼在iOS 6而不是iOS 5中工作。謝謝! – Garrett

+0

使用你的第一個例子。這適用於iOS 9.2!謝謝! – GisMofx

1

這不適用於您的代碼,但在iOS設備上長時間運行的腳本失敗的一個常見問題是MobileSafari在10秒鐘後終止JavaScript線程。你應該能夠使用setTimeout和/或setInterval來解決這個問題,或者你可以通過做一個快捷方式來避免它,從而作爲一個應用程序來運行它。見https://discussions.apple.com/thread/2298038,特別是Dane Harrigan的評論。

0

請記住,任何setTimeout函數實際上可能在DOM元素渲染時觸發,如果延遲設置爲太短的值。雖然這看起來很明顯,但它可能很容易與任何方法解僱混淆。測試的一個好方法是運行警報提示。

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

然後檢查您的功能是否在觸發後觸發。