从我的第一个窗口(我将其称为窗口 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 中使用相同的方法而不从远程窗口调用它似乎工作正常。
当我单步执行代码时,我可以看到它正在执行 compareDriving 中的代码。没有异常被抛出。但是,在完成调用 compareDriving 之后,数组未排序。我不知道这是否是某种安全问题,因为我正在排序的数组存在于窗口 1 中,但我的 javascript 位于窗口 2 中?任何关于为什么这种排序代码不起作用的想法将不胜感激。
根据评论,我整理了一个问题的 jsfiddle,似乎很好地证明了这一点。为了明确最终解决方案,我需要第 1 页作为集合的存储库,但我需要第 2 页来启动导致第 1 页上的集合排序的逻辑。
奇怪。在玩了更多之后,看起来我可以通过将存在于第 1 页而不是第 2 页的处理程序传递给排序函数来完成我想要的。但是当我在第 2 页远程运行该函数时,它会反向排序按照我从第 1 页运行它时的顺序进行排序。我可能可以使用它来让它工作,但仍然会感谢有关最佳实践的任何建议。这是我最新的发现。
请记住,您需要启用弹出窗口来测试其中的任何一个,因为我正在使用弹出功能。
编辑。我发现最后一个 jsfiddle 上的跨浏览器结果参差不齐。我的一个 friend 用 chrome 试了一下,对他有用。我在我的 chrome 中试过了,结果没有排序。 IE 反向排序。我还没有让 Firefox 工作。对实现跨浏览器兼容的跨窗口排序的方法的任何帮助都是我认为我真正想要的。感谢您的所有回答。
最佳答案
我认为您遇到了关于在不同的窗口之间允许哪些脚本操作的规则,这些规则在浏览器之间明显不同。如果您考虑您的初始示例(如下),您正在对位于父窗口中的对象(数组)执行一个方法(排序),但是您从弹出窗口向它传递一个函数。
window.opener.objects2.sort(compareFunc)
function compareFunc(a, b){
return (a.drivedistance - b.drivedistance)
}
我通常发现最好允许父窗口处理对其自身数据的任何修改。这基本上就是您在最近的 jsfiddle 尝试 ( http://jsfiddle.net/mexP6/23/ ) 中尝试做的事情,但由于排序函数名称中的拼写错误而被取消。您写的是“compareFuncFromMainPag”而不是“compareFuncFromMainPage”。否则这会起作用,因为您要求排序方法使用也属于父窗口的比较函数对数组进行排序。
就个人而言,我会通过仅从弹出窗口调用父窗口上的函数来使这一点更加明确。父窗口中的那些函数将执行所有数据操作。将您最新的 jsfiddle 的这种修改作为我建议的示例:
关于javascript - 无法使用javascript对window.opener中的对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14760742/