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);
}