天天看点

使用js callback机制实现调用页面局部刷新

    需求描述:审批表单页面由我的待办工作中打开,办理完毕后希望关闭该页面并且实现我待办表格的实时刷新;同时该需求也同样适用于从某些工作流管理模块中需要发起审批的情况,比如招聘需求模块中发起录用流程;我的绩效管理中审批绩效等。

    我们先来看看之前的实现,该逻辑实现的功能是,从我待办列表中发起审批,审批结束后直接在当前页面,也就是审批页面跳转至一个新的oa主页面,并且打开我的工作-我待办的页签,实现方法如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>$(</code><code>"#but_back"</code><code>).bind(</code><code>"click"</code><code>, </code><code>function</code><code>() {</code>

<code>        </code><code>window.top.opener=</code><code>null</code><code>;</code>

<code>        </code><code>var</code> <code>url = window.location.href;</code>

<code>        </code><code>var</code> <code>isoa=url.indexOf(</code><code>'phicomm.com'</code><code>);</code>

<code>        </code><code>//var isoatest=url.indexOf('oatest.phicomm.com');</code>

<code>        </code><code>var</code> <code>curWwwPath=window.document.location.href; </code>

<code>        </code><code>var</code> <code>pathName=window.document.location.pathname; </code>

<code>        </code><code>var</code> <code>pos=curWwwPath.indexOf(pathName); </code>

<code>        </code><code>var</code> <code>localhostPaht=curWwwPath.substring(0,pos); </code>

<code>        </code><code>var</code> <code>projectName=pathName.substring(0,pathName.substr(1).indexOf(</code><code>'/'</code><code>)+1);</code>

<code>        </code><code>if</code><code>(isoa&gt;0){</code>

<code>            </code><code>window.top.open(localhostPaht+</code><code>'/main/index.action?tableName=mywork'</code><code>,</code><code>'_self'</code><code>);</code>

<code>        </code><code>}</code><code>else</code><code>{</code>

<code>            </code><code>window.top.open(localhostPaht+projectName+</code><code>'/main/index.action?tableName=mywork'</code><code>,</code><code>'_self'</code><code>);</code>

<code>        </code><code>}</code>

<code>    </code><code>});</code>

  桌面js的处理逻辑:

17

18

19

20

21

22

23

<code> </code><code>$(document).ready(</code><code>function</code><code>($){</code>

<code>     </code><code>// 初始化图标</code>

<code>     </code><code>initModules(initMenus());</code>

<code>     </code> 

<code>     </code><code>refixAppPos();</code>

<code>     </code><code>// 注册事件</code>

<code>     </code><code>regClick();</code>

<code>     </code><code>sortable();</code>

<code>    </code><code>initIcoRemove();</code>

<code>     </code><code>initAppManager();</code>

<code>     </code><code>//解析当前URL判断是否需要跳转制定Table</code>

<code>     </code><code>gotoTable();</code>

<code> </code><code>});</code>

<code> </code> 

<code> </code><code>//跳转制定Table</code>

<code> </code><code>function</code> <code>gotoTable(){</code>

<code>     </code><code>var</code> <code>tableName = request(</code><code>"tableName"</code><code>);</code>

<code>     </code><code>if</code><code>(</code><code>""</code><code>!=tableName&amp;&amp;</code><code>null</code><code>!=tableName&amp;&amp;</code><code>'undefined'</code><code>!=tableName){</code>

<code>         </code><code>openUrl($(</code><code>"#desktop_content_icon_"</code><code>+tableName));</code>

<code>     </code><code>}</code>

<code> </code><code>}</code>

  以上方法虽然实现了办理结束后跳至我的待办的功能,但有以下缺陷:

跳转是在新页面中,并非在调用页面,这样就形成了调用和跳转页面两个相同的桌面;

新的页面并非与原调用页面完全一致,调用页面如打开多个页签,新打开的页面相当于将除我的待办外的其他页签关闭,并不符合用户的需求;

用户体验不友好

  我们使用js callback的实现如下,当前页面的调用页面非空且未关闭时,我们就直接调用页面中的js方法实现其局部的刷新。

24

25

26

27

28

<code>/** 刷新父窗口关闭弹出窗口 */</code>

<code>    </code><code>function</code> <code>refreshAndClose(){</code>

<code>        </code><code>var</code> <code>jscallback = $.trim($(</code><code>"#jscallback"</code><code>).val());</code>

<code>        </code><code>var</code> <code>type = $.trim($(</code><code>"#type"</code><code>).val());</code>

<code>        </code><code>if</code> <code>(window.opener  &amp;&amp; !window.opener.closed &amp;&amp; jscallback!=</code><code>null</code> <code>&amp;&amp; jscallback!=</code><code>""</code><code>) {</code>

<code>            </code><code>if</code><code>(!type){</code>

<code>                </code><code>//本页面的调用页面执行其嵌入或调用的js方法</code>

<code>                </code><code>eval(</code><code>"window.opener."</code><code>+jscallback+</code><code>"();"</code><code>);</code>

<code>            </code><code>}</code>

<code>            </code><code>window.close();</code><code>//当前页面关闭</code>

<code>        </code><code>} </code><code>else</code> <code>{</code>

<code>            </code><code>window.top.opener=</code><code>null</code><code>;</code>

<code>            </code><code>var</code> <code>url = window.location.href;</code>

<code>            </code><code>var</code> <code>isoa=url.indexOf(</code><code>'phicomm.com'</code><code>);</code>

<code>            </code> 

<code>            </code><code>var</code> <code>curWwwPath=window.document.location.href; </code>

<code>            </code><code>var</code> <code>pathName=window.document.location.pathname; </code>

<code>            </code><code>var</code> <code>pos=curWwwPath.indexOf(pathName); </code>

<code>            </code><code>var</code> <code>localhostPaht=curWwwPath.substring(0,pos); </code>

<code>            </code><code>var</code> <code>projectName=pathName.substring(0,pathName.substr(1).indexOf(</code><code>'/'</code><code>)+1);</code>

<code>            </code><code>if</code><code>(isoa&gt;0){</code>

<code>                </code> 

<code>                </code><code>window.top.open(localhostPaht+</code><code>'/main/index.action?tableName=mywork'</code><code>,</code><code>'_self'</code><code>);</code>

<code>            </code><code>}</code><code>else</code><code>{</code>

<code>                </code><code>window.top.open(localhostPaht+projectName+</code><code>'/main/index.action?tableName=mywork'</code><code>,</code><code>'_self'</code><code>);</code>

<code>    </code><code>}</code>

  调用页面js:grid即为需要局部刷新的表格。

<code>function</code> <code>openUrl(url){</code>

<code>    </code><code>url=url+</code><code>"&amp;jscallback=callsus"</code>

<code>         </code><code>window.open(url,</code><code>'_blank'</code><code>);   </code>

<code>}</code>

<code>function</code> <code>callsus(){</code>

<code>    </code><code>$(</code><code>'#performanceDataGrid'</code><code>).reload();</code>

  通过js callback实现了调用页面的局部刷新,并对其他应用的类似功能具有一定的指导和参考意义。

     本文转自 gaochaojs 51CTO博客,原文链接:http://blog.51cto.com/jncumter/1623739,如需转载请自行联系原作者

继续阅读