Избегайте одиночных кавычек в шаблонах инструментов - PullRequest
4 голосов
/ 07 июня 2010

Вы когда-нибудь избегаете одинарных кавычек в шаблонах инструментов для необходимых обработчиков javascript? Если да, то как ты это делаешь?

[% SET s = "A'B'C" %]

<a href="/abc.html" onclick="popup('[% s | html_entity %]')">ABC</a>

html_entity, очевидно, не работает, потому что он обрабатывает только двойные кавычки. Так как ты это делаешь?

Ответы [ 5 ]

8 голосов
/ 07 июня 2010

Я не использую встроенные обработчики событий - по той же причине я отказываюсь использовать атрибут style для css. Jquery позволяет легко class="foo" в html и $('.foo').click( function () {} ) во внешнем .js файле.

Но, чтобы приложить все усилия, чтобы ответить на этот вопрос, проверьте эти документы на Template::Filter для тех, которые в ядре.

Кажется, что вы могли бы сделать [% s | replace( "'", "\'" ) %], чтобы избежать одиночных кавычек. Или вы могли бы написать более сложный анализатор javascript, который разрешает только вызовы функций, и создать свой собственный Template :: Filter

3 голосов
/ 25 февраля 2018

2018 обновление для справки:

У TT есть метод для этого, называемый squote для экранирования одинарных кавычек и dquote для двойных кавычек.

[% tim = "Tim O'Reilly" %]
[% tim.squote %]          # Tim O\'Reilly

Опрошенная ссылка будет выглядеть примерно так:

<a href="/abc.html" onclick="popup('[% s.squote %]')">ABC</a>

http://www.template -toolkit.org / документы / ручной / VMethods.html # section_squote

1 голос
/ 20 ноября 2014

Perl не мой самый сильный язык ... Но!

Самый простой способ, который я нашел, это использовать модуль JSON.В модуле с именем JS.pm или чем-то:

use JSON;

sub encode () {
   my $self = shift;
   my $string = shift;

   $json = JSON->new->allow_nonref;

   return $json->encode( $string );
}

Подробнее здесь: http://search.cpan.org/~makamaka/JSON-2.90/lib/JSON.pm

Тогда в вашем шаблоне:

[% use JS; %]

<script>
  var escaped_string = [% JS.encode( some_template_variable ) %];
</script>
1 голос
/ 18 января 2011

Вы можете попробовать: popup('[% s | html %]').

0 голосов
/ 14 июля 2016

Не забудьте удвоить косую черту в замене, иначе она будет интерпретирована как выход из апостроф.

[% string.replace( "'", "\\'" ) %]
...