如何在 Haml 中包含内联 JavaScript?

Posted

技术标签:

【中文标题】如何在 Haml 中包含内联 JavaScript?【英文标题】:How do I include inline JavaScript in Haml? 【发布时间】:2012-04-02 09:41:10 【问题描述】:

如何编写这样的内容以包含在模板中,但在 Haml 中?

<script>
$(document).ready( function() 
  $('body').addClass( 'test' );
 );
</script>

【问题讨论】:

【参考方案1】:
:javascript
    $(document).ready( function() 
      $('body').addClass( 'test' );
     );

文档:http://haml.info/docs/yardoc/file.REFERENCE.html#javascript-filter

【讨论】:

【参考方案2】:

您实际上可以执行 Chris Chalmers 在他的回答中所做的事情,但您必须确保 HAML 不会解析 JavaScript。当您需要使用与text/javascript 不同的类型时,这种方法实际上很有用,这是我需要为MathJax 做的。

您可以使用plain 过滤器来阻止 HAML 解析脚本并引发非法嵌套错误:

%scripttype: "text/x-mathjax-config"
  :plain
    MathJax.Hub.Config(
      tex2jax: 
        inlineMath: [["$","$"],["\\(","\\)"]]
      
    );

【讨论】:

:plain 过滤器对于修复 javascript 模板问题非常有用。谢谢!我正在使用 fileupload-jquery (blueimp.github.io/jQuery-File-Upload),它在 haml 中包含很多 js 模板,并且只有 :plain 过滤器有效!有关更多详细信息,请阅读我的答案。【参考方案3】:

所以我尝试了上面的 :javascript 有效 :) 但是 HAML 将生成的代码包装在 CDATA 中,如下所示:

<script type="text/javascript">
  //<![CDATA[
    $(document).ready( function() 
       $('body').addClass( 'test' );
     );
  //]]>
</script>

以下 HAML 将生成包含(例如)typekit 或 google 分析代码的典型标记。

 %script:type=>"text/javascript"
  //your code goes here - dont forget the indent!

【讨论】:

Haml 没有为我添加CDATA,如果 js 中有任何不规则的缩进,%script 也没有为我工作。 这不起作用,会在纯文本异常中引发非法嵌套 如果您需要向 【参考方案4】:

我在 haml 中使用 fileupload-jquery。原js如下:

<!-- The template to display files available for download -->
<script id="template-download" type="text/x-tmpl">
  % for (var i=0, file; file=o.files[i]; i++)  %
    <tr class="template-download fade">
      % if (file.error)  %
        <td></td>
        <td class="name"><span>%=file.name%</span></td>
        <td class="size"><span>%=o.formatFileSize(file.size)%</span></td>
        <td class="error" colspan="2"><span class="label label-important">%=locale.fileupload.error%</span> %=locale.fileupload.errors[file.error] || file.error%</td>
        %  else  %
        <td class="preview">% if (file.thumbnail_url)  %
          <a href="%=file.url%" title="%=file.name%" rel="gallery" download="%=file.name%"><img src="%=file.thumbnail_url%"></a>
          %  %</td>
        <td class="name">
          <a href="%=file.url%" title="%=file.name%" rel="%=file.thumbnail_url&&'gallery'%" download="%=file.name%">%=file.name%</a>
        </td>
        <td class="size"><span>%=o.formatFileSize(file.size)%</span></td>
        <td colspan="2"></td>
        %  %
      <td class="delete">
        <button class="btn btn-danger" data-type="%=file.delete_type%" data-url="%=file.delete_url%">
          <i class="icon-trash icon-white"></i>
          <span>%=locale.fileupload.destroy%</span>
        </button>
        <input type="checkbox" name="delete" value="1">
      </td>
    </tr>
    %  %
</script>

一开始我使用:cdata进行转换(来自html2haml),它不能正常工作(删除按钮不能删除回调中的相关组件)。

<script id='template-download' type='text/x-tmpl'>
      <![CDATA[
          % for (var i=0, file; file=o.files[i]; i++)  %
          <tr class="template-download fade">
          % if (file.error)  %
          <td></td>
          <td class="name"><span>%=file.name%</span></td>
          <td class="size"><span>%=o.formatFileSize(file.size)%</span></td>
          <td class="error" colspan="2"><span class="label label-important">%=locale.fileupload.error%</span> %=locale.fileupload.errors[file.error] || file.error%</td>
          %  else  %
          <td class="preview">% if (file.thumbnail_url)  %
          <a href="%=file.url%" title="%=file.name%" rel="gallery" download="%=file.name%"><img src="%=file.thumbnail_url%"></a>
          %  %</td>
          <td class="name">
          <a href="%=file.url%" title="%=file.name%" rel="%=file.thumbnail_url&&'gallery'%" download="%=file.name%">%=file.name%</a>
          </td>
          <td class="size"><span>%=o.formatFileSize(file.size)%</span></td>
          <td colspan="2"></td>
          %  %
          <td class="delete">
          <button class="btn btn-danger" data-type="%=file.delete_type%" data-url="%=file.delete_url%">
          <i class="icon-trash icon-white"></i>
          <span>%=locale.fileupload.destroy%</span>
          </button>
          <input type="checkbox" name="delete" value="1">
          </td>
          </tr>
          %  %
      ]]>
    </script>

所以我使用:plain 过滤器:

%script#template-download:type => "text/x-tmpl"
  :plain
    % for (var i=0, file; file=o.files[i]; i++)  %
    <tr class="template-download fade">
    % if (file.error)  %
    <td></td>
    <td class="name"><span>%=file.name%</span></td>
    <td class="size"><span>%=o.formatFileSize(file.size)%</span></td>
    <td class="error" colspan="2"><span class="label label-important">%=locale.fileupload.error%</span> %=locale.fileupload.errors[file.error] || file.error%</td>
    %  else  %
    <td class="preview">% if (file.thumbnail_url)  %
    <a href="%=file.url%" title="%=file.name%" rel="gallery" download="%=file.name%"><img src="%=file.thumbnail_url%"></a>
    %  %</td>
    <td class="name">
    <a href="%=file.url%" title="%=file.name%" rel="%=file.thumbnail_url&&'gallery'%" download="%=file.name%">%=file.name%</a>
    </td>
    <td class="size"><span>%=o.formatFileSize(file.size)%</span></td>
    <td colspan="2"></td>
    %  %
    <td class="delete">
    <button class="btn btn-danger" data-type="%=file.delete_type%" data-url="%=file.delete_url%">
    <i class="icon-trash icon-white"></i>
    <span>%=locale.fileupload.destroy%</span>
    </button>
    <input type="checkbox" name="delete" value="1">
    </td>
    </tr>
    %  %

转换后的结果和原来的完全一样。

所以:plain 这个场景中的过滤器符合我的需要。

:plain 不解析过滤后的文本。当您不想以 . 开头的行时,这对于没有 HTML 标签的大块文本很有用。或 - 被解析。

更多详情请参考haml.info

【讨论】:

以上是关于如何在 Haml 中包含内联 JavaScript?的主要内容,如果未能解决你的问题,请参考以下文章

在XHTML中包含有效的内联Javascript

Haml:如何在 HAML 中为元素设置内联样式

Django:如何在 list_display 中包含内联模型字段?

如何在 Nuxt 应用程序中包含内联 .svg

是否可以在 shell 脚本中的多行命令中包含内联注释? [复制]

如何在另一个 JavaScript 文件中包含一个 JavaScript 文件?