2011-01-06 12 views
0

カスタムドロップダウンリストを作成しました。 HTMLのselectタグのように機能するようにしたい。ドロップダウンリストの外をクリックすると、削除されます。しかし、私はそれに問題があります。以下のコードは動作しており、ドロップダウンリスト(optionContainer)を前方に移動するボタンをクリックするたびにコンパイルされます。クリックした外のイベントでカスタム作成したドロップダウンリストを削除

var optionContainer = document.createElement('div'); 
optionContainer.className = 'optionContainer'; 
button.appendChild(optionContainer); 

var clickOutsideEvent = function(){ 
    $(optionContainer).remove(); 
}; 

$(optionContainer).mouseout(function(){ 
    $(document).delegate('body','click', clickOutsideEvent); 
}); 

$(optionContainer).mouseover(function(){ 
    $(document).undelegate('body', 'click', clickOutsideEvent);   
}); 

しかし、完成させるためにもう1行のコードを追加する必要があります。以下のコード行は、上記の最後の行の後に追加されます。

$(document).delegate('body','click', clickOutsideEvent); 

このコード行は、mouseoutイベントで使用されているのとまったく同じ行です。しかし、この行は機能しません。

+0

「動作しない」とはどういう意味ですか?それはイベントハンドラを追加しませんか? – Guss

+0

$(document).ready呼び出しの最後の行を折り返しましたか?それでjQueryが読み込まれると実行されますか? –

+0

@Guss:javascript error。 optionContainerを作成した後に私が行を追加すると、その下の行はコンパイルされません。 – einstein

答えて

0

$(document).ready呼び出しで最後の行を折り返しましたか?それでjQueryがロードされたときに実行されますか?

$(document).ready(function() { 
    $(document).delegate('body','click', clickOutsideEvent); 
}); 
+0

申し訳ありませんが間違いました。実際にテスト中にmouseoutイベントが発生しました。だから問題は残っている – einstein

+0

本当に変だ!私はdocument.readyイベントのためだけに使用することはできませんが、他のものはどれも大丈夫です ' – einstein

+0

今、私は何が起こったかを考え出しました。実際にはブラウザはドロップダウンリストを表示しませんでした。なぜなら、ボタンをクリックしてドロップダウンリストを前方に移動すると、body要素に割り当てられたclickイベントがトリガーされたと考えられるからです。つまり、optionContainer削除されます。ブラウザは効果的に構築されているので(それを記述するための言葉を見つけることはできません)、ドロップダウンリストは決してレンダリングされません。解決策は、タイムアウト機能を設定することです。 – einstein

関連する問題