1

これについてはどうすればよいかわかりませんが、基本的には、またはのいずれかのツールチップを削除するツールチッププラグインを作成しましmouseoutmousedown

mousedownイベントがトリガーされると、問題のないものが削除され、ツールチップが削除されますが$that.parent()、ユーザーがマウスアウトイベントもトリガーすると(mouseoverおよびmouseoutイベントが現在チェーンされているため)、別のDOM要素が削除されます。私はしたくないです。だから本質的に私はこれが可能かどうか疑問に思っています:

$that.on('mouseover', function() {

    // If this event is triggered within the mouseover event, don't run the chained mouseout event
    $that.on('mousedown', function() {
        $that.parent().next().fadeOut(100).remove();
        return false;
    });
}).mouseout(function() {
  // If they clicked above, don't run this
    $that.parent().next().fadeOut(100).remove();
});​

私の知る限り、グローバル変数を使用しないと、そのイベントclicked内のブールセットにアクセスするのは困難です。例:mousedown

$that.on('mouseover', function() {
    clicked = false;
    // If this event is triggered within the mouseover event, don't run the chained mouseout event
    $that.on('mousedown', function() {
        clicked = true;
        $that.parent().next().fadeOut(100).remove();
        return false;
    });
}).mouseout(function() {
    // If they clicked above, don't run this
    if (clicked) {
        $that.parent().next().fadeOut(100).remove();
    }
});​

これをエレガントに構築する方法について何か考えはありますか?

編集:の要素$that.parent().next()はただ<div class="js-tooltip"><span>Tooltip text</span></div>

ただし、グローバル変数を使用せずにトリガーされたmouseover場合にその関数から戻ることができるかどうかを知りたいので、これは関係ありません。mousedown

4

2 に答える 2

1

は必要ありませんmouseover

$that.on('mouseleave mouseup', function(e) {
     if( e.type === 'mouseleave'){
         // do the mouseleave stuff
     }else{
         // do the mouseup stuff
     }
});​

あなたが言ったように、要素が動的に作成される場合は、以下を使用する必要があります。

$(document).on('mouseleave mouseup', $that, function(e) {

于 2012-05-02T20:32:16.403 に答える
0

このようなクラスフィルターを単純に使用することを検討しましたか?

$that.parent().next('.js-tooltip').fadeOut(100).remove();

次がツールチップでなければ、これは何もしません。私が理解している限り、これで問題は解決するはずです。

提案された方法を使用すると、実行する方が明確になります$that.clicked = false

または、どうでしょうか(マウスオーバーを維持したい場合は、これは原則を示すためだけのものです。このように機能するかどうかはわかりません)。

$that.on('mouseover', function() {

    // If this event is triggered within the mouseover event, don't run the chained mouseout event
    $that.on('mousedown mouseout', function() {
        $that.parent().next().fadeOut(100).remove();
        $that.off('mousedown mouseout'); //prevent that happening again
        return false;
    });
});
于 2012-05-02T20:35:31.757 に答える