Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么我的代码在Safari或Opera中不起作用?_Javascript_Jquery_Google Chrome_Safari_Opera - Fatal编程技术网

Javascript 为什么我的代码在Safari或Opera中不起作用?

Javascript 为什么我的代码在Safari或Opera中不起作用?,javascript,jquery,google-chrome,safari,opera,Javascript,Jquery,Google Chrome,Safari,Opera,js中有一个函数,用于向表显示消息(消息存储在json中)。在Google Chrome中,它可以工作,但Safari、Opera或Microsoft Edge-不! 与调用setTimeout(callback,5000)相关的代码中有一个错误(没有向回调发送任何内容)。因此,For(var i=0;i由于callback要求将数组作为参数传递,setTimeout必须确保在调用callback时传递数组 改变 setTimeout(回调,5000); 到 setTimeout(函数(){ca

js
中有一个函数,用于向表显示消息(消息存储在
json
中)。在Google Chrome中,它可以工作,但Safari、Opera或Microsoft Edge-不!
与调用
setTimeout(callback,5000)
相关的代码中有一个错误(没有向回调发送任何内容)。因此,
For(var i=0;i由于
callback
要求将数组作为参数传递,
setTimeout
必须确保在调用
callback
时传递数组

改变

setTimeout(回调,5000);

setTimeout(函数(){callback(respond)},5000);

它允许使用参数调用回调函数,作为将由
setTimeout
调用的匿名函数体

另外,作为旁注,如果使用
respond.forEach()
而不是
循环的计数
,则代码会更干净:

   respond.forEach(function(data) {

    if (exists.indexOf(data.id) != -1) continue;

    var timeInMessage = data.time * 1000;
    var diff_time = (timeNow - timeInMessage);

    if (diff_time <= 3600000) {
      var rowClone = $('.mess_hide').clone().removeClass('mess_hide');

      var newDate = new Date(timeInMessage);
      var dateArray = [newDate.getHours(), newDate.getMinutes(), newDate.getSeconds()]
      var res = dateArray.map(function(x) {
        return x < 10 ? "0" + x : x;
      }).join(":");

      $('#messages').append(rowClone);
      $('.time', rowClone).html(res);
      $('.name', rowClone).html(data.user);
      $('.message', rowClone).html(smile(data.message));
      $('.scroller').scrollTop($('#messages').height());

      exists.push(data.id);
    }
  });
respond.forEach(函数(数据){
如果(exists.indexOf(data.id)!=-1)继续;
var timeInMessage=data.time*1000;
var diff_time=(timeNow-timeInMessage);
如果(不同时间)
  • 由于假定
    变量存在
    -array,但数组(
    []
    )的值仅在调用
    $.getJSON(…)
    之后才分配给它。因此,当第一次调用
    回调
    时,值
    []
    没有设置为
    存在
    。我们只需要将
    变量存在
    移到
    回调的第一个调用上方。
  • 当计时器调用
    callback
    时,不会向其传递任何信息。但是计时器需要重新读取文件中的消息并在屏幕上显示它们。因此,取而代之的是
    setTimeout(function(){callback(respond)},5000);
    我们需要
    setTimeout(function(){$.getJSON('data/messages.json',callback);},5000);
  • var exists=[];
    $.getJSON('data/messages.json',回调);
    函数回调(响应){
    var timeNow=Date.now();
    对于(变量i=0;i如果(不同时间我介绍了您的编辑,但是现在代码已经停止显示消息。虽然没有错误),但是
    respond
    的值应该来自哪里?在问题代码的当前状态下,
    setTimeout()
    传递
    respond
    ,但它没有在任何地方定义。(看起来它应该是从一个
    $.getJSON()
    调用中返回的,所以我不确定超时是怎么回事。@尖刻的是,但如果没有出现,又有什么错呢?你能为任何一个不熟练的人解释一下你的答案吗,只要说你添加了一个超时以及为什么。@MartinBarker是的。看看新的答案。