setActive
関数はハンドラーのスコープ内で定義されます$(document).ready
。関数をその関数の外に移動して、グローバルスコープ内に配置します。
現在、次のようになっています。
$(document).ready(function()
{
// ...
function setActive(new_conversation)
{
// ...
}
});
次に、これを次のように変更します。
$(document).ready(function()
{
// ...
});
function setActive(new_conversation)
{
// ...
}
ただし、実際には、コンテンツをインタラクションから分離し、それらのイベントハンドラーをスクリプト自体にバインドする必要があります。何かのようなもの:
// Refers to the last clicked conversation *button*
// Initialize to empty jQuery object
var $active_conversation = $([]);
// Binding on #chat, targeting click events on .conversation_button children
$("#chat").on("click", ".conversation_button", function() {
// Hide currently active conversation
$active_conversation.hide();
$active_conversation.siblings('.conversation_button').removeClass("selected");
// Set as currently active conversation button
// Note: this refers to the clicked <div class="conversation_button">
var $this = $(this);
$active_conversation = $this.siblings('.conversation');
// Show this conversation
$active_conversation.show();
$this.removeClass("alert").addClass("selected");
});
このアプローチのいくつかの利点:
- 会話ごとに異なるクラスは必要ありません。実際の会話DOM要素を(jQueryオブジェクトとして)に格納することにより、
$active_conversation
余分な処理を行うことなく会話を識別できます。
conversation
新しいイベントハンドラーを割り当てずに、リストアイテム全体を追加および削除できます。上記のサンプルでは、すべての 要素のイベントハンドラーが.conversation_button
のレベルで定義されています#chat
。このバインディングメカニズムの詳細については、.on
(または.delegate
1.7より前の)を読んでください。
ここで、更新されたフィドルを持っています!:-)