发明内容
针对现有技术中的缺陷,本发明提供了一种多窗口组件间通信的方法及装置,实现了多窗口环境下多组件间的信息传递,进而实现了基于多窗口的多线程JavaScript协同工作,并最终解决了由于单线程JavaScript执行与UI渲染互相阻塞而造成的前端性能问题。
第一方面,本发明提供一种多窗口组件间通信的装置,包括:
获取模块,用于在接收到第一窗口的第一消息事件时,根据所述第一消息事件,获取所述第一消息事件对应的触发对象,以及所述触发对象的操作指令,所述触发对象为一个以上第二窗口的至少一个组件;
发布模块,用于向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作。
可选的,所述装置还包括:
第一接收模块,用于在第一窗口发布第一消息事件时,接收所述第一窗口的第一消息事件。
可选的,所述装置还包括:
第二接收模块,用于接收一个以上第二窗口的组件订阅的第二消息事件;
所述发布模块,具体用于:
在所述触发对象与所述第二消息事件对应的所述一个以上第二窗口的组件一致时,向所述一个以上第二窗口的组件发布所述操作指令。
可选的,所述装置还包括:
窗口标识符添加模块,用于为所述第一窗口和一个以上第二窗口添加窗口标识符,所述一个以上第二窗口通过所述窗口标识符订阅所述第二消息事件,
和/或,
所述获取模块,具体用于:
在接收到第一窗口的第一消息事件时,获取所述第一窗口对应的触发对象的窗口标识符;
所述发布模块,具体用于:
根据所述窗口标识符向与所述窗口标识符对应的触发对象发布所述操作指令。
可选的,所述装置还包括:
存储模块,用于存储所述第一消息事件,
所述存储模块,具体用于:
在所述发布模块发布所述操作指令之后,在所述第一窗口或一个以上的第二窗口关闭时,将所述第一窗口或一个以上的第二窗口的组件的状态进行保存,以使所述第一窗口或一个以上的第二窗口的组件被打开时,显示所述第一窗口或一个以上的第二窗口的组件保存的最终状态。
可选的,所述第一消息事件或所述第二消息事件包括下述的至少一种:
配置窗口属性的事件、触控事件、命令事件。
第二方面,本发明还提供了一种多窗口组件间通信的方法,包括:
在接收到第一窗口的第一消息事件时,根据所述第一消息事件,获取所述第一消息事件对应的触发对象,以及所述触发对象的操作指令,所述触发对象为一个以上第二窗口的至少一个组件;
向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作。
可选的,所述方法还包括:
在第一窗口发布第一消息事件时,接收所述第一窗口的第一消息事件。
可选的,所述方法还包括:
接收一个以上第二窗口的组件订阅的第二消息事件;
相应地,向所述触发对象发布所述操作指令,包括:
在所述触发对象与所述第二消息事件对应的所述一个以上第二窗口的组件一致时,向所述一个以上第二窗口的组件发布所述操作指令。
可选的,所述方法还包括:
为所述第一窗口和一个以上第二窗口添加窗口标识符,所述一个以上第二窗口通过所述窗口标识符订阅所述第二消息事件,
和/或,
在接收到第一窗口的第一消息事件时,获取所述第一窗口对应的触发对象的窗口标识符,
相应地,向所述触发对象发布所述操作指令,包括:
根据所述窗口标识符向与所述窗口标识符对应的触发对象发布所述操作指令。
可选的,所述方法还包括:
存储所述第一消息事件,
相应的,在向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作之后,所述方法还包括:
当所述第一窗口或一个以上的第二窗口关闭时,将所述第一窗口或一个以上的第二窗口的组件的状态进行保存,以使所述第一窗口或一个以上的第二窗口的组件被打开时,显示所述第一窗口或一个以上的第二窗口的组件保存的最终状态。
可选的,所述第一消息事件或所述第二消息事件包括下述的至少 一种:
配置窗口属性的事件、触控事件、命令事件。
由上述技术方案可知,本发明提供的一种多窗口组件间通信的方法及装置,该方法通过在接收到第一窗口的第一消息事件,获取该第一消息事件对应的触发对象,以及该触发对象的操作指令,并向该触发对象发布操作指令,使该触发对象对应的第二窗口的组件执行该操作指令对应的操作,该方法实现了多窗口组件之间信息的有效传递,提升了用户的体验。
具体实施方式
下面结合附图,对发明的具体实施方式作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本发明的保护范围。
为了解决在同一个浏览器窗口显示多个组件,JavaScript的执行与UI渲染相互阻塞的问题,本发明采用创建多个完整而又独立的UI线程进行分工合作,其中每个线程负责整个应用程序的一部分工作,从此解决了在同一个浏览器窗口显示多个组件,JavaScript的执行与UI渲染相互阻塞的问题。
基于上述思想本申请采用了在浏览器中为每一个窗口开启一个独立的UI线程,此外,每一个窗口又有一个独立的JavaScript执行环境,该环境下的JavaScript拥有完整的页面操作能力。因此,通过开启多个窗口,并且在这些窗口中运行同一个应用程序实现了多线程处理。但是上述方法还需要一套完成的通信机制来保证数据在多个窗口内的组件间有效传递。本发明实施例以在浏览器本地进行多窗口的组件间的通信为例进行详细说明。
图1示出了本发明实施例提供的多窗口组件间通信的方法的流程示意图,如图1所示,该多窗口组件间通信的方法包括如下步骤:
101、在接收到第一窗口的第一消息事件时,根据所述第一消息事件,获取所述第一消息事件对应的触发对象,以及所述触发对象的操作指令,所述触发对象为一个以上第二窗口的至少一个组件。
举例来说,本发明实施例提供的多窗口组件间的通信应用的客户端为现有的触摸型电子设备,当然也可以为其他非触摸型电子设备,本发明对此不作限制。
可理解的是,上述第一窗口可以理解为发布消息事件的窗口,一个以上第二窗口为订阅该消息事件的窗口。
在上述第一消息事件中可以获知该消息事件对应的触发对象和该触发对象的操作指令,其中,触发对象可以理解为订阅该消息事件的窗口的组件,订阅该消息事件的窗口可以为一个或多个,每个窗口的组件且至少为一个。
所述触发对象的操作指令可以理解为配置窗口属性、触控、命令 等操作,例如,配置窗口的属性可以包括配置窗口尺寸的大小、位置及更新频率等,触控操作可以包括滑动执行下一步的操作、锁屏、解锁、暂停、播放等操作,命令可以包括通过语音等方式,使得窗口识别该语音,以执行相应的操作。
102、向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作。
举例来说,若上述一个以上的第二窗口均订阅了上述消息事件,则步骤102中的触发对象为所有窗口,并通过获得的该消息事件的操作指令,向所有窗口发布,使得所有窗口均按照该操作指令执行对应的操作。
例如各个窗口根据消息事件的操作指令执行配置窗口属性、触控、命令等操作。
图2示出了本发明实施例提供的多窗口组件间通信的方法的流程示意图,如图2所示,该多窗口组件间通信的方法包括如下步骤:
201、接收一个以上第二窗口的组件订阅的第二消息事件;
上述第二窗口的组件可以理解为所有窗口的组件也可以为一个或一个以上窗口的组件。
在具体应用中,上述窗口的组件的通信媒介可以为服务器也可以为浏览器本地存储订阅和发布消息事件,还可以是其他方式存储订阅和发布的消息事件,但是由于在服务器端多窗口的组件间的通信依赖于网络,且通信速度上也不如在浏览器本地进行通信,因此,本发明实施例以在浏览器本地进行多窗口的组件间的通信为例进行详细说明,但是本发明实施例采取的是一个优选的方式,并不限定本发明多窗口组件间的通信媒介。
以通信媒介在浏览器本地为例,上述第二窗口的组件向浏览器本地订阅第二消息事件,该消息事件包括配置窗口属性的事件、触控事件、命令事件。例如,该消息事件为配置窗口属性的事件时,可以理 解为在其他有任一窗口有配置窗口属性的操作时,则该订阅该消息事件的窗口也会进行实时的配置窗口属性的操作;该消息事件为触控事件例如锁屏事件时,则可以理解为在其他有任一窗口有触控事件时,则订阅该消息事件的窗口也会实时的进行锁屏的操作等。
在另一个可实现的方式中,第二窗口的组件在订阅第二消息事件之前,所有窗口都会添加窗口标识符,并通过所述窗口标识符订阅所述第二消息事件。
如图3A所示的第二窗口的组件订阅的第二消息事件的示意图,该C1和C2为窗口1的组件,S1和S2为窗口2的组件,T1为窗口3的组件,假如窗口1中的组件C1为发布消息事件的组件,C2、S1、S2、T1分别为订阅消息事件的组件,由于C1和C2为同一窗口内的组件,C2可以直接向C1订阅消息事件,对于S1和S2为窗口2的组件,T1为窗口3的组件,S1、S2、T1不能直接向C1订阅消息事件,则S1、S2、T1需要向各自窗口的代理发布者直接订阅消息事件。上述C1、C2、S1、S2、T1组件可以理解为实现某一个功能而定义的,例如导航菜单、搜索栏、新闻列表等,本发明实施例不对上述组件进行限定。
202、在第一窗口发布第一消息事件时,接收所述第一窗口的第一消息事件。
可理解的是,在第一窗口发布第一消息事件之前,也会在该窗口添加窗口标识符,在发布第一消息事件时,携带有该窗口标示符。
具体的,上述窗口的组件的通信媒介实时的接收第一窗口的第一消息事件,该第一消息事件可以理解为某窗口触发某种操作的消息事件。
203、在接收到第一窗口的第一消息事件时,根据所述第一消息事件,获取所述第一消息事件对应的触发对象,以及所述触发对象的操作指令,所述触发对象为一个以上第二窗口的至少一个组件。
举例来说,假如上述窗口的组件的通信媒介接收的第一消息事件 时,获取该第一消息事件的对应的触发对象即窗口标示符和该触发对象对应的操作指令。
上述触发对象为订阅该消息事件其他窗口的组件,上述操作指令为触发订阅该消息事件其他窗口的组件执行相应的操作。
可理解的是,上述触发对象可以为同一浏览器同一客户端的多个窗口之间的组件通信,例如第一个窗口执行了锁屏的操作,则其他订阅该消息事件的窗口也会相应的执行该锁屏操作。
上述多个窗口的组件间的通信不限于是在同一窗口内的组件还是不同窗口内的组件间的通信。需要说明的是,若是位于同一窗口内的组件间的通信,则不需要通信媒介的传输,直接该窗口内的组件间进行消息事件的订阅和发布完成同一窗口内不同组件间的通信;若是不同窗口内的组件间的通信,由于浏览器内的各个窗口的JavaScript执行环境之间是相互独立的,不能直接进行通信,因此需要通过上述通信媒介进行通信,实现不同窗口组件间的数据传递。
需要说明的是,为了实现多线程即多窗口之间的协作,需要为每个窗口添加窗口标示符,该窗口标示符可以在程序中通过设置一个字段作为其ID,为了防止该ID被误改写导致依赖于该窗口间的通信机制就会瘫痪,无法进行正常的通信,故在设置该ID时将其属性设置为只读。
204、向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作。
具体的,在向所述触发对象发布所述操作指令之前,在所述触发对象与所述第二消息事件对应的所述一个以上第二窗口的组件一致时,向所述一个以上第二窗口的组件发布所述操作指令。
可理解的是,通信媒介在接收到第一窗口的第一消息事件时,获取所述第一窗口对应的触发对象的窗口标识符,根据所述窗口标识符向与所述窗口标识符对应的触发对象发布所述操作指令。
上述通信媒介中存储有一个以上的第二窗口订阅的第二消息事件,在上述第一消息事件的操作指令和订阅的第二消息事件一致时,或当上述第一消息事件对应的触发对象与订阅的第二消息事件的窗口标示符一致时,则向订阅第二消息事件的窗口的组件发布所述操作指令。
本实施例不限定上述步骤的顺序,只是一个最佳的实施方式,比如上述步骤202中接收第一窗口的第一消息事件之后,存储该第一窗口的第一消息事件,然后再执行上述步骤210接收一个以上第二窗口的组件订阅的第二消息事件,当该一个以上第二窗口的组件订阅的第二消息事件与存储的第一窗口发布的第一消息事件对应时,则向一个以上的第二窗口的组件发布该第一消息事件,以使第二窗口的组件执行与第一消息事件中的操作指令相应的操作。
如图3B所示的第一窗口的组件发布第一消息事件的示意图,当窗口1的组件C1发布消息事件时,不能对窗口1之外的其他窗口的组件进行直接发送,故需要上述通信媒介接收窗口1的组件C1发布的消息事件。该通信媒介即浏览器本地会存储该第一消息事件,而上述步骤201中的代理发布者会实时的捕获存储在通信媒介中的消息事件,当代理发布者检测到该通信媒介中的消息事件为该代理发布者所对应的窗口中的组件订阅的消息事件时,则直接获取存储在通信媒介中的消息事件,并将该消息事件发布给对应的组件。
图4A至图4D示出了基于触控事件实现各个窗口组件之间的通信的示意图。
图4A为多窗口页面锁定前的示意图,假设窗口2和窗口3向每个窗口对应的代理发布者订阅了触控事件,用户在窗口1向下滑动,根据设置,规定该向下滑动的操作指令为锁定页面或取消锁定页面,且该操作状态的触控对象为所有窗口的所有组件,由于所有窗口原先均处于未锁定的状态,所以根据该用户在窗口1向下滑动的操作,通信 媒介会接收窗口1发布的触控事件,而此时,代理发布者检测到该触控事件之后,获取在通信媒介存储的窗口1发布的触控事件,以使该窗口2和窗口3在窗口1发布该触控事件之后,也会实时的执行相应的操作,图4B为多窗口页面锁定后的示意图,即所有的窗口的页面均处于锁定状态。
类似的,如图4C所示,为多窗口页面取消锁定前的示意图,用户通过在窗口1执行向下滑动的操作,通信媒介会接收窗口1发布的触控事件,而此时,代理发布者检测到该触控事件之后,获取在通信媒介存储的窗口1发布的触控事件,以使该窗口2和窗口3在窗口1发布该触控事件之后,也会实时的执行相应的操作,由于原来所有窗口均处于锁定状态,故根据窗口1发布的触控事件之后,所有窗口均执行了取消锁定的操作,图4D为多窗口页面取消锁定后的示意图,即所有的窗口的页面均处于未锁定状态。
在具体应用中,上述方法还包括图2中未示出的步骤205。
本发明实施例不限于上述多窗口组件之间的通信方式,在另一个可能实现的方式中,上述位于同一浏览器同一窗口之间的通信也使用,但是少了上述通信媒介,同一窗口的两个组件间可以直接进行通信。
205、在上述步骤在向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作之后,当所述第一窗口或一个以上的第二窗口关闭时,将所述第一窗口或一个以上的第二窗口的组件的状态进行保存,以使所述第一窗口或一个以上的第二窗口的组件被打开时,显示所述第一窗口或一个以上的第二窗口的组件保存的最终状态。
图4A为多窗口页面锁定前的示意图,如图4B为多窗口页面锁定后的示意图,及图4B为执行触控操作指令操作之后的示意图,在图4B的多个窗口关闭之后,再重新打开时,仍然为图4B的状态,而不会保持图4A的状态。
图5示出了本发明实施例提供的一种多窗口组件间通信的装置的结构示意图,如图5所示,该多窗口组件间通信的装置包括:获取模块51和发布模块52。
获取模块51,用于在接收到第一窗口的第一消息事件时,根据所述第一消息事件,获取所述第一消息事件对应的触发对象,以及所述触发对象的操作指令,所述触发对象为一个以上第二窗口的至少一个组件;
发布模块52,用于向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作。
在具体应用中,所述装置还包括图5中未示出的:第一接收模块53、存储模块54和第二接收模块55。
第一接收模块53,用于在第一窗口发布第一消息事件时,接收所述第一窗口的第一消息事件。
存储模块54,用于存储所述第一消息事件。
第二接收模块55,用于接收一个以上第二窗口的组件订阅的第二消息事件。
上述第一消息事件或所述第二消息事件包括下述的至少一种:
配置窗口属性的事件、触控事件、命令事件。
在一个可实现的方式中,所述发布模块52,具体用于:
在获取所述第一消息事件对应的触发对象与订阅第二消息事件对应的所述一个以上第二窗口的组件一致时,向所述一个以上第二窗口的组件发布第一消息事件对应的操作指令。
为了防止窗口之间的通信被瘫痪,所述装置还包括图5中未示出的:窗口标识符添加模块56。
窗口标识符添加模块56,用于为所述第一窗口和一个以上第二窗口添加窗口标识符,所述一个以上第二窗口通过所述窗口标识符订阅所述第二消息事件,
所述获取模块51,具体用于:
在接收到第一窗口的第一消息事件时,获取所述第一窗口对应的触发对象的窗口标识符;
所述发布模块52,具体用于:
根据所述窗口标识符向与所述窗口标识符对应的触发对象发布所述操作指令。
在所述发布模块发布所述操作指令之后,在所述第一窗口或一个以上的第二窗口关闭时,将所述第一窗口或一个以上的第二窗口的组件的状态进行保存,以使再次打开所述第一窗口或一个以上的第二窗口的组件时,显示存储后的所述第一窗口或一个以上的第二窗口的组件的状态。
上述装置与上述方法是一一对应的,上述方法的详细例子说明也同样适用于该装置,本发明不对上述装置的实施细节进行详细说明。
本发明实施例还公开了:
A1、一种多窗口组件间通信的装置,包括:
获取模块,用于在接收到第一窗口的第一消息事件时,根据所述第一消息事件,获取所述第一消息事件对应的触发对象,以及所述触发对象的操作指令,所述触发对象为一个以上第二窗口的至少一个组件;
发布模块,用于向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作。
A2、根据A1所述的装置,所述装置还包括:
第一接收模块,用于在第一窗口发布第一消息事件时,接收所述第一窗口的第一消息事件。
A3、根据A2所述的装置,所述装置还包括:
第二接收模块,用于接收一个以上第二窗口的组件订阅的第二消息事件;
所述发布模块,具体用于:
在所述触发对象与所述第二消息事件对应的所述一个以上第二窗口的组件一致时,向所述一个以上第二窗口的组件发布所述操作指令。
A4、根据A3所述的装置,所述装置还包括:
窗口标识符添加模块,用于为所述第一窗口和一个以上第二窗口添加窗口标识符,所述一个以上第二窗口通过所述窗口标识符订阅所述第二消息事件,
和/或,
所述获取模块,具体用于:
在接收到第一窗口的第一消息事件时,获取所述第一窗口对应的触发对象的窗口标识符;
所述发布模块,具体用于:
根据所述窗口标识符向与所述窗口标识符对应的触发对象发布所述操作指令。
A5、根据A1所述的装置,所述装置还包括:
存储模块,用于存储所述第一消息事件,
所述存储模块,具体用于:
在所述发布模块发布所述操作指令之后,在所述第一窗口或一个以上的第二窗口关闭时,将所述第一窗口或一个以上的第二窗口的组件的状态进行保存,以使所述第一窗口或一个以上的第二窗口的组件被打开时,显示所述第一窗口或一个以上的第二窗口的组件保存的最终状态。
A6、根据A1至A5中任一项所述的装置,所述第一消息事件或所述第二消息事件包括下述的至少一种:
配置窗口属性的事件、触控事件、命令事件。
B7、一种多窗口组件间通信的方法,包括:
在接收到第一窗口的第一消息事件时,根据所述第一消息事件,获取所述第一消息事件对应的触发对象,以及所述触发对象的操作指令,所述触发对象为一个以上第二窗口的至少一个组件;
向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作。
B8、根据B7所述的方法,所述方法还包括:
在第一窗口发布第一消息事件时,接收所述第一窗口的第一消息事件。
B9、根据B8所述的方法,所述方法还包括:
接收一个以上第二窗口的组件订阅的第二消息事件;
相应地,向所述触发对象发布所述操作指令,包括:
在所述触发对象与所述第二消息事件对应的所述一个以上第二窗口的组件一致时,向所述一个以上第二窗口的组件发布所述操作指令。
B10、根据B9所述的方法,所述方法还包括:
为所述第一窗口和一个以上第二窗口添加窗口标识符,所述一个以上第二窗口通过所述窗口标识符订阅所述第二消息事件,
和/或,
在接收到第一窗口的第一消息事件时,获取所述第一窗口对应的触发对象的窗口标识符,
相应地,向所述触发对象发布所述操作指令,包括:
根据所述窗口标识符向与所述窗口标识符对应的触发对象发布所述操作指令。
B11、根据B7所述的方法,所述方法还包括:
存储所述第一消息事件,
相应的,在向所述触发对象发布所述操作指令,以使所述触发对象执行所述操作指令对应的操作之后,所述方法还包括:
当所述第一窗口或一个以上的第二窗口关闭时,将所述第一窗口或一个以上的第二窗口的组件的状态进行保存,以使所述第一窗口或一个以上的第二窗口的组件被打开时,显示所述第一窗口或一个以上的第二窗口的组件保存的最终状态。
B12、根据B7至B11中任一项所述的方法,所述第一消息事件或所述第二消息事件包括下述的至少一种:
配置窗口属性的事件、触控事件、命令事件。