我有一个包含占位符的父页面。 包含IFrame的跨度元素会添加到此占位符,因为需要新的IFrame。 每个IFrame都包含一个asp控件。 父母有这个代码,触发了父页面的点击:
function saveAll() {
for (i = 0; i < frames.length; i++) {
for (j = 0; j < frames[i].length; j++) {
if(frames[i][j] != null && frames[i][j] != ''){document.getElementById(frames[i][j].toString()).contentWindow.Save();}
}
}
}
在每个控件中调用一个save函数,然后触发按钮单击,这会触发该特定控件的服务器端保存功能。对于那些试图在30秒内阅读此内容的人......可能会发现上一句话令人困惑......所以希望这可能会澄清这里的大局:
我遇到的问题是服务器正在按顺序处理控件,尽管订购的是帧。
上述javascript中的frame对象是一个如下组织的2D数组:
帧
[[controlA_instanceA,controlA_instanceB,controlA_instanceC],
[controlB_instanceA,controlB_instanceB],
[controlC_instanceA,controlC_instanceB等],
[等]]
循环,子控件的触发和frames数组都正常工作(因此我没有在这里显示代码)。但是,是否有人能指出我如何强制执行服务器处理控件的顺序?
答案 0 :(得分:0)
您的控件需要为其分配序列号。然后保存所有内容的第一步是将2D数组分解为按序列号组织的一维数组。
当您将项目添加到frames数组时,您需要将它们添加为具有两个成员的对象:
var seqNo = 0; // at some point early in the script
...
frames[x][y] = {frame: (iFrame), sequence: seqNo}; //When the Control is added
seqNo++;
其中(iFrame)
是框架的ID。
然后你的保存所有功能将如下所示:
function saveAll() {
var iFrames = [];
for (i = 0; i < frames.length; i++)
{
for (j = 0; j < frames[i].length; j++) {
if(frames[i][j] != null && frames[i][j] != '')
{
iFrames.push(frames[i][j]);
}
}
}
iFrames.sort(function(a,b){ return a.sequence - b.sequence});
for ( t = 0; t < iFrames.length; t++)
{
document.getElementById(iFrames[t].frame.toString()).contentWindow.Save();
}
}
通过这种方式,您可以确保保留订单,因为您按序列号对数组进行了排序。
这就是说,问题可能是数组似乎已排序,但它不是,而且并不是假设问题是服务器响应点击事件的顺序。
修改强>
如果服务器无法响应事件,那么您可能需要采用不同的方法。
如果这是一个ajax网站,并且您通过网络方法发回,那么我建议创建一个新的网络方法,将数组作为参数。
将您要保存的所有内容推送到数组中,然后将其传递回服务器以便按特定顺序进行处理。
如果这是一个经典表单网站,那么您可以在页面加载事件中处理自定义回发。
无论哪种方式,您都需要重新评估其处理方式。