0

我正在使用 jquery 开发一个小型 Web 客户端应用程序

会话第一页的应用程序仅包含触发 ajax 请求的应用程序菜单,显示在新选项卡(页面内)中接收到的数据并通过回调设置事件处理程序。

当用户打开了多个选项卡时,使用 $(tab).detach() 将未聚焦的选项卡从 DOM 中分离出来,并且返回的对象存储在一个数组中,直到选项卡重新获得焦点(对象然后追加回 DOM)。

detach 的魔力在于返回的对象包含所有事件处理程序绑定到其中的所有 html 元素(所以当我们将它附加回来时,我们不必重新绑定任何东西)这是伟大和快速的,除了我无法设法序列化该对象(并存储它以恢复用户在网站的不同页面上浏览时打开的选项卡)。我可以找到 html,但事件处理程序...?

$panels.panel[el]=$("#"+el).detach();

alert(itobj($panels.panel[el]));  //->  key: 0 value: [object HTMLDivElement]
alert($panels.panel[el].html());  //-> return the innerhtml

sessionStorage.setItem(el,$.toJSON($panels.panel[el]));

alert(sessionStorage.getItem(el));  //-> {"length":1,"0":{},"context":{"jQuery17204145571568968498":1,"location":{}},"selector":"#panelid"}

那么会话如何恢复这些事件处理程序呢?它与上下文有什么关系吗?还是有更好的序列化方法(一直使用来自:http ://code.google.com/p/jquery-json/ 的 toJSON )?

非常感谢任何帮助,所以感谢 tun(跟踪所有回调以召回它们的想法非常令人沮丧 - 并且使分离的魔力变得无用)

4

1 回答 1

0

访问事件处理程序属性

 var elem = $('#someid')[0];

 var data = jQuery.hasData( elem ) && jQuery._data( elem );

 console.log(data.events);    //-> {"click":[{"type":"click","origType":"click","data":{"length":1,"0":{"jQuery17207324459496430933":45},"context":{"jQuery17207324459496430933":1,"location":{}},"selector":"#pnl_ctbuilder_1"},"guid":25,"selector":".panel_close a","quick":null,"namespace":""}]}

使用 jQuery 访问绑定到事件处理程序的函数

但这就是答案的核心:只有普通对象(没有函数也没有循环引用,没有事件处理程序)可以序列化以保存在 sessionstore/localstore

因此,不幸的是,分离的魔力不会发生在 webstorage 上。

于 2013-02-08T05:19:28.253 回答