JQuery从Perl自动完成

JQuery从Perl自动完成,perl,jquery-ui,jquery,Perl,Jquery Ui,Jquery,我正在努力找出失败的地方。我可以在本地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;

我正在努力找出失败的地方。我可以在本地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 );
                }
        });
});
我已经在google附近走走了,但还没有发现任何有人用JQuery编写Perl示例的可靠信息。test.js和index.cgi文件几乎完全复制了jquery自动完成的jquery ui示例文件中的代码,除了index.cgi是使用cgi.pm用Perl编写的


如果您能提供任何帮助,我将不胜感激。同样,由于服务器的性质和服务器上的应用程序,我在语言方面也有一定的局限性。

Perl和jQuery基本上是孤立的。如果Perl发送正确的HTML,那么浏览器应该执行正确的jQuery代码。如果在test.pl中发送了正确的JSON,前提是您已经设置了jQuery来正确处理它,它应该能够正确处理

然而,正如我在评论中提到的,它必须首先编译。您在$dbh作业结束时缺少分号。这意味着Perl认为您还没有完成,并期望您以某种方式尝试将$sth分配与$dbh分配联系起来

一旦我做了修改,你的代码就被编译了。检查编译:perl-ctest.pl。但是它失败了,因为我无法访问您试图检查的DBs,所以假设连接字符串是正确的,我不明白为什么这不起作用

始终,始终处于开发阶段,至少从以下内容开始编写脚本:

use strict;
use warnings;
...

给自己一个抓住编码错误的机会。当然,在生产环境中,如果在生产前测试中有一段代码没有通过测试,它们也会给您提供更好的错误消息。

您没有在返回的json字符串中分配值或标签字段。您正在转储名称和id。自动完成程序不知道您希望在自动完成结果中显示哪一个。将客户名称分配给值字段

$json->{"value"} = $customer[0];
$json->{"id"} = $customer[1];
jQuery自动完成需要一个值或标签字段,该字段随json结果一起返回。如果不包括它,jquery自动完成将不起作用:

自动完成的基本功能与分配给“标签”和“值”字段的查询结果一起使用。关于jQuery UI站点中“标签”和“值”字段的说明:

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

链接到完整示例:

test.pl甚至不编译。我知道你说过你不会去编译它,但我真的很好奇为什么你不能在你的服务器上安装PHP使用strict和警告缺失。不要浪费时间忽略这些。相信我,有一家数十亿美元的公司设法使用Perl和jQuery作为他们的CGI和接口,成千上万的ti每天的mes。当然,Perl必须首先编译。在$dbh分配中需要一个分号。通常使用strict;use warnings;@Axeman在我的环境中,缺少的分号存在于代码中。我编辑了用户名和密码等内容,在格式化这篇文章的代码时可能会粗心。cgi和.pl文件我不确定如何测试JQuery部分,看看它是否收到了结果。我已经看到php示例中使用的变量“term”,我将尝试使用LWP,看看是否可以复制$\u GET操作,看看这是否有帮助。当我从C运行test.pl时我可以看到JSON格式的数据输出。我不能完全确定如何调试Perl脚本和JQuery脚本的结果之间的错误通信,我只能假设。内容类型:application/JSON;charset=utf-8{559:这是记录558\r,127:这是记录126\r,32:这是记录31\r}我在这两个perl脚本中都添加了use warnings和use strict,它们可以正常运行。