Javascript 从jquery向cgi提交表单时出现的问题

Javascript 从jquery向cgi提交表单时出现的问题,javascript,jquery,perl,Javascript,Jquery,Perl,我有一个问题,当我提交一个选择了X个数量的表单时,我的代码挂起。我的表单是自动生成的,取决于用户输入。在表单中选择少量数据时,提交数据不会出现问题,我的cgi脚本运行良好。似乎当数组“params”大于124项时,代码将挂起并且从不加载 \$('#HTML_EXECUTE_BUTTON').click(function() { \$("#prog").html("<h2>WORKING - <img src='./lib/jqueryui_s

我有一个问题,当我提交一个选择了X个数量的表单时,我的代码挂起。我的表单是自动生成的,取决于用户输入。在表单中选择少量数据时,提交数据不会出现问题,我的cgi脚本运行良好。似乎当数组“params”大于124项时,代码将挂起并且从不加载

\$('#HTML_EXECUTE_BUTTON').click(function() {

                 \$("#prog").html("<h2>WORKING - <img src='./lib/jqueryui_start/development-bundle/themes/base/images/ui-anim_basic_16x16.gif'> </h2>");

                 var params  = \$("#mec_html_step_B_inputs").serializeArray();
                 var params1 = \$("#mec_html_step_C_inputs").serializeArray();
                 var params2 = \$("#mec_html_step_D_inputs").serializeArray();
                 var params3 = \$("#mec_html_step_A_inputs").serializeArray();

                 params = \$.merge(params, params1);
                 params = \$.merge(params, params2);
                 params = \$.merge(params, params3);

                 params.push({ name: 'menu_mode', value: '5' });
                 params.push({ name: 'mode', value : '$mode'});
                params.push({ name: 'modetype', value: '$GLOBAL_MQA_MODE' });

                 \$("#HTML_EXECUTE_BUTTON").css("background-color","");

                    my_window = window.open("", "DEBUG WINDOW", "status=1,width=350,height=150"); //for debugging
                    my_window.document.write(dump(params)); //for debugging
                    alert(params.length); // for debugging


                 \$.get("./cgi_scripts/$GLOB_SCRIPT_NAME",params , function(data) { 
                    \$("#grapharea").html(data);
                    \$("#prog").html(" ");
                 });
            });
\$('HTML\u执行按钮')。单击(函数(){
\$(“#prog”).html(“工作-”);
var params=\$(“\mec\u html\u步骤\u B\u输入”).serializeArray();
var params1=\$(“\mec\u html\u步骤\u C\u输入”).serializeArray();
var params2=\$(“\mec\u html\u步骤\u D\u输入”).serializeArray();
var params3=\$(“\mec\u html\u步骤\u A\u输入”).serializeArray();
params=\$.merge(params,params1);
params=\$.merge(params,params2);
params=\$.merge(params,params3);
push({name:'menu_mode',value:'5'});
push({name:'mode',value:'$mode'});
push({name:'modetype',value:'$GLOBAL_MQA_MODE'});
\$(“#HTML#u执行_按钮”).css(“背景色”,”);
my_window=window.open(“,“调试窗口”,“状态=1,宽度=350,高度=150”);//用于调试
my_window.document.write(dump(params));//用于调试
警报(params.length);//用于调试
\$.get(“./cgi_scripts/$GLOB_SCRIPT_NAME”),参数,函数(数据){
\$(“#grapharea”).html(数据);
\$(“#prog”).html(“”);
});
});
$.get()函数是否有字符/参数大小限制?我已经尽可能多地调试了,这是我认为可能出错的最后一个领域。除非CGI.pm可以处理的参数达到最大数量?你有什么想法吗?我没有考虑过的事情

谢谢


顺便说一句,被调用的cgi脚本被加载到与表单相同的页面中,就在表单下方。

我知道不同的web服务器有不同的URL长度,但它们通常在2-6000个字符左右

事情是这样的——如果发送到服务器的数据应该存储在某个地方,那么您可能应该发出POST请求。POST将更可靠地处理大型数据集,因为表单数据进入请求体。更重要的是,GET请求应该是幂等的——反复提交相同的请求应该总是产生相同的结果,并且不应该在其他地方改变任何东西。如果这个请求不是那样的,应该是POST

您可能希望尝试使用LiveHTTPHeaders(对于Firefox)或Fiddler之类的工具来检查实际发送的请求。将其与您希望发送的内容进行比较

编辑:这里尝试修改您的请求以使用帖子。根据我对jq文档的粗略浏览,看起来您可以依靠jq为您自动序列化阵列

\$('#HTML_EXECUTE_BUTTON').click(function(event) {

    \$("#prog").html('<h2>WORKING - <img src="./lib/jqueryui_start/development-bundle/themes/base/images/ui-anim_basic_16x16.gif" /> </h2>');

    var params  = \$("#mec_html_step_B_inputs").serializeArray();
    var params1 = \$("#mec_html_step_C_inputs").serializeArray();
    var params2 = \$("#mec_html_step_D_inputs").serializeArray();
    var params3 = \$("#mec_html_step_A_inputs").serializeArray();

    params = \$.merge(params, params1);
    params = \$.merge(params, params2);
    params = \$.merge(params, params3);

    params.push({ name: 'menu_mode', value: '5' });
    params.push({ name: 'mode', value : '\$mode'});
    params.push({ name: 'modetype', value: '\$GLOBAL_MQA_MODE' });

    \$("#HTML_EXECUTE_BUTTON").css("background-color","");

        my_window = window.open("", "DEBUG WINDOW", "status=1,width=350,height=150"); //for debugging
        my_window.document.write(dump(params)); //for debugging
        alert(params.length); // for debugging

    jQuery.ajax({
        url: './cgi_scripts/$GLOB_SCRIPT_NAME',
        type: 'POST',
        data: params,
        error: function(jXHR, sStatus, eError) {
            // react to failures
        },
        success: function(data, textStatus, jqXHR) {
            // react to success
            \$("#grapharea").html(data);
            \$("#prog").html(" ");
        }
    });
    event.preventDefault();
    return false;
});
\$('HTML\u执行按钮')。单击(函数(事件){
\$(“#prog”).html('WORKING-');
var params=\$(“\mec\u html\u步骤\u B\u输入”).serializeArray();
var params1=\$(“\mec\u html\u步骤\u C\u输入”).serializeArray();
var params2=\$(“\mec\u html\u步骤\u D\u输入”).serializeArray();
var params3=\$(“\mec\u html\u步骤\u A\u输入”).serializeArray();
params=\$.merge(params,params1);
params=\$.merge(params,params2);
params=\$.merge(params,params3);
push({name:'menu_mode',value:'5'});
push({name:'mode',value:'\$mode'});
push({name:'modetype',value:'\$GLOBAL\u MQA\u MODE'});
\$(“#HTML#u执行_按钮”).css(“背景色”,”);
my_window=window.open(“,“调试窗口”,“状态=1,宽度=350,高度=150”);//用于调试
my_window.document.write(dump(params));//用于调试
警报(params.length);//用于调试
jQuery.ajax({
url:'./cgi_scripts/$GLOB_SCRIPT_NAME',
键入:“POST”,
数据:params,
错误:函数(jXHR、sStatus、eError){
//对失败作出反应
},
成功:函数(数据、文本状态、jqXHR){
//对成功作出反应
\$(“#grapharea”).html(数据);
\$(“#prog”).html(“”);
}
});
event.preventDefault();
返回false;
});
(我还更改了HTML生成,在标记中使用正确的引号。没什么大不了的。)


编辑2:现在,单击事件被此处理程序捕获并使用。

我知道不同的web服务器具有不同的URL长度,但它们通常大约有2-6000个字符

事情是这样的——如果发送到服务器的数据应该存储在某个地方,那么您可能应该发出POST请求。POST将更可靠地处理大型数据集,因为表单数据进入请求体。更重要的是,GET请求应该是幂等的——反复提交相同的请求应该总是产生相同的结果,并且不应该在其他地方改变任何东西。如果这个请求不是那样的,应该是POST

您可能希望尝试使用LiveHTTPHeaders(对于Firefox)或Fiddler之类的工具来检查实际发送的请求。将其与您希望发送的内容进行比较

编辑:这里尝试修改您的请求以使用帖子。根据我对jq文档的粗略浏览,看起来您可以依靠jq为您自动序列化阵列

\$('#HTML_EXECUTE_BUTTON').click(function(event) {

    \$("#prog").html('<h2>WORKING - <img src="./lib/jqueryui_start/development-bundle/themes/base/images/ui-anim_basic_16x16.gif" /> </h2>');

    var params  = \$("#mec_html_step_B_inputs").serializeArray();
    var params1 = \$("#mec_html_step_C_inputs").serializeArray();
    var params2 = \$("#mec_html_step_D_inputs").serializeArray();
    var params3 = \$("#mec_html_step_A_inputs").serializeArray();

    params = \$.merge(params, params1);
    params = \$.merge(params, params2);
    params = \$.merge(params, params3);

    params.push({ name: 'menu_mode', value: '5' });
    params.push({ name: 'mode', value : '\$mode'});
    params.push({ name: 'modetype', value: '\$GLOBAL_MQA_MODE' });

    \$("#HTML_EXECUTE_BUTTON").css("background-color","");

        my_window = window.open("", "DEBUG WINDOW", "status=1,width=350,height=150"); //for debugging
        my_window.document.write(dump(params)); //for debugging
        alert(params.length); // for debugging

    jQuery.ajax({
        url: './cgi_scripts/$GLOB_SCRIPT_NAME',
        type: 'POST',
        data: params,
        error: function(jXHR, sStatus, eError) {
            // react to failures
        },
        success: function(data, textStatus, jqXHR) {
            // react to success
            \$("#grapharea").html(data);
            \$("#prog").html(" ");
        }
    });
    event.preventDefault();
    return false;
});
\$('HTML\u执行按钮')。单击(函数(事件){
\$(“#prog”).html('WORKING-');
var params=\$(“\mec\u html\u步骤\u B\u输入”).serializeArray();
var params1=\$(“\mec\u html\u步骤\u C\u输入”).serializeArray();
var params2=\$(“\mec\u html\u步骤\u D\u输入”).serializeArray();
var-pa