Javascript 在跨站点Perl CGI函数的ajax调用中获取状态代码0

Javascript 在跨站点Perl CGI函数的ajax调用中获取状态代码0,javascript,ajax,perl,Javascript,Ajax,Perl,正在调用Perl CGI脚本;我可以看到调试日志获取参数并执行 问题是返回结果,状态代码始终为0,responseText为空 尝试了各种头球选项等,没有运气,任何帮助将不胜感激 Perl CGI处理程序 HTML代码 [%title%] 输入号码: 试验 功能测试_编号() { $.ajax({ 键入:“POST”, 数据类型:“json”, url:“/cgi-bin/simple.cgi”, 数据:{ ‘number’:$(‘number’).val() }, 成功:功能(数据、文本状态

正在调用Perl CGI脚本;我可以看到调试日志获取参数并执行

问题是返回结果,状态代码始终为0,responseText为空

尝试了各种头球选项等,没有运气,任何帮助将不胜感激

Perl CGI处理程序

HTML代码


[%title%]
输入号码:
试验
功能测试_编号()
{
$.ajax({
键入:“POST”,
数据类型:“json”,
url:“/cgi-bin/simple.cgi”,
数据:{
‘number’:$(‘number’).val()
},
成功:功能(数据、文本状态){
警报(“请求成功”);
},
错误:函数(jqXHR,异常){
msg='请求状态:'+jqXHR.Status+'状态文本:'+jqXHR.statusText+'+jqXHR.responseText;
警报(msg);
}
});
返回false;
}

单击表单中的提交按钮时运行JavaScript函数

这:

  • 发送Ajax请求
  • 卸载当前页面
  • 提交表格
  • 加载新页面

  • 快攻 对按钮元素使用
    type=“button”
    ,使其不是提交按钮

    适当的解决方案
  • Set
    请显示更多Perl代码。特别是如果在您显示的语句上方有任何其他
    打印
    语句。如果状态为
    0
    ,则通常会在浏览器的开发人员工具的控制台上显示有用的错误消息。你需要看看那里,你的Perl代码看起来不错。这没什么问题。在开发人员工具中查看请求。可能是您的
    POST
    请求实际上没有提交表单,而是
    data
    中的JS对象被序列化为JSON并作为请求主体提交,而不是转换为formdata。如果是这种情况,CGI.pm无法读取它,并且
    $q->param('number')
    将为false,因此您的程序将永远不会打印任何内容,只需退出即可。如果没有输出,你就什么都看不见。那HTML代码是否足以构成一个?如果有一个
    元素,那么这将产生显著的差异。@simbabque-
    数据
    没有JSON数据结构。只是一个普通的JS。jQuery将使用标准格式数据编码对其进行序列化。
    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use CGI;
    use JSON;
    use Data::Dumper qw( Dumper );
    
    my $q = new CGI;
    my %data;
    
    open my $FH, '>', 'outfile';
    
    if ( my $number = $q->param('number') ){
        if ( $number =~ /^\d+$/ ) {
                $data{result} = $number % 2 ? 'odd' : 'even';
        } else {
                $data{result} = 'Not a number';
        }
    
        my $jret = to_json(\%data);
        print $FH Dumper($jret);
        close $FH;
    
        print $q->header('application/json');
        print to_json(\%data);
    }
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>[% title %]</title>
    <meta charset='utf-8'>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js">      </script>
        </script>
    </head>
    
    <body>
        <div id='result'></div>Enter number:
        <form>
        <input type='text' id='number'> 
        <button onclick='test_number();'>Test</button>
    
        <script>
            function test_number()
            {
                $.ajax({
                        type: 'POST',
                        dataType: 'json',
                        url: '/cgi-bin/simple.cgi',
                        data: {
                                'number': $('#number').val()
                        },
                        success: function(data, textStatus ){
                           alert('request successful');
                        },
                        error: function(jqXHR, exception) {
                            msg =  'Request Status: ' + jqXHR.status + ' Status Text: ' + jqXHR.statusText + ' ' + jqXHR.responseText;
                            alert(msg);
                        }
                });
                return false;
            }
        </script>
        </form>
    </body>
    </html>
    
    function test_number(event) {
        event.preventDefault();
        $.ajax({
            type: 'POST',
            dataType: 'json',
            url: '/cgi-bin/simple.cgi',
            data: {
                'number': $('#number').val()
            },
            success: function(data, textStatus) {
                alert('request successful');
            },
            error: function(jqXHR, exception) {
                msg = 'Request Status: ' + jqXHR.status + ' Status Text: ' + jqXHR.statusText + ' ' + jqXHR.responseText;
                alert(msg);
            }
        });
    }
    
    document.querySelector("form").addEventListener("submit", test_number);