4

从我的第一个窗口(我将其称为窗口 1)我正在使用打开第二个窗口(窗口 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 页作为集合的存储库,但我需要第 2 页来启动导致第 1 页上的集合被排序的逻辑。

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

奇怪。在玩了更多之后,看起来我可以通过向排序函数传递一个存在于第 1 页而不是第 2 页的处理程序来完成我想要的。但是当我在第 2 页远程运行该函数时,它会以相反的方式排序当我从第 1 页运行它时的顺序。我可能会玩这个来让它工作,但仍然会感谢任何关于最佳实践的建议。这是我最新的发现。

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

请记住,当我使用弹出功能时,您需要启用弹出窗口来测试其中的任何一个。

编辑。我发现最后一个 jsfiddle 上的跨浏览器结果参差不齐。我的一个朋友在 chrome 中尝试过它,它对他有用。我在我的 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/ ) 中尝试做的事情,但它被排序函数名称中的拼写错误所抛弃。你写了“compareFuncFromMainPag”而不是“compareFuncFromMainPage”。否则这会起作用,因为您要求 sort 方法使用也属于父窗口的比较函数对数组进行排序。

就个人而言,我会通过仅从弹出窗口调用父窗口上的函数来使这一点更加明确。父窗口中的那些函数将执行所有的数据操作。考虑对您最新的 jsfiddle 的此修改作为我建议的示例:

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

于 2013-02-08T03:44:02.310 回答