优雅干净的方式在JavaScript文件中包含HTML?

And*_*per 23 javascript jquery

我正在构建一个带有几个模态对话窗口的小应用程序.窗口需要一点点HTML.我已经在javascript库中对窗口HTML进行了硬编码,但对此解决方案并不满意.有没有更优雅的方式来做到这一点?似乎JavaScript没有多行字符串/ heredoc语法.

var html = "<div id='email_window'><h2>Email Share</h2><div>";
html = html + "<form action='javascript:emailDone();' method='post'>";
html = html + "<div><label for='to'>To</label><input id='to' type='text'></div>";
html = html + "<div><label for='from'>From</label><input id='from' type='text' value='" + email + "'></div>";
html = html + "<div><label for='subject'>Subject</label><input id='subject' type='text' disabled='disabled' value='" + subject + "'></div>";
html = html + "<div><label for='body'>Body</label><input id='body' type='text' disabled='disabled' value='" + body + "'></div>";
html = html + "<div><input type='submit' value='Send'><input type='button' value='Cancel' onClick='javascript:$.fancybox.close();'></div>";
html = html + "</form></div>";

$("#data").html(html);
Run Code Online (Sandbox Code Playgroud)

添加以澄清原始消息 -

任何解决方案都不能使用Ajax/XHR来提取模板文件,因为javascript库将位于不同的域中,它包含在html文件中,它有点像ShareThis.该库将包含在许多不同的站点上,并附加到div中任何锚标记的onClick事件,其属性为sharetool ="true".

例如:

http://www.bar.com - index.html
<html>
...
<script type="text/javascript" src="http://www.foo.com/sharetool.js"></script>
...
<body>
<div sharetool="true">
</div>
...
</html>
Run Code Online (Sandbox Code Playgroud)

Mic*_*ski 21

您可以将HTML作为常规标记包含在页面的末尾,在不可见的div中.然后你就可以用jQuery引用它了.

然后,您需要以编程方式设置您的变量字段(电子邮件,主题,正文)

<div id='container' style='display: none;'>
  <div id='your-dialog-box-contents'>
    ...
    ...
  </div>
</div>

<script type='text/javascript'>
  $("#from").val(from);
  $("#subject").val(subject);
  $("#body").val(body);
  $("#data").html($("#your-dialog-box-contents"));
</script>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的想法.这不是我对这个项目所需要的.我正在编写的JS库旨在用于许多不同的网站,因此向包含该库的所有页面添加隐藏的div是不切实际的. (2认同)

Ray*_*nos 16

模板.选择你的毒药

将它们内联为脚本块或使用ajax作为外部资源加载它们.

我个人使用EJS作为外部模板文件,只是让EJS加载它们并将它们注入到一个容器中,json数据绑定到模板.

new EJS({ 
    url: "url/to/view"
}).update('html_container_name', {
    "foobar": "Suprise"
});
Run Code Online (Sandbox Code Playgroud)

然后查看文件使用通用视图逻辑.

// url/to/view
<p> <%=foobar %></p>
Run Code Online (Sandbox Code Playgroud)


Koo*_*Inc 8

对于多行字符串(没有框架,只是javascript),有几种解决方案.请参阅我对此SO问题的回答.你可以将它与一些简单的模板结合起来:

String.prototype.template = String.prototype.template ||
        function (){
            var  args = Array.prototype.slice.call(arguments)
                ,str = this
                ,i=0
                ;
            function replacer(a){
                var aa = parseInt(a.substr(1),10)-1;
                return args[aa];
            }
            return  str.replace(/(\$\d+)/gm,replacer)
};
//basic usage:
'some #1'.template('string'); //=> some string
//your 'html' could look like:
var html =
  [ '<form action="javascript:emailDone();" method="post">',
    ' <div><label for="to">To</label>',
    '       <input id="to" type="text"></div>',
    ' <div><label for="from">From</label>',
    '       <input id="from" type="text" ',
    '         value="$0"></div>',
    ' <div><label for="subject">Subject</label>',
    '      <input id="subject" type="text" disabled="disabled" ',
    '        value="$1"></div>',
    ' <div><label for="body">Body</label>',
    '      <input id="body" type="text" disabled="disabled" ',
    '        value="$2"></div>',
    ' <div><input type="submit" value="Send"><input type="button" ',
    '        value="Cancel" ',
    '        onClick="javascript:$.fancybox.close();"></div>',
    '</form>'
  ] .join('').template(email, subject, body);
Run Code Online (Sandbox Code Playgroud)

  • 聪明的主意.感谢您的反馈意见! (2认同)

Dar*_*rov 5

我个人喜欢像这样构建 DOM 树:

$('#data').html(
    $('<div/>', {
        id: 'email_window',
        html: $('<h2/>', {
            html: 'Email Share'
        })
    }).after(
        $('<form/>', {
            action: 'javascript:emailDone();',
            method: 'post',
            html: $('<div/>', {
                html: $('<label/>', {
                    for: 'to',
                    html: 'To'
                }).after($('<input/>', {
                    id: 'to',
                    type: 'text'
                }))
            }).after(
                ... etc
            )
        })
    )
);
Run Code Online (Sandbox Code Playgroud)

  • 从 jQuery 的角度来看确实更好,但从可读性的角度来看却很差。(元数据比很糟糕)。 (2认同)

小智 5

有两种解决方案可以解决您的问题: - javascript中heredoc语法的替代方法是使用以下命令转义换行符\:

var tpl = "hello\
stackoverflow\
World !";
Run Code Online (Sandbox Code Playgroud)

char被转义为被忽略,并且它不会在结果字符串中发生.

您还可以使用模板创建一个普通的html文件,并在js脚本中创建一个隐藏的iframe并加载crossdomain html模板.您现在可以访问iframe和retreive的文档对象body.innerHTML.理论上!我还没有测试过这个解决方案....