设计一个“弹出窗口”接口自动更新-甚至可能


Designing a "pop-out" interface that automatically updates - even possible?

所以我开发了这个web应用程序,它在一个管理页面上有几个多个选择框——每个选择框包含多个值,我们称之为标准。

这些框中的条件在另一个页面上的表单上生成,并单独存储在数据库中的另一个表中。最大的问题是,我的老板希望有一个新的标准编辑页面弹出在一个新的窗口,或同一浏览器的不同选项卡,允许用户添加一个或多个标准,并有这些更新在主管理浏览器的实时窗口。

现在,如果它在同一个窗口中,我立即想到AJAX。然而,因为它将在两个独立的浏览器窗口中,我不认为这是一个可行的解决方案。

无论如何(除了某种形式的COM编程或其他OS-y方法,我不想进入)传递两个浏览器窗口之间的值,而不必重新加载主页?这是一个关键的问题——在这个过程中,主页不能被重新加载。

将框架的答案(从而摆脱双浏览器窗口的问题,没有两个窗口)?别的吗?这超出了我的经验范围。

可能的解决方案:

    框架(可能是最简单的,也适用于旧浏览器)
  1. Comet(模拟JavaScript推送通知)
  2. Mootools Request.Periodical
  3. 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是对原窗口中窗口对象的引用。根据同域安全策略,您将能够"跨界"调用函数