所以我开发了这个web应用程序,它在一个管理页面上有几个多个选择框——每个选择框包含多个值,我们称之为标准。
这些框中的条件在另一个页面上的表单上生成,并单独存储在数据库中的另一个表中。最大的问题是,我的老板希望有一个新的标准编辑页面弹出在一个新的窗口,或同一浏览器的不同选项卡,允许用户添加一个或多个标准,并有这些更新在主管理浏览器的实时窗口。
现在,如果它在同一个窗口中,我立即想到AJAX。然而,因为它将在两个独立的浏览器窗口中,我不认为这是一个可行的解决方案。
无论如何(除了某种形式的COM编程或其他OS-y方法,我不想进入)传递两个浏览器窗口之间的值,而不必重新加载主页?这是一个关键的问题——在这个过程中,主页不能被重新加载。
将框架的答案(从而摆脱双浏览器窗口的问题,没有两个窗口)?别的吗?这超出了我的经验范围。
可能的解决方案:
- 框架(可能是最简单的,也适用于旧浏览器)
- Comet(模拟JavaScript推送通知)
- Mootools
Request.Periodical
- HTML5 Web Sockets("最好的",但只适用于最新的浏览器)
嗯,你也许可以看看fsockopen(),看看php套接字解决方案在这种情况下是否有用,但这可能不是必要的,因为套接字的技能水平-在我看来-比在新框架中运行一个基本的ajax请求来检查表单是否在过去5秒内发生了变化要高得多。
您可以在数据库中创建一个表来表示用户的表单,并将当前值与每次更新时生成的令牌一起存储在该表中。这样,当您弹出应该实时更新的新屏幕时,还可以发送表单id和第一个令牌。然后,该窗口每5秒进行一次基本的ajax调用,以查看自上次调用以来该表单id的令牌是否已更改。如果是,则返回一个json对象,其中包含所需的所有信息,并相应地进行更新。否则,返回false,不做任何操作。
这只是一种可能性。这可能是很多不必要的db调用,但话又说回来,我不知道这个请求的目的,所以我不知道这个解决方案相对于你的需求有多荒谬。
我偶然发现了localstorage (DOM存储)API用于跨窗口共享消息的用法。我不知道你需要发送多少数据,还有一些兼容性问题(IE的支持从IE8开始,其他浏览器现在对某些版本有很好的支持)。基本上,每个页面都有一个"onstorage"事件处理程序集,因此对一个窗口中的存储的修改(添加、删除、修改/更新)也会触发另一个窗口中的事件。当然,这仅限于同一个原点。从您描述的需求来看,这听起来可能是一个有效的解决方案。
一旦你使用
打开一个窗口var new_window = window.open(...);
则new_window
是对新窗口中窗口对象的引用,而新窗口中window.opener
是对原窗口中窗口对象的引用。根据同域安全策略,您将能够"跨界"调用函数