0

jqueryを使用して小さなWebクライアントアプリケーションを開発しています

セッションの最初のページのアプリには、ajax リクエストをトリガーし、新しいタブ (ページ内) で受信したデータを表示し、コールバックを介してイベント ハンドラーを設定するアプリ メニューのみが含まれます。

ユーザーが複数のタブを開いている場合、フォーカスされていないタブは $(tab).detach() を使用して DOM から切り離され、返されたオブジェクトはタブがフォーカスを取り戻すまで配列に格納されます (オブジェクトはその後DOM に追加します)。

デタッチの魔法は、返されたオブジェクトに、すべての 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 を使用しています)?

どんな助けも非常に感謝していますので、感謝します(すべてのコールバックを追跡してそれらを思い出すという考えは非常に憂鬱です-そしてデタッチの魔法を役に立たなくします)

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 を使用してイベント ハンドラーにバインドされた関数にアクセスする

しかし、それが答えの核心です。セッションストア/ローカルストアに保存するためにシリアル化できるのは、プレーンオブジェクト(関数も循環参照もイベントハンドラーもありません)のみです。

したがって、デタッチの魔法は、残念ながら webstorage では起​​こりません。

于 2013-02-08T05:19:28.253 に答える