適切なメタデータタグをレンダリングされたHTMLドキュメントに配置するために、文字列内のいくつかの変数を連結するスクリプトを設定しようとしています存在する場合。
私の連結コードは:
data = "<html>\n<head>\n" + "</head>\n<body>\n\n" + paras.join("\n\n") + "\n\n</body>\n</html>";
次のようなif
ステートメントを(最初と2番目のアイテムの間に)追加しようとしています。
if (typeof metadata_title !== "undefined") {
"<title>" + metadata_title + "</title>\n"
}
if (typeof metadata_author !== "undefined") {
"<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n"
}
if (typeof metadata_date !== "undefined") {
"<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n"
}
しかし、これらのステートメントを連結コードに直接追加することはできません(エラーをスローします:Unexpected token (
)。
このようなステートメントを連結文字列に追加するにはどうすればよいですか?
項演算子 を使用します。
data = "<html>\n"
+ "<head>\n"
+ ( typeof metadata_title !== "undefined" ? "<title>" + metadata_title + "</title>\n" : "" )
+ ( typeof metadata_author !== "undefined" ? "<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n" : "" )
+ ( typeof metadata_date !== "undefined" ? "<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n" : "" )
+ "</head>\n"
+ "<body>\n"
+ "\n"
+ paras.join("\n\n")
+ "\n"
+ "\n"
+ "</body>\n"
+ "</html>"
;
主にJavaScriptで行われる連結されたHTMLが嫌いなため、私は少し違うことをするかもしれません(テンプレートに少し似ています)。
var metadata_title = "Hello";
var metadata_author = "Me";
var metadata_date = "2011-09-07";
var template = "<html>\
<head>\
<title>#title#</title>\
<meta name=\"author\" content=\"#author#\"></meta>\
<meta name=\"date\" content=\"#date#\"></meta>\
</head>\
<body>\
</body>\
</html>";
var data = template.replace("#title#", metadata_title != undefined ? metadata_title : "")
.replace("#author#", metadata_author != undefined ? metadata_author : "")
.replace("#date#", metadata_date != undefined ? metadata_date : "");
確かに、veryの追加のオーバーヘッドが少しありますが、私にとってはwayより読みやすくなっています。
data = "<html>\n<head>\n"
+ (
typeof metadata_title !== "undefined" ?
"<title>" + metadata_title + "</title>\n" :
""
)
+ (
typeof metadata_author !== "undefined" ?
"<meta name=\"author\" content=\"" + metadata_author + "\"></meta>\n" :
""
)
+ (
typeof metadata_date !== "undefined" ?
"<meta name=\"date\" content=\"" + metadata_date + "\"></meta>\n" :
""
)
+ "</head>\n<body>\n\n"
+ paras.join("\n\n")
+ "\n\n</body>\n</html>";
ドキュメント全体を配列に構築してから、"\n"
最後に。 (これの根拠は、もちろん、たくさんの新しい行が点在しないようにすることです!そして、IE7以下であれば、Array#join
は、繰り返される文字列の連結よりもかなり高速です。)
ここにコード: http://jsfiddle.net/ZCbCZ/
[〜#〜] update [〜#〜]最初のフィドルに「パラ」を含めるのを忘れました。 parasを含むコードは次のとおりです: http://jsfiddle.net/U8325/1/
クリックして試してみたいと思わない人のために、スクリプトは次のとおりです。
// Not going to define metadata_author just to be saved by typeof :-)
var metadata_title = "Hello";
var metadata_date = "2011-09-07";
// Okay 3 paras for fun
var paras = ["<p>paragraph1</p>", "<p>paragraph2</p>", "<p>paragraph3</p>"];
data = ["<html>", "<head>"]
if (typeof metadata_title !== "undefined") {
data.Push("<title>" + metadata_title + "</title>");
}
if (typeof metadata_author !== "undefined") {
data.Push("<meta name=\"author\" content=\"" + metadata_author + "\"></meta>");
}
if (typeof metadata_date !== "undefined") {
data.Push("<meta name=\"date\" content=\"" + metadata_date + "\"></meta>");
}
data.Push("</head>");
data.Push("<body>");
paras.forEach(function (p) {data.Push(p);}); // Requires ES5; use a for-loop if you don't have it
data.Push("</body>");
data.Push("<html>");
data = data.join("\n");
alert(data);
私は Demian Brecht 回答の可読性を気に入っていましたが、代わりにregexの文字列のみを変更します。 )関数は最初の一致のみを置き換えます(詳細はこちらをご覧ください: JavaScript .replaceは最初の一致のみを置き換えます )
var metadata_title = "Hello";
var metadata_author = "Me";
var metadata_date = "2011-09-07";
var template = "<html>\
<head>\
<title>#title#</title>\
<meta name=\"author\" content=\"#author#\"></meta>\
<meta name=\"date\" content=\"#date#\"></meta>\
</head>\
<body>\
</body>\
</html>";
var data = template.replace(/#title#/g, metadata_title != undefined ? metadata_title : "")
.replace(/#author#/g, metadata_author != undefined ? metadata_author : "")
.replace(/#date#/g, metadata_date != undefined ? metadata_date : "");