Jak dołączyć wbudowany JavaScript w Haml?

122

Jak mogę napisać coś takiego do szablonu, ale w Haml?

<script>
$(document).ready( function() {
  $('body').addClass( 'test' );
} );
</script>
Fuego DeBassi
źródło

Odpowiedzi:

26

W rzeczywistości możesz zrobić to, co Chris Chalmers robi w swojej odpowiedzi, ale musisz upewnić się, że HAML nie analizuje JavaScript. To podejście jest rzeczywiście przydatne, gdy musisz użyć innego typu niż text/javascript, dla którego musiałem to zrobić MathJax.

Możesz użyć plainfiltru, aby powstrzymać HAML przed analizowaniem skryptu i zgłaszaniem niedozwolonego błędu zagnieżdżania:

%script{type: "text/x-mathjax-config"}
  :plain
    MathJax.Hub.Config({
      tex2jax: {
        inlineMath: [["$","$"],["\\(","\\)"]]
      }
    });
Alexander van Oostenrijk
źródło
Filtr: plain jest bardzo przydatny do rozwiązania problemu z szablonem javascript. Dzięki! Używam fileupload-jquery ( blueimp.github.io/jQuery-File-Upload ), który w dużej mierze zawiera szablon js w haml i tylko: działa zwykły filtr! aby uzyskać więcej informacji, przeczytaj moją odpowiedź.
karl li
19

Wypróbowałem więc powyższe: javascript, który działa :) Jednak HAML zawija wygenerowany kod w CDATA w następujący sposób:

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

Poniższy kod HAML wygeneruje typowy tag zawierający (na przykład) typekit lub kod Google Analytics.

 %script{:type=>"text/javascript"}
  //your code goes here - dont forget the indent!
Chris Chalmers
źródło
Haml nie dodawał CDATAza mnie ani nie %scriptdziałał dla mnie, jeśli w js były jakieś nieregularne wcięcia.
agmin,
To nie działa, rzuca nielegalne zagnieżdżanie z wyjątkiem zwykłego tekstu
Marco Prins
Działa lepiej, jeśli musisz dodać atrybuty do tagu <script>, np. id (który jest w oryginalnym pytaniu). Używam haml 4.0.7 –– można wyłączyć opakowanie cdata w opcjach haml (--cdata) nie, to ma duże znaczenie (myślę).
Maciek Rek
2

Używam fileupload-jquery w haml. Oryginalny plik js znajduje się poniżej:

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

Na początku użyłem :cdatado konwersji (z html2haml ), nie działa poprawnie (przycisk Usuń nie może usunąć odpowiedniego komponentu w wywołaniu zwrotnym).

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

Więc używam :plainfiltra:

%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>
    {% } %}

Przekonwertowany wynik jest dokładnie taki sam jak oryginał.

Więc :plainfiltr w tym senario pasuje do moich potrzeb.

: plain Nie analizuje filtrowanego tekstu. Jest to przydatne w przypadku dużych bloków tekstu bez tagów HTML, gdy nie chcesz, aby wiersze zaczynały się od. lub - do przeanalizowania.

Więcej szczegółów można znaleźć na haml.info

karl li
źródło