2011-09-08 19 views
17

我试图设置一个脚本来连接字符串中的某些变量,如果它们存在,以便将适当的元数据标记放置到呈现的HTML文档中。使用JavaScript中的if语句连接字符串

我的级联码是:

data = "<html>\n<head>\n" + "</head>\n<body>\n\n" + paras.join("\n\n") + "\n\n</body>\n</html>"; 

我想补充if之类的语句下面进去(第一和第二项之间):

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 ()。

如何最好的将这些语句添加到我的串联字符串中?

回答

30

我会使用一个ternary operator

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>" 
; 
+1

在这种情况下,

+3

在特殊情况下('var undefined ='test';'),结果是错误的。使用'typeof'是节省的。 – scessor

+0

如果其中一个变量没有被定义,你会得到一个'ReferenceError'。我认为这是OP的想法。当然,如果所有三个元数据都被定义,那么你的完全没问题。 –

5
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>"; 
1

树立整个文件到一个数组,然后用"\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); 
5

我可以做的东西有点不同(多一点类似于模板),主要是因为我讨厌级联HTML使用JavaScript来完成:

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 : ""); 

当然,还有额外的开销非常量小,但对我来说,这是方式更具可读性。

+0

你会如何得到这里的“paras”? (并不是说这很难,我只想看看在没有真正诱人的引擎的情况下你会想出什么,干杯。) –

+0

除非我缺少某些东西(它晚了,我需要睡眠),我很可能只需在'body'标记之间添加'#paras #'并将其替换为其他元素被替换..'join'只是返回一个字符串,所以我假设它会起作用。 –

+0

啊,完美,+1 –

1

我喜欢Demian Brecht答案的可读性,但我只会改变了正则表达式不是字符串,因为替换()函数只是取代了第一场比赛(详见这里:JavaScript .replace only replaces first Match

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 : "");