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

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

var html = "

Email Share

"; html = html + "
"; html = html + "
"; html = html + "
"; html = html + "
"; html = html + "
"; html = html + "
"; html = html + "
"; $("#data").html(html);

添加以澄清原始消息 –

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

例如:

 http://www.bar.com - index.html  ...  ...  
...

模板。 选择你的毒药

  • EJS
  • jQuery模板 (nb: 开发停止 )
  • 下划线模板
  • 胡子
  • jResig微模板

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

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

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

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

 // url/to/view 

<%=foobar %>

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

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

   

对于多行字符串(没有框架,只是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 = [ '
', '
', '
', '
', '
', '
', '
', '
', '
', '
', '
' ] .join('').template(email, subject, body);

你的问题有2个解决方案: – javascript中heredoc语法的替代方法是使用\来转义换行符:

 var tpl = "hello\ stackoverflow\ World !"; 

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

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

就个人而言,我喜欢像这样构建DOM树:

 $('#data').html( $('
', { id: 'email_window', html: $('

', { html: 'Email Share' }) }).after( $('
', { action: 'javascript:emailDone();', method: 'post', html: $('
', { html: $('', { for: 'to', html: 'To' }).after($('', { id: 'to', type: 'text' })) }).after( ... etc ) }) ) );

你是对的,JS没有heredocs或多行字符串。 也就是说,通常的方法是将HTML放在HTML中,并在适当的时候显示或隐藏它。 你已经在使用jQuery了,所以你大部分都在那里:

 

然后,您可以填充表单并将其放在正确的位置:

 $('#data').html($('form.email').find('input#from').val(email).end().html()); 

Cook.js

 div([ button({click:[firstEvent, secondEvent]}, 'You can bind (attach) events on the fly.'), p('Here are some popular search engines'), ul([ li([ a('Google', {href:'http://www.google.com'}) ]), li([ a('Bing', {href:'http://www.bing.com'}) ]), li([ a('Yahoo', {href:'http://www.yahoo.com'}) ]) ]) ]); 

这个怎么运作

 Objects = Attribute & Events -> {href:'facebook.com', src:'static/cat.gif', ng-bind:'blah'} String = Text or Html -> 'hello world' Array = Elements -> [a('hello world', {href:'facebook.com'}), img({src:'static/cat.gif'})] 

更多关于cook.js!