ここにはいくつかの問題があります。
制御構造内の関数宣言
関数宣言(関数のためにそこにあるものlistEvents
) は、制御構造内では無効です。それらは、ループ内や条件分岐内などではなく、グローバル スコープまたは関数スコープのトップレベルで出現する必要があります。一部のエンジンは、これらの構造内でそれらを許容し、意味を推測しますが、他のエンジンはより厳密です。
一方、関数式は、任意の式を使用できる場所ならどこにでも使用できます。(通常は、それらをループに入れないことが最善です。)
関数宣言と関数式の違いは非常に簡単にわかります。構文の値をすぐに使用している場合、それは式です。
関数宣言:
function foo() { /* ... */ }
関数式:
var f = function() { /* ... */ };
var nf = function foo() { /* ... */ }; // Avoid this on old versions of IE
doSomething(function() { /* ... */ });
同じ関数名の再利用
loadEvents
コードはJSONP コールバックとして設定しようとしています。のコピーを複数持つ必要はありません。必要なのloadEvents
は 1 つだけです。また、JSONP の動作方法により、これはグローバル関数である必要があります。
JSONP コールバックがトリガーされるたびに、ハンドル内のロジックがloadEvents
複数回呼び出されるようにしてください。
上書きm
m
関数で変数の値を上書きしています。あなたのやり方は無害ですが、それでも悪い考えです。
使用するdocument.write
document.write
最新の Web ページや 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 つの「ラベル」からのみデータをロードします。各スタイルで、ラベルをロードします。Style1(通常のテキスト) load Label1(Tutorial), style2(ボールドテキスト) load Label2(Widgets).
これは、loadEvents がアジェンダ要素のコンテンツを上書きするためです。アジェンダ要素をマークアップに含めるよりも、コンテナに動的に追加したほうがよいでしょう。例えば:
<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、または他のいくつかのいずれかです。