函数在 For 循环问题中
Function in For Loop problems
我有代码从提要加载数据。你可以在这里检查jsfiddle。
<div class="agenda"></div>
<div class="agenda"></div>
<script>
label = ["Tutorials", "Widgets"];
for (m = 0; m < label.length; m++) {
function listEvents(json) {
var feed = json.feed;
for (var i = 0; i < 10; i++) {
var entry = json.feed.entry[i];
var posttitle = entry.title.$t;
//Style
if (i == 0) {
x = "<span style='color:red'>Style 1 + Label 1</span><p>" + posttitle + "</p>";
p = "<span style='color:red'>Style 2 + Label 2</span><h4>" + posttitle + "</h4><p>";
}
if (i == 1) {
y = "<p>" + posttitle + "</p>";
g = "<h4>" + posttitle + "</h4></p>";
}
}
style = [x + y, p + g];
for (m = 0; m < style.length; m++) {
document.getElementsByClassName("agenda")[m].innerHTML = style[m];
}
}
document.write("<script src='"http://www.allbloggertricks.com/feeds/posts/default/-/" + label[m] + "?orderby=published&alt=json-in-script&callback=listEvents'"><'/script>");
}
</script>
我使用For
循环从2 Labels (Tutorials, Widgets)
加载数据。
对于每个标签,我希望它使用每种样式(normal and bold
作为 jsfiddle 中的示例)。但我不知道为什么它只从Label
加载数据.
我需要你的帮助。感谢您的所有建议。
这里有几个问题。
控件结构中的函数声明
函数声明(listEvents
函数的声明)在任何控件结构中都是无效的。它们必须出现在全局范围或函数范围的顶层,而不是在循环、条件等中。一些引擎在这些结构中容忍它们,猜测你的意思,但其他引擎更严格。
另一方面,函数表达式可以出现在任何表达式可以出现的任何位置。(通常最好不要将它们放在循环中。
您可以非常简单地区分函数声明和函数表达式:如果您立即使用构造的值,则它是一个表达式。
函数声明:
function foo() { /* ... */ }
函数表达式:
var f = function() { /* ... */ };
var nf = function foo() { /* ... */ }; // Avoid this on old versions of IE
doSomething(function() { /* ... */ });
重用相同的函数名称
您的代码正在尝试将loadEvents
设置为 JSONP 回调。你不需要有多个loadEvents
副本,你只需要一个 - 并且由于JSONP的工作方式,它必须是一个全局函数。
只需确保loadEvents
中的逻辑处理多次调用,因为每个 JSONP 回调都会被触发。
覆盖m
您正在用函数覆盖m
变量的值。你拥有它的方式是无害的,但它仍然是一个坏主意。
使用document.write
document.write
在现代网页或 Web 应用程序中几乎没有位置。创建一个script
节点并将其附加到 DOM 中。
在 URL 查询字符串中使用原始字符串值
生成脚本标记的代码会将标签的内容追加到查询字符串,而无需正确编码。虽然这适用于您现在在标签数组中的特定值,但如果您更改标签数组值,它将中断。改为使用 encodeURIComponent
对它们进行编码。
这是一个最小的更新:
var m, label, parent; // Declare variables!
label = ["Tutorials", "Widgets"];
parent = document.getElementsByTagName('script')[0].parentNode;
for (m = 0; m < label.length; m++) {
var script = document.createElement('script');
script.src = "http://www.allbloggertricks.com/feeds/posts/default/-/"
+ encodeURIComponent(label[m])
+ "?orderby=published&alt=json-in-script&callback=listEvents";
parent.appendChild(script);
}
function listEvents(json) {
var m;
var feed = json.feed;
for (var i = 0; i < 10; i++) {
var entry = json.feed.entry[i];
var posttitle = entry.title.$t;
//Style
if (i == 0) {
x = "<span style='color:red'>Style 1 + Label 1</span><p>" + posttitle + "</p>";
p = "<span style='color:red'>Style 2 + Label 2</span><h4>" + posttitle + "</h4><p>";
}
if (i == 1) {
y = "<p>" + posttitle + "</p>";
g = "<h4>" + posttitle + "</h4></p>";
}
}
style = [x + y, p + g];
for (m = 0; m < style.length; m++) {
document.getElementsByClassName("agenda")[m].innerHTML = style[m];
}
}
在下面重新发表您的评论:
但它仍然只加载来自一个"标签"的数据。我想要每种样式,它都会加载一个标签。样式 1(普通文本)加载标签 1(教程),样式 2(粗体文本)加载标签 2(小部件)。
这是因为您的加载事件会覆盖议程元素的内容。与其在标记中包含议程元素,不如将它们动态添加到某个容器中。例如:
<div id="agendas"></div>
然后更改此设置:
for (m = 0; m < style.length; m++) {
document.getElementsByClassName("agenda")[m].innerHTML = style[m];
}
对此:
var agendas = document.getElementById("agendas");
for (m = 0; m < style.length; m++) {
var agenda = document.createElement('div');
agenda.className = "agenda"; // If you still need this for anything
agenda.innerHTML = style[m];
agendas.appendChild(agenda);
}
我建议在DOM上做一些阅读,并且可能使用一个好的库来使这些东西更容易 - jQuery,YUI,Closure或其他任何几个。
- setInterval游戏循环的范围问题
- 在循环中附加事件处理程序时出现浏览器性能问题
- 动画、计时和运行循环等问题
- jQuery通过步骤的自排队循环来解决延迟问题
- '对于'循环,替换span标记的问题
- 循环的JavaScript排序问题
- HTML5音频循环出现问题
- 在qualtrics上使用javascript:循环块中的问题id
- 用于异步函数中的循环和定时问题
- Jquery图像循环问题
- I'我在react.js中编写for循环时遇到问题
- JavaScript + mocha:可能是在 for 循环中声明函数的闭包问题
- 循环映像 IE7 问题
- 循环的 JavaScript 性能问题
- 无限循环串联问题
- 循环 += 十进制变量的 javascript 有问题
- JavaScript的循环问题,将值插入数组将不起作用
- …的奇怪问题..循环中
- Ajax / Javascript问题.循环以前的请求
- 问题循环简单的javascript幻灯片与链接