我发现了一个奇怪的问题。
我正在用我的webapp迈出第一步。长话短说,我有一个很好的小脚本,可以轮询由php控制器发送的另一个脚本。
稍后,我会在两种方式上工作。无论是作为longpolling还是就像现在一样 - 在javascript间隔。
它在Chrome上的运作方式: 在“就绪”事件中,第一个脚本在函数上设置一个间隔,该间隔向控制器发送一个ajax请求(让我们将它命名为'ping.php')。如果ajax成功,msg应该替换div#wrapperForJs的html内容。
Ping.php检查数据库是否有更新,是否符合脚本echo的一个脚本结果。
上面的文字是针对人文主义者的,现在是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 echo:
$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对其进行硬编码或者在迭代的beggining中覆盖$ k var,它也适用于Safari(jQuery找到元素)。
我还使用找到的元素的长度进行console.log测试:
el = $('#project-$k .pTime'); console.log(el.length);
Chrome输出类似于(0,0,0,1,1,1,0)[0未找到,1 - 找到0 Safari总是输出0。
我在这里写作因为不知道这个珍贵的浏览器发生了什么。也许有人在这里有任何解决方案。
请不要试着说服我,间隔对数据更新目的没有好处。我知道,现在,这是我能实现的最好的。
答案 0 :(得分:0)
Safari(它的某些版本)将不会执行注入DOM的javascript代码。您可以使用危险的eval()
或将javascript放在ajax回调中,并根据您从服务器收到的text / json进行修改。
答案 1 :(得分:0)
好的,刚发现我的错误。真是太愚蠢了,我真的非常感到心疼。
就像我之前说的那样,javascript实际上正在执行。但是,我在第二个帐户上测试Safari,与主要帐户相关。
该错误实际上是我的控制器模型权限。我正在测试的工作区由主帐户拥有。 Ping仅为用户拥有的项目发送更新信息。
所以,Safari正在执行js,我的ajax请求没问题(尽管存在性能问题,但这是另一个未来的故事)。 getElementById没有得到任何元素,因为ping没有发送所有信息。
抱歉,你浪费时间,非常感谢你的帮助。