Отмена события щелчка в обработчике события mouseup - PullRequest
26 голосов
/ 27 декабря 2011

При написании кода перетаскивания, я хотел бы отменить события нажатия в моем обработчике мышки. Я подумал, что предотвращение дефолта должно сработать, но событие click все еще происходит.

Есть ли способ сделать это?


Это не работает:

<div id="test">test</div>
<script>
$("#test").mouseup (function (e) {
  var a = 1;
  e.preventDefault();
});
$("#test").click (function (e) {
  var a = 2;
});

Ответы [ 14 ]

0 голосов
/ 31 декабря 2011

Возможно, но я не уверен, что вы можете справиться с такого рода управлением evt с помощью jQuery. Этот пример кода не должен быть далеко от ваших ожиданий или, по крайней мере, указывать вам направление.

function AddEvent(id, evt_type, ma_fonction, phase) {
    var oElt = document.getElementById(id);
    // modèle W3C mode bubbling
    if( oElt.addEventListener ) {
        oElt.addEventListener(evt_type, ma_fonction, phase);
    // modèle MSIE
    } else if( oElt.attachEvent ) {
        oElt.attachEvent('on'+evt_type, ma_fonction);
    }
    return false;
}

function DelEvent(id, evt_type, ma_fonction, phase) {
    var oElt = document.getElementById(id);
    // modèle W3C mode bubbling
    if( oElt.removeEventListener ) {
        oElt.removeEventListener(evt_type, ma_fonction, phase);
    // modèle MSIE
    } else if( oElt.detachEvent ) {
        oElt.detachEvent('on'+evt_type, ma_fonction);
    }
    return false;
}

    var mon_id = 'test';
    var le_type_evt = "mouseup";
    var flux_evt = false; // prevent bubbling
    var action_du_gestionnaire = function(e) {
        alert('evt mouseup on tag <div>');

        // 1ère méthode : DOM Lev 2
        // W3C
            if ( e.target )
                e.target.removeEventListener(le_type_evt, arguments.callee, flux_evt);
        // MSIE
            else if ( e.srcElement )
                e.srcElement.detachEvent('on'+le_type_evt, arguments.callee);

        // 2ème méthode DOM Lev2
        // DelEvent(mon_id, le_type_evt, action_du_gestionnaire, flux_evt);
    };


    AddEvent(mon_id, le_type_evt, action_du_gestionnaire, flux_evt);
0 голосов
/ 28 декабря 2011

Если вы хотите подавить событие click, добавьте оператор event.preventDefault () только в обработчик события click, а не обработчик события mouseup. Используйте приведенный ниже код, и вы получите его на работу.

<div id="test">test</div>
<script>
$("#test").mouseup (function (e) {
  var a = 1;

});
$("#test").click (function (e) {
 e.preventDefault();
  var a = 2;
});

Надеюсь, это решит вашу проблему.

0 голосов
/ 27 декабря 2011
$(document).mouseup(function(event){

    event.preventDefault(); // this prevents only a default action but previously assigned listeners will be called
    event.stopImmediatePropagation() // if there are  others listeners which that shouldn't call 
}
0 голосов
/ 27 декабря 2011
$(document).mouseup(function(event){ // make sure to set the event parameter
    event.preventDefault(); // prevent default, like you said
});

Важно отметить параметр event.

РЕДАКТИРОВАТЬ: Вы хотите отменить перетаскивание?

Как я знаю, чтобыДля этого нужно либо использовать bind() (для более старых версий jQuery), либо on() (для jQuery 1.7+), чтобы присоединить событие mousedown, а затем использовать unbind() или off() соответственно, чтобы отсоединить его.*

...