2011-09-08 39 views
17

Tôi đang cố gắng thiết lập tập lệnh để ghép một số biến trong chuỗi nếu chúng tồn tại, để đặt thẻ siêu dữ liệu thích hợp vào tài liệu HTML được hiển thị.Ghép nối chuỗi với câu lệnh if trong JavaScript

đang nối của tôi là:

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

Tôi đang cố gắng để thêm if báo cáo như sau vào nó (giữa mục đầu tiên và thứ hai):

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" 
    } 

Nhưng tôi không thể thêm bất kỳ câu lệnh nào trong số các câu lệnh này trực tiếp vào mã ghép nối (nó ném một lỗi: Unexpected token ().

Làm cách nào tốt nhất để tôi thêm các câu lệnh như các chuỗi này vào chuỗi nối của tôi?

Trả lời

30

Tôi muốn sử dụng một 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

Trong trường hợp ngoại lệ ('var undefined = 'test';') kết quả là sai. Sử dụng 'typeof' là trình tiết kiệm. – scessor

+0

Nếu một trong các biến không được xác định, bạn sẽ nhận được một 'tham chiếu'. Tôi nghĩ rằng đây là những gì OP đã có trong tâm trí. Yours là hoàn toàn tốt nếu tất cả ba metadatas được xác định, tất nhiên. –

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

Xây dựng toàn bộ tài liệu vào một mảng, sau đó tham gia với một "\n" ở cuối. (Lý do cho điều này là tất nhiên không có nhiều đường mới rải rác tất cả về Và nếu bạn đang ở trên IE7 hoặc ít hơn, Array#join là nhanh hơn đáng kể so với nối chuỗi lặp đi lặp lại!).

Mã ở đây: http://jsfiddle.net/ZCbCZ/

CẬP NHẬT Tôi quên bao gồm "ký tự" trong phần đầu tiên. Mã với Paras là ở đây: http://jsfiddle.net/U8325/1/

Đối với những người không có nhu cầu phải click thông qua và thử nó ra, đây là kịch bản:

// 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

tôi có thể làm điều gì đó giống như thêm một chút khác nhau (một chút để khuôn mẫu), chủ yếu là bởi vì tôi ghét HTML nối thực hiện với 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 : ""); 

chắc chắn, có một rất lượng nhỏ trên cao bổ sung, nhưng với tôi, đó là cách dễ đọc hơn.

+0

Làm thế nào bạn sẽ nhận được "ký sinh" ở đây? (Không phải là nó khó, tôi chỉ muốn nhìn thấy những gì bạn muốn đưa ra trong sự vắng mặt của một động cơ tạm thời thực sự.) –

+0

Trừ khi có cái gì đó tôi đang thiếu (nó là muộn 'n tôi đang cần ngủ), tôi rất có thể chỉ cần thêm '# paras #' ở giữa các thẻ 'body' và thay thế nó theo cùng một cách các yếu tố khác được thay thế .. 'join' chỉ trả về một chuỗi, vì vậy tôi giả định rằng nó sẽ hoạt động. –

+0

Ah, hoàn hảo, +1 –

1

Tôi thích khả năng đọc Demian Brecht câu trả lời, nhưng tôi sẽ chỉ thay đổi chuỗi cho một regex thay thế, vì replace() chức năng chỉ thay thế các trận đấu đầu tiên (xem chi tiết ở đây: 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 : ""); 
Các vấn đề liên quan