2

次のシナリオを検討してください。

FooPageは、[追加]をクリックするとBarPageを開くページです。

BarPageには「戻る」ボタンがあります。それをクリックすると、次のようになります。

function Add() {
    var selectedResources = [{ 
        "ResourceID": "10", 
        "ResourceName": "Foo", 
        "ResourceTypeName": "Bar"
    }];
    if (window.opener != null 
        && typeof window.opener.AddResources != "undefined") {
        window.opener.AddResources(selectedResources);
        window.close();
    }
}

ご覧のとおり、FooPageには。という関数がありますAddResources。次のことを行います。

function AddResourcesCallback(selectedResources) {
    var result = JSON.stringify(selectedResources);
}

Chromeでは、これはうまく機能します。文字列はのJSONから作成されJSON.stringify、誰もが満足しています。

ただし、IE8では、これは機能しません。JSONは文字列に作成されません-代わりに、をJSON.stringify返しますundefined

テストとして、シナリオをこれに変更してみました。

function AddResourcesCallback(selectedResources) {
    var selectedResources = [{ 
        "ResourceID": "10", 
        "ResourceName": "Foo", 
        "ResourceTypeName": "Bar"
    }];
    var result = JSON.stringify(selectedResources);
}

このシナリオでJSON.stringifyは、IE8ではChromeと同じように正しい値が返されます。つまり、IE8では、配列をページからページに渡すときに、配列をJSONに解析することはできません。

最初に配列を文字列化せずに配列を渡す方法はありますか?

4

1 に答える 1

1

クロスウィンドウスコープの問題のようです。2つのオブジェクトには異なるObject.prototypeプロトタイプオブジェクトがあり、IEを混乱させる可能性があります(特に、ウィンドウを閉じるために一方がガベージコレクションされている場合)。次のように、他のウィンドウのJSON関数で文字列化してみてください。

// BarPage
if (window.opener != null && typeof window.opener.AddResources != "undefined") {
    window.opener.AddResources(selectedResources, JSON);
    window.close();
}

// FooPage
function AddResourcesCallback(selectedResources, json) {
    var result = json.stringify(selectedResources));
}

ただし、一方のウィンドウで文字列を文字列化し、文字列を渡してもう一方のウィンドウで解析するのが最も安全な方法だと思います。

于 2013-02-06T10:34:40.213 に答える