2013-03-18 40 views
1

我發現了一個奇怪的問題。附加的jQuery腳本無法在Safari(Mac)上工作

我正在與我的webapp第一步彗星。長話短說,我有一個很好的小腳本,用於調查由php控制器發送的另一個腳本。

後來,我會在兩種方式上工作。無論是作爲longpolling還是就像它現在的作品 - 在JavaScript間隔。

它如何在Chrome上運行: 在「ready」事件上,第一個腳本設置了一個函數間隔,它向控制器發送一個ajax請求(我們將其命名爲'ping.php')。如果ajax成功,msg應該替換div#wrapperForJs的html內容。

Ping.php檢查數據庫是否有更新,以及它是否符合腳本回顯的腳本結果。上述

文本是爲人道主義者,現在TL;博士:

jQuery代碼:

function pingThatApp(){ 
$.ajax({ 
     type: 'GET', 
     url: '/ping', 
     success: function(msg){ 
      $('#pingWrapper').html(msg); 
     } 
    }); 
} 
$(document).ready(function(){ 
window['pingLoop'] = setInterval(
    function(){ 
     pingThatApp(); 
    },4000 
    );  
}); 

PHP回聲:

$timeScrpt = '<script>'; 
    foreach ($timers['p'] as $k => $v) { 
     $timeScrpt .= "$('#project-{$k} .pTime').fadeOut().attr('title', 'Time spent already: {$v}').html('{$v_short}').fadeIn();"; 

    } 
    foreach ($timers['t'] as $k => $v){ 
     $timeScrpt .= "$('#timeSpent-task-{$k} b').fadeOut().html('{$v}').fadeIn();"; 
    } 
    $timeScrpt .= '</script>'; 

一切都在Chrome的偉大工程。不過,Safari在該腳本中存在一些問題。這個問題看起來像Safari無法找到jQuery對象。

我做了一些console.log測試,檢查了代碼 - 輸出看起來不錯。

如果我改變$ k var和硬編碼它有一些int或覆蓋迭代開始時的$ k var,它也適用於Safari(jQuery找到該元素)。

我也使與發現元素的長度的的console.log測試:

el = $('#project-$k .pTime'); console.log(el.length); 

鉻輸出類似的信息(0,0,0,1,1,1,0)[0沒有找到,1 - found0 Safari始終輸出0。

我在這裏寫作是因爲不知道這個寶貴的瀏覽器正在發生什麼。也許這裏有人有任何解決方案。

請注意,不要試圖說服我間隔對數據更新目的不利。我知道,現在最好的是我能實現的最好的。

+0

「請,不要試圖說服我,間隔不適合數據更新的目的。」 * facepalm *你的輪詢將永遠不會使用'setInterval()'正確工作。這不是一個建議,它只是實現它的正確方法。 – 2013-03-18 19:38:36

+0

就像我之前說的。我不會討論這個問題。它適用於Chrome,Firefox,Opera Mobile。它在Safari上不正確。 – sznowicki 2013-03-18 19:42:19

回答

0

Safari(它的某些版本)將不會執行注入DOM的JavaScript代碼。您可以使用危險的eval()或將JavaScript放入ajax回調中,並根據從服務器收到的文本/ json修改它。

+1

但它實際上正在執行。 console.log()工作,alert()工作,一切工作在jQuery元素函數旁邊。 – sznowicki 2013-03-18 19:43:24

0

好吧,剛剛發現我的錯誤。這真是太蠢了,我真的很難過。

就像我之前說的,JavaScript實際上正在執行。但是,我在第二個帳戶上測試了Safari,與主要帳戶相關。

該錯誤實際上是與我的控制器模型權限。我正在測試的工作區由主帳戶擁有。 Ping只爲用戶擁有的項目發送更新信息。因此,Safari執行得很好,我的阿賈克斯請求沒問題(儘管性能問題,但這是另一個,未來的故事)。 getElementById沒有得到任何元素,因爲ping沒有發送所有的信息。

對不起,你浪費時間,非常感謝您的幫助。