1

我发现了一个奇怪的问题。

我正在用我的 webapp 迈出彗星的第一步。长话短说,我有一个不错的小脚本,可以轮询由 php 控制器发送的另一个脚本。

后来,我会在这两种方式上工作。无论是 longpolling 还是就像现在一样 - 在 javascript 间隔上。

它是如何在 Chrome 上工作的:在“就绪”事件中,第一个脚本设置一个函数间隔,该函数向控制器发送一个 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);

Chrome 输出类似 (0,0,0,1,1,1,0) [0 not found, 1 - found0 Safari 总是输出 0。

我写在这里是因为不知道那个珍贵的浏览器发生了什么。也许这里有人有任何解决方案。

请不要试图说服我间隔不利于数据更新。我知道,现在它是我能实现的最好的。

4

2 回答 2

0

Safari(它的某些版本)根本不会执行注入 DOM 的 javascript 代码。您可以使用危险的eval()或将 javascript 放在 ajax 回调中,并根据您从服务器收到的文本/json 修改它。

于 2013-03-18T19:42:01.070 回答
0

OK, just found my bug. It was so stupid that I'm really, really feel bad about it.

Like I said before, javascript was actually executing. However, I was testing Safari on the second account, related to the primary one.

The bug was actually with my controller-model permissions. The workspace I was testing is owned by the primary account. Ping is sending the updating information only for the projects which user owns.

So, Safari was executing js well, my ajax request were OK (inspite of the performance issues, but this is another, future story). getElementById wasn't get any elements because ping wasn't sending all the information.

Sorry for you waste of time, and many thanks for your help.

于 2013-03-21T22:53:54.473 回答