4

最初のウィンドウ(ウィンドウ1と呼びます)から2番目のウィンドウ(ウィンドウ2)を開いています。

    var w = window.open("", "");

ウィンドウ2内から、次のようなコードを使用して、ウィンドウ1で定義された配列を参照および操作しています。

    window.opener.object2[0].drivedistance = driveDistance;

このコードは正常に機能します。ただし、この配列の結果をウィンドウ2に表示する前に、並べ替える必要があります。並べ替えの試み:

    window.opener.objects2.sort(compareFunc)

    function compareFunc(a, b){ 
        return (a.drivedistance - b.drivedistance)
    }

リモートウィンドウから呼び出さずにjsfiddleで同じメソッドを使用すると、正常に機能しているようです。

http://jsfiddle.net/98Q4D/10/

コードをステップスルーすると、compareDrivingでコードが実行されていることがわかります。例外はスローされていません。ただし、compareDrivingの呼び出しが完了した後、配列はソートされません。並べ替えている配列がウィンドウ1にあるので、これが何らかのセキュリティの問題であるかどうかはわかりませんが、JavaScriptはウィンドウ2にありますか?このソートコードが機能しない理由についてのアイデアをいただければ幸いです。

コメントに基づいて、私はそれをうまく示しているように見える問題のjsfiddleをまとめました。最終的な解決策を明確にするために、コレクションのリポジトリであるページ1が必要ですが、ページ1のコレクションをソートするロジックを開始するにはページ2が必要です。

http://jsfiddle.net/mexP6/26/

奇妙な。これをもう少し試してみると、2ページではなく1ページに存在するハンドラーをsort関数に渡すことで、目的を達成できる可能性があります。ただし、2ページで関数をリモートで実行すると、逆にソートされます。 1ページから実行するときと同じように注文します。おそらくこれを試して動作させることができますが、それでもベストプラクティスに関する提案をいただければ幸いです。これが私の発見の最新のフィドルです。

http://jsfiddle.net/mexP6/23/

私はポップアップ機能を使用しているので、これらのいずれかをテストするには、ポップアップを有効にする必要があることに注意してください。

編集。クロスブラウザの結果は、最後のjsfiddleでは非常にむらがあることがわかりました。私の相棒はそれをクロムで試しました、そしてそれは彼のために働きました。Chromeで試してみましたが、結果が並べ替えられません。IEは逆にソートします。私はFirefoxをまったく動作させていません。クロスブラウザ互換のクロスウィンドウソートを実行する方法に関するヘルプは、私が本当にここで求めているものだと思います。ありとあらゆる答えをありがとう。

4

1 に答える 1

1

ブラウザ間で明らかに異なる、別々のウィンドウ間で許可されるスクリプト操作に関するルールに遭遇していると思います。最初の例 (以下) を考えると、親ウィンドウに存在するオブジェクト (配列) に対してメソッド (並べ替え) を実行していますが、ポップアップ ウィンドウから関数を渡しています。

window.opener.objects2.sort(compareFunc)

function compareFunc(a, b){ 
    return (a.drivedistance - b.drivedistance)
}

私は通常、親ウィンドウが自身のデータの変更を処理できるようにするのが最善であると考えています。これは基本的に、あなたが最近の jsfiddle の試み ( http://jsfiddle.net/mexP6/23/ ) でやろうとしたことですが、並べ替え関数の名前のスペル ミスによって破棄されました。「compareFuncFromMainPage」の代わりに「compareFuncFromMainPag」と書きました。親ウィンドウにも属する比較関数を使用して、並べ替えメソッドに配列を並べ替えるように要求していたため、これは別の方法で機能していました。

個人的には、ポップアップ ウィンドウから親ウィンドウの関数のみを呼び出すことで、これをさらに明確にします。親ウィンドウのこれらの関数は、すべてのデータ操作を実行します。私が提案していることの例として、最新の jsfiddle のこの変更を検討してください。

http://jsfiddle.net/jarbirdy/dUMMw/8/

于 2013-02-08T03:44:02.310 に答える