2013-03-18 39 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没有发送所有的信息。

对不起,你浪费时间,非常感谢您的帮助。