Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.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 跟踪输出了哪些JSON对象_Javascript_Jquery_Json - Fatal编程技术网

Javascript 跟踪输出了哪些JSON对象

Javascript 跟踪输出了哪些JSON对象,javascript,jquery,json,Javascript,Jquery,Json,我在加载页面时,通过将索引设置为randomNumber()来随机输出20个左右的JSON对象 我正在逐个刷新已经在一个时间间隔内输出的每个JSON对象。 为了跟踪输出了哪些JSON项,我将通过arrUsed.push[index]将每个项的索引存储到一个数组中 现在,我正在尝试编写一个函数,分别对每个JSON对象执行update()操作,目前我一直在研究如何使用尚未输出的新JSON对象(推送到arrUsed[])中的信息更新每个div 以下是迄今为止我所拥有的功能: function relo

我在加载页面时,通过将索引设置为
randomNumber()
来随机输出20个左右的JSON对象

我正在逐个刷新已经在一个时间间隔内输出的每个JSON对象。 为了跟踪输出了哪些JSON项,我将通过
arrUsed.push[index]
将每个项的索引存储到一个数组中

现在,我正在尝试编写一个函数,分别对每个JSON对象执行
update()
操作,目前我一直在研究如何使用尚未输出的新JSON对象(推送到
arrUsed[]
)中的信息更新每个div

以下是迄今为止我所拥有的功能:

function reloadItems() {
    var itemTotal = $('div.item').length; // Total number of items loaded initially
    var randomNumber=Math.floor(Math.random()*301) //returns number 
    index = randomNumber; // Sets index to be used in JSON data to random number
}
全局声明包含已输出索引的数组:
arrUsed=[]
页面加载存储到数组中时最初输出的每个项,以便覆盖该部分。选择一个随机JSON对象,检查以确保它不在数组中/尚未输出,然后更新页面上的div

以下是将我引向这一点的方法

使用
$.inArray()


如果元素不在数组中,它将返回
-1
,因此您将知道
indexInQuestion
是否已添加到
arrrused

以下是一个JSON/AJAX Ticker的工作示例:

根据twhyler的规范,它每4.5秒随机交换一个项目,跟踪已经看到的项目。一旦他们都被看到,一切又重新开始:

代码文件:

  • (主程序)
  • (产品模板)
  • (JSON数据)
  • (jQuery)
  • (样式表)
首先,我们应该将template.html存储在全局
template
变量中,并启动
getJson()
函数:

template = '';
....
$(document).ready(function () {
    $.get('template.html', function(html) { template = html; getJson(); });
});
data = ''; // JSON data will be stored here
myurl = 'UK.top.20.html';
....
function getJson() { 
$.getJSON(myurl, function (JSON) { data = JSON; initialize(); });
}
然后,我们将JSON存储到
数据
变量中,并启动
initialize()
函数:

template = '';
....
$(document).ready(function () {
    $.get('template.html', function(html) { template = html; getJson(); });
});
data = ''; // JSON data will be stored here
myurl = 'UK.top.20.html';
....
function getJson() { 
$.getJSON(myurl, function (JSON) { data = JSON; initialize(); });
}
在这里,我们将调用
load()
函数3次,以立即用数据填充我们的3个产品分区。然后我们将
i
设置回
2
(这样它将首先更改第三个DIV),并计划
tick()
在4.5秒内启动:

tick_time = 4500;
....
function initialize() { // Start with the first 3
for (i = 1; i < 4; i++) { load(); }
i = 2;
setTimeout('tick()', tick_time);
}
此函数的工作原理类似于C#中的
String.Format(formatstring,arg1,arg2,arg3…
)或PHP中的
sprintf($formatstring,arg1,arg2,arg3…
)。下面是一个例子:

formatstring = 'Roses are {0}, Violets are {1}, String.Format {2} and so do {3}!';
result = formatstring.f('red', 'blue', 'rocks', 'you');
alert(result);
正如您所看到的,这个
String.prototype.f
函数非常方便

load()
函数要做的第一件事是设置
rid=randomId()。让我们看看下面的代码>随机变量()/<代码>函数。它所做的第一件事是从1-20中获取一个数字(基于JSON数据的长度)。然后,它检查我们的
seen
数组是否与JSON数据大小相同,如果是,则将其设置回0。接下来,它确保最近没有看到我们的
rid
,如果看到了,函数将递归地再次调用自己,直到获得唯一的随机id。否则,我们将
rid
存储在
seed
数组中并返回值

function randomId() {
rid = Math.floor(Math.random() * data.results.length);
if (seen.length == data.results.length) { seen.length = 0; }
if ($.inArray(rid, seen) == -1) {
    seen.push(rid);
    return rid;
} else { return randomId(); }
}
接下来,在我们的
load()
函数中,在获得该随机ID之后,我们将
平台
设置为方便的快捷方式
plat_html
是平台元素的临时存储位置。for循环查看JSON中的所有平台数据,并使用String.Format函数填充plat_html字符串

最后,我们允许i的当前值(它是全局的)确定哪个
#product
得到更新,并且
template.f
用JSON数据填充我们的模板,这是通过
.fadeIn()
平滑的jQuery动画完成的


就这样

为什么不把所有的内容都放在DOM中,隐藏除20以外的所有内容,然后在计时器中显示其他内容呢?嗯,我根本没有想到这个选项。因为我有大约300个json对象要启动,它将变成大约600个,所以我会假设输出300-600个隐藏的div,然后根据需要显示它们,这是一个糟糕的实践/性能问题。。。我理解你在引用什么吗?仅供参考-没有所谓的
JSON对象
。JSON是一种字符串数据格式。谢谢,当我说object时,我指的是每个单独的JSON数据,所以我想JSON数组索引应该是合适的术语?想回答我在上面的评论中问你的问题吗?试试这个版本哇。。。非常感谢你。这是我见过的最详细的答案之一。将需要一些时间来查看所有内容并将其应用到我的应用程序中,但它看起来非常完美。谢谢太好了-我希望这会有帮助=P这是一个有趣的项目。让我知道结果如何!我对如何重写randomId函数有一些想法。现在的情况是,当用户的电脑上有数百件物品时,可能会有轻微的负担。基本上,它应该被重新写入,以保留另一个不可见项数组(如队列)。
function load() {
rid = randomId();
item = data.results[rid];
plat = item.Platform;
plat_html = '';
for (var j = 0; j < plat.length; j++) {
    plat_html += plat_fmt.f(
        plat[j].Hardware, 
        plat[j].Market
    );
}
$('#product_' + i).html(
    template.f(
        item.Image, 
        item.id, 
        item.AgeRating,
        item.WikiUrl,
        item.Title,
        item.Source,
        item.Genre,
        plat_html
    )
).fadeIn();
}
function tick() {
i++; if (i == 4) { i = 1; }
$('#product_' + i).fadeOut(function() { load(); });
setTimeout('tick()', tick_time);
}