2012-11-30 78 views
1

我有以下鏈接:iPhone不一致執行JavaScript

<a href='external-url' class='track' data-type='event' data-category='category'> 
    Link 
</a> 

當用戶點擊該鏈接時,執行以下功能:

$('a.track').on('click', function(e){ 
    e.preventDefault(); 

    var type  = $(this).data("type"); 
    var category = $(this).data("category"); 

    track(type, category); 
    window.location = $(this).attr("href"); 
}); 

的跟蹤功能的職位通過AJAX並將其存儲在數據在數據庫中。在桌面瀏覽器上,這是完全可行的。在Android上,這也是完全可行的。

在iPhone上,我看到它而不是工作約10次(鏈接帶我到外部網站,而不添加到數據庫),然後它會奇蹟般地開始工作大約10次!任何人都可以確定問題可能是什麼,無論是在我的代碼中,還是可能與我忽略的iOS相關的東西?

+0

'track()'做什麼?除了該功能外,沒有任何可疑的代碼。 「track()」,無論如何,AJAX調用服務器? – Joseph

+0

是的,確切地說:「跟蹤功能通過ajax發佈數據並將其存儲在數據庫中。」這會在iOS上發揮不同的作用嗎? – Chords

回答

3

這可能是track()是異步操作。

在其他瀏覽器中,可能只是速度夠快(而且你很幸運),它完成了window.location執行之前的所有任務。但是,這種行爲很奇怪。

但是,在iPhone上,track()可能執行得太慢,執行window.location已經取消操作,因爲該頁正在退出到另一頁。這是異步操作的正確行爲。它在所有瀏覽器上的表現也一樣。

而不是此順序代碼,請嘗試使用回調。你傳遞一個函數,一旦軌道完成它的工作就執行:

function track(type,category,callback){ 
    //track operations up here and your ajax setup 
    //execute callback when ajax operation replies 
    if(ajaxStatus === 200){ 
     callback(); 
    } 
} 

//using track, we pass in parameters and the callback 
//which when executed, runs the code inside it 
track(type,category,function(){ 
    window.location = ...; 
}); 
+0

使用回調絕對是正確的方法。它完全避免了希望事件發生的具體方式。 – Kitsune

1

您有一個競賽條件。你必須希望這個請求能夠實現。

當頁面退出時,它會殺死打開的請求。我很驚訝它會在桌面瀏覽器上工作,他們應該有同樣的問題。把它放在一個很慢的服務器上,我打賭他們不會做到這一點。

在過去很容易使它與while循環一起工作,但chrome/firefox殺死了它。

如果是外部網站,請將其打開到新窗口。保持您的網站開放。