【问题标题】:Passing Perl variable to Javascript function将 Perl 变量传递给 Javascript 函数
【发布时间】:2018-10-21 10:10:28
【问题描述】:

问题 将 Perl 变量传递给 Javascript 函数时出现错误。我错过了什么吗?

print "<button onclick='return getPdf("$user");'>PDF</button>"; 

导致错误:POST page.pl 500(内部服务器错误)

print "<button onclick='return getPdf(".$user.");'>PDF</button>"; 

导致错误:Uncaught ReferenceError: Tom is not defined 在 HTMLButtonElement.onclick (page.pl:113)

print "<button onclick='return getPdf('$user');'>PDF</button>"; 

导致错误:Uncaught SyntaxError: Unexpected end of input

print "<button onclick='return getPdf('.$user.');'>PDF</button>"; 

导致错误:Uncaught SyntaxError: Unexpected end of input

page.pl

$user = "Tom";
print "<button onclick='return getPdf();'>PDF</button>";

Javascript

function getPdf(user) {
    alert("User is: " + user);
}

【问题讨论】:

  • 尝试使用q(...)函数引用q|&lt;button&gt; onclick='return getPdf(| . $user . q|);'&gt;PDF&lt;/button&gt;|;
  • 替换:打印"";用:q||;该按钮现在甚至没有出现
  • 试试ikegami的建议
  • 我找到了解决办法!

标签: javascript html perl


【解决方案1】:

您正在询问如何将文本转换为 JavaScript 文字,以及如何将该 JavaScript 文字嵌入到 HTML 中。

这可以通过以下方式非常简单地完成:

print '<button onclick="return getPdf('.text_to_html(text_to_jslit($user)).');">PDF</button>';

text_to_html 的示例实现:

{
   my %translations = (
      '&' => '&amp;',
      '<' => '&lt;',
      '>' => '&lt;',
      '"' => '&quot;',
      "'" => '&apos;',
   );

    my $meta_chars_class = join '', map quotemeta, sort keys %translations;
    my $meta_chars_re = qr/([$meta_chars_class])/;

   sub text_to_html { $_[0] =~ s/$meta_chars_re/$translations{$1}/rg }
}

text_to_jslit 的示例实现:

{
   my @js_line_terminators = ( 0x000A, 0x000D, 0x2028, 0x2029 );

   my @control_chars = ( 0x00..0x1F, 0x7F..0x9F );  # Incomplete, but optional anyway.

   my %translations = (
      ( map { chr($_) => sprintf($_ <= 0xFF ? "\\x%02x" : "\\u%04x", $_) }
         @js_line_terminators,
         @control_chars,
         ord('<'),          # To prevent </script> from appearing literally.
      ),

      # More readable escapes.
      "\x08" => '\\b',
      "\x09" => '\\t',
      "\x0A" => '\\n',
      "\x0B" => '\\v',
      "\x0C" => '\\f',
      "\x0D" => '\\r',

      '"'  => '\\"',
      '\\' => '\\\\',
    );

    my $meta_chars_class = join '', map quotemeta, sort keys %translations;
    my $meta_chars_re = qr/([$meta_chars_class])/;

    sub text_to_jslit { '"'.( $_[0] =~ s/$meta_chars_re/$translations{$1}/rg ).'"' }
}

【讨论】:

  • 感谢您的回复。仅仅将 Perl 变量传递给 js 函数,这看起来相当复杂
  • 您不是在问如何将值传递给函数;你在问如何生成 JS 代码,你在问如何生成 HTML。
  • 我究竟是如何实现这两个实现的?它们应该是函数吗?我对 Perl 不太熟悉,抱歉
  • 嗯?正如你自己所说,我已经提供了实现
  • 所以我应该将这两个实现部分复制粘贴到我的 perl 页面中吗?我收到一个错误:加载资源失败:服务器响应状态为 500(内部服务器错误)
【解决方案2】:

这是解决方法

将需要传入函数的变量括起来:

\''.$variable.'\'

完整代码:

print '<button onclick="return getPdf(\''.$user.'\');">PDF</button>';

【讨论】:

  • 这段代码同时存在 JavaScript 代码注入错误和 HTML 代码注入错误!!! (请参阅code injection。)例如,如果$user 包含'\ &amp;",则会失败。 $user 可能不包含这些,但我确信 $user 不是唯一的变量,因此提供特定于 $user 的解决方案是没有用的。
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 2016-08-21
  • 2015-05-02
  • 2017-04-30
  • 2018-12-14
  • 2014-10-31
相关资源
最近更新 更多