你有没有逃过模板工具包中的单引号来获取必要的javascript处理程序?如果是这样,你怎么做。
[% SET s = "A'B'C" %]
<a href="/abc.html" onclick="popup('[% s | html_entity %]')">ABC</a>
html_entity
显然不起作用,因为它只处理双引号。那你怎么做的?
答案 0 :(得分:8)
我不使用内联事件处理程序 - 出于同样的原因,我拒绝使用css的style
属性。 Jquery只是让html和class="foo"
在外部$('.foo').click( function () {} )
文件中轻松.js
。
但是,为了尽我所能回答这个问题,请查看these docs on Template::Filter
以了解核心问题。
好像你可以做[% s | replace( "'", "\'" ) %]
,以逃避单引号。或者你可以写一个更复杂的消毒javascript解析器,它只允许函数调用,并自己创建Template::Filter
答案 1 :(得分:3)
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/docs/manual/VMethods.html#section_squote
答案 2 :(得分:1)
您可以尝试:popup('[% s | html %]')
。
答案 3 :(得分:1)
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>
答案 4 :(得分:0)
请记住在替换中双重转义斜杠,否则它将被解释为转义撇号。
[% string.replace( "'", "\\'" ) %]