我有一个问题,当我提交一个包含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(" ");
});
});
$ .get()函数是否有字符/参数大小限制?我已尽可能多地调试,这是我认为可能出错的最后一个区域。除非CGI.pm可以处理最大数量的参数?什么可能是错的?我没有考虑过的事情?
由于
顺便说一句,被调用的cgi脚本正在加载到与表单相同的页面中,就在下面。
答案 0 :(得分:1)
我知道不同的Web服务器具有不同的URL长度,但它们通常大约为2-6,000个字符。
这就是事情 - 如果发送到服务器的数据应该存储在某个地方,你可能应该把它作为POST请求。 POST将更加健壮地处理大型数据集,因为表单数据位于请求正文中。更重要的是,GET请求应该是幂等的 - 一遍又一遍地提交相同的请求应该总是产生相同的结果,并且不应该在其他地方改变任何东西。如果此请求不是这样,则应该是POST。
您可能想尝试使用类似LiveHTTPHeaders(适用于Firefox)或Fiddler的内容来检查实际发送的请求。将其与您期望发送的内容进行比较。
编辑:这是尝试修改您使用POST的请求。根据我对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生成以在标记中使用正确的引号。没什么大不了的。)
编辑2:现在,此处理程序捕获并使用了click事件。