0

我有一个包含占位符的父页面。当需要新的 IFrame 时,将包含 IFrame 的 Span 元素添加到此占位符。每个 IFrame 都包含一个 asp 控件。父级有此代码,在父页面的 onClick 上触发:

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();}
            }
        }
    }

它调用每个控件中的保存函数,然后触发按钮单击,从而触发该特定控件的服务器端保存功能。对于试图在 30 秒内阅读此内容的人……可能会发现上一句令人困惑……所以希望这可以澄清这里的大局:

在此处输入图像描述

我遇到的问题是服务器正在无序地处理控件,尽管帧是有序的。

上述 javascript 中的 frames 对象是一个 2D 数组,其组织方式如下:


[[controlA_instanceA,controlA_instanceB,controlA_instanceC],
[controlB_instanceA,controlB_instanceB],
[controlC_instanceA,controlC_instanceB,etc],
[etc]]

循环、子控件的触发和框架数组都正常工作(因此我没有在这里显示代码)。但是,有人可以为我指出如何强制执行服务器处理控件的顺序的正确方向吗?

4

1 回答 1

0

您的控件需要分配给它们的序列号。然后,您保存所有内容的第一步是将二维数组分解为按序列号组织的一维数组。

当您将项目添加到框架数组时,您需要将它们添加为具有两个成员的对象:

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 站点,并且您通过 web 方法发回,那么我建议创建一个以数组作为参数的新 web 方法。

将您希望保存的所有内容推送到数组中,然后将其传回服务器以按特定顺序进行处理。

如果这是一个经典的表单站点,那么您可以在页面加载事件中处理自定义回发。

无论哪种方式,听起来您都需要重新评估这种处理方式。

于 2013-07-02T19:43:26.037 回答