您是否曾经在模板工具包中为必要的 javascript 处理程序转义单引号?如果是这样,你怎么做。
[% SET s = "A'B'C" %]
<a href="/abc.html" onclick="popup('[% s | html_entity %]')">ABC</a>
html_entity
显然不起作用,因为它只处理双引号。你是怎么做到的?
您是否曾经在模板工具包中为必要的 javascript 处理程序转义单引号?如果是这样,你怎么做。
[% SET s = "A'B'C" %]
<a href="/abc.html" onclick="popup('[% s | html_entity %]')">ABC</a>
html_entity
显然不起作用,因为它只处理双引号。你是怎么做到的?
我不使用内联事件处理程序——出于同样的原因,我拒绝将style
属性用于 css。class="foo"
Jquery 只是使在 html 和$('.foo').click( function () {} )
外部.js
文件中的操作变得容易。
但是,为了尽我所能回答这个问题,请查看这些文档以Template::Filter
获取核心文档。
似乎您可以[% s | replace( "'", "\\'" ) %]
, 转义单引号。或者您可能会编写一个更复杂的净化 javascript 解析器,它只允许函数调用,并制作您自己的Template::Filter
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
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>
你可以试试:popup('[% s | html %]')
。
记得在替换中对斜线进行双重转义,否则将被解释为转义撇号。
[% string.replace( "'", "\\'" ) %]