0

我编写了一些代码,允许将页面上的一个元素扩展到全屏并收缩回其原始大小。此代码通过保存页面上其他元素的状态、更改它们的属性并恢复它们来工作。此更改必须在回发后继续存在,因此我尝试使用 JSON 和隐藏的输入元素来保留状态更改。

有问题的元素嵌套在多个 IFRAME 中。因此,我必须保存元素所在的文档模型。但是,这会导致 JSON 转换阻塞。我需要一种可以轻松转换为 JSON 并返回的方法来解决此问题。

以下是相关代码:

// e.uniqueID : A unique identifer for the object.
// e.doc: The document model to which the element belongs (so we can find it later).
// e.style: The original style of the element.

function my_preserveElement(gn,elem)
{
    if (elem == null) return;
    if (elem.style == null) return;
    if (elem.id == '') elem.id = PseudoGuid.GetNew();
    var e = new Object();
    e.uniqueID = elem.id;
    e.doc = elem.document;
    var cssString;
    cssString = elem.style.cssText;
    if( typeof(cssString) != 'string' ) { cssString = elem.getAttribute('style'); }
    e.style = cssString;
    me_aObjectStore[gn][me_aObjectStore[gn].length] = e;
}

function my_restoreElements(gn)
{
    for (i = 0; i < me_aObjectStore[gn].length; i++)
    {
        var e = me_aObjectStore[gn][i];
        var elem = e.doc.getElementById(e.uniqueID);
        elem.style.cssText = e.style;
        elem.setAttribute('style',e.style);
    }
    me_aObjectStore[gn] = null;
}
4

1 回答 1

0

发现由于有问题的代码在最里面的框架中运行,我只需要沿着框架树走,按 ID 搜索每个元素的每个级别。还原函数变成如下,不需要跟踪每个元素的位置(只需跟踪其唯一 ID)。

function my_restoreElements(gn)
{
    for (i = 0; i < my_aObjectStore[gn].length; i++)
    {
        var e = my_aObjectStore[gn][i];

        // Find the element in this window or one of its parents.
        // Because we need to check the top level frame and w.parent == w.self for that frame, 
        // we use the number of counts to keep the loop from being endless.
        var w = window;
        var elem = null;
        var count = 0; 
        do {
            elem = w.document.getElementById(e.uniqueID);
            w = w.parent; 
            count++;
        } while ((elem == null) && (count < 3))
        if (elem != null) {
            elem.style.cssText = e.style;
            elem.setAttribute('style',e.style);
        }
    } //for
    my_aObjectStore[gn] = null;
}

请注意,我明确地只走了三个级别。那是因为在我的具体情况下,框架只有那么几个层次。可以使用此解决方案的其他应用程序可能需要更深的深度。

于 2013-05-03T19:26:47.740 回答