【问题标题】:JQuery Autocomplete from Perl来自 Perl 的 JQuery 自动完成
【发布时间】:2011-05-10 01:09:52
【问题描述】:

我正在努力找出失败的地方。我可以在我的本地 PC 上使用 php/jquery 让这个插件工作,但尝试在我的生产机器上使用 Perl 复制它(由于我不会进入的原因,php 不是一个选项)。

index.cgi - 这是生成包含文本框的 html 页面的 perl 代码。

#!/usr/bin/perl -w 

use DBI;
use CGI;
use warnings;
use strict;

$cgi = new CGI;
$cgi->autoEscape(undef);
print $cgi->header;
print $cgi->start_html(-title=>'test',
                        -dtd=>'//W3C//DTD HTML 4.01 Transitional//EN',
                        -style=>'/themes/ui-lightness/jquery.ui.all.css',
                        -script=>[
                                {-type=>'javascript', -src=>'/js/jquery-1.5.2.min.js'},
                                {-type=>'javascript', -src=>'/js/test.js'},
                                {-type=>'javascript', -src=>'/ui/jquery-ui-1.8.11.custom.js'},
                                {-type=>'javascript', -src=>'/ui/jquery.ui.core.js'},
                                {-type=>'javascript', -src=>'/ui/jquery.ui.widget.js'},
                                {-type=>'javascript', -src=>'/ui/jquery.ui.position.js'},
                                {-type=>'javascript', -src=>'/ui/jquery.ui.autocomplete.js'}
                        ]
        );

print $cgi->start_div({-class=>'ui-widget'});
print $cgi->textfield(-id=>'customer',-size=>25),$cgi->br;
print $cgi->end_div(),$cgi->br;
print $cgi->div({-class=>'ui-widget-content',-id=>'log'});
print $cgi->end_html;

test.pl - 这是在后台运行以将 JSON 提供给自动完成的代码:

#!/usr/bin/perl 
use warnings;
use strict;
use CGI;
use DBI;
use JSON;

my $cgi = CGI->new;
print $cgi->header(-type => "application/json", -charset => "utf-8");
my $dbh = DBI->connect('dbi:mysql:hostname=test;database=test',"test","test");
my $term = $cgi->param('term');
my $sth = $dbh->prepare(qq{SELECT customer.name, customer.id FROM test WHERE customer.name ?;}) or die $dbh->errstr;
$sth->execute($term.'%') or die $sth->errstr;
my $json = {};
while(my @customer = $sth->fetchrow_array()) {
   $json->{$customer[0]} = $customer[1];
}
print JSON::to_json($json);

test.js - 这是实际使用的 JQuery:

$(function() {
        function log( message ) {
                $( "<div/>" ).text( message ).prependTo( "#log" );
                $( "#log" ).attr( "scrollTop", 0 );
        }

        $( "#customer" ).autocomplete({
                source: "test.pl?term=",
                minLength: 2,
                select: function( event, ui ) {
                      log( ui.item ?
                              "Value: " + ui.item.value + " Key " + ui.item.id :
                              "Nothing selected, input was " + this.value );
                }
        });
});

我一直在谷歌周围,但没有找到任何可靠的东西,有人有一个带有 JQuery 的 Perl 示例。 test.js 和 index.cgi 文件几乎完全复制了 jquery-ui 示例文件中用于 jquery 自动完成的代码,除了 index.cgi 是使用 CGI.pm 用 Perl 编写的。

任何帮助都将不胜感激,由于服务器的性质和其上的应用程序,我在这里的语言有些限制。

【问题讨论】:

  • test.pl 甚至无法编译。
  • 我知道你说过你不会进入它,但我真的很好奇为什么你不能在你的服务器上安装 PHP
  • use strictwarnings 丢失。不要忽略这些来浪费时间。
  • 相信我,有一家价值数十亿美元的公司设法使用 Perl 和 jQuery 作为他们的 CGI 和界面,每天数百万次。当然,Perl 必须先编译。您的$dbh 分配需要一个分号。 USUW(“使用严格;使用警告;”)
  • @Axeman 缺少的分号出现在我的环境中的代码中。我编辑了诸如用户名和密码之类的东西,在格式化这篇文章的代码时我可能不小心。 .cgi 和 .pl 文件按预期编译和运行,但不会填充自动完成功能。我不确定如何测试 JQuery 部分以查看它是否收到结果。我已经看到了 php 示例中使用的变量 'term',我将尝试使用 LWP,看看是否可以复制 $_GET 操作,看看是否有帮助。

标签: perl jquery-ui jquery


【解决方案1】:

Perl 和 jQuery 大多是孤立的。如果 Perl 发送正确的 HTML,您的浏览器应该执行正确的 jQuery 代码。如果在test.pl 中发送了正确的 JSON——前提是你已经设置了 jQuery 来正确处理它——它应该可以正确处理。

但是,正如我在评论中提到的,它必须先编译。您在$dbh 分配的末尾缺少一个分号。这意味着 Perl 认为您还没有完成,并期望您尝试以某种方式将 $sth 分配与 $dbh 分配联系起来。

一旦我进行了更改,您的代码就会编译。检查编译:perl -c test.pl。但它失败了,因为我无权访问您要检查的数据库,所以假设连接字符串是正确的,我不明白为什么这不起作用。

而且总是——至少在开发中——开始你的脚本:

use strict;
use warnings;
...

让自己有机会发现编码错误。当然,在生产环境中,如果有一段代码在生产前测试中测试失败,它们也会给你更好的错误消息。

【讨论】:

  • 当我从 CLI 运行 test.pl 时,我能够看到 JSON 格式的数据输出。我不完全确定如何调试以查看 Perl 脚本和 JQuery 脚本的结果之间的沟通不畅,我只能假设。内容类型:应用程序/json; charset=utf-8 { "559" : "This is record 558\r", "127" : "This is record 126\r", "32" : "This is record 31\r" } 我添加了使用警告和对两个 perl 脚本都使用严格,它们检查得很好。
【解决方案2】:

您没有在返回的 json 字符串中分配值或标签字段。你正在倾销姓名和身份证。自动完成不知道你想在自动完成结果中出现哪一个。将客户名称分配给值字段。

$json->{"value"} = $customer[0];
$json->{"id"} = $customer[1];

jQuery 自动完成需要与 json 结果一起返回的“值”或“标签”字段。如果不包含它,jquery 自动完成功能将不起作用:

自动完成的基本功能适用于分配给“标签”和“值”字段的查询结果。来自 jQuery UI 站点的“标签”和“值”字段的解释:

“本地数据可以是一个简单的字符串数组,或者它包含数组中每个项目的对象,具有标签或值属性或两者兼有。标签属性显示在建议菜单中。用户从菜单中选择某些内容后,该值将插入到输入元素中。如果只指定了一个属性,它将同时用于这两个属性,例如。如果您只提供 value-properties,则 value 也将用作标签。”

完整示例的链接: http://www.jensbits.com/2011/05/09/jquery-ui-autocomplete-widget-with-perl-and-mysql/

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2014-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多