2013-09-03 2 views
3

Как я могу отменить все события кликов в документе HTML?Как отменить все события кликов в документе в JQuery

У меня есть Webapp, где может возникнуть ситуация, когда пользователь должен принять сообщение, прежде чем продолжать. Идея состоит в том, что сообщение появляется, и когда пользователь щелкает в другом месте, сообщение мигает или пытается привлечь внимание пользователя.

Это приложение предназначено для использования администрациями, использующими IE 8 и выше + современные браузеры, поэтому я надеялся на решение jquery.

На данный момент, я попробовал:

удалось раствор 1

$(document).bind('click', function(event){ 
      event.stopImmediatePropagation(); 
      $('.alertbox').effect('shake'); 
      return false; 
     }); 

надеясь вернуть ложные или распространение стоп событие будет остановить щелчок, но я узнал, что событие пузыри вверх от Dom элемент в документ, поэтому элемент dom в любом случае запускает клик.

удалось раствор 2

Я нашел решение в чистом JS:

document.addEventListener('click', function(e) { 
    e.stopPropagation(); 
}, true); 

используя верно в качестве третьего аргумента свяжут слушателя в фазе захвата и выполнять функции, прежде чем что-либо еще запускается на выполнение, но это не очень хорошо работает в IE.

удался раствором 3

Использования DIV, охватывающий весь документ, то это может быть решением для других людей, но не в этом точном сценарии, так как сообщение об ошибке (должно быть кликабельны) сидит в сложной структуре (все движется, и css сохраняет все на своем месте). Перемещение этого элемента поверх покрытия div, чтобы сделать его единственным доступным для решения решением, является хорошим решением, но не в этом случае.

Мне не обязательно нужно решение для получения события предварительного пузыря в IE (хотя это было бы хорошо). Если бы я мог найти трюк или обходной путь, я мог бы жить с ним. Есть идеи?

рабочим раствора 3

Я закончил с использованием неисправного раствора 3 и добавил поддельные хит зоны, представляющую границы в сообщении. Я не проверяю правильную границу, потому что сообщения всегда касаются правой стороны окна браузера.

$('#screencurtain').click(function(event) 
{ 
    event.stopImmediatePropagation(); 
    if(event.clientX > $('#messages').offset().left && event.clientY > $('#messages').offset().top && event.clientY < $('#messages').offset().top + $('#messages').height()) 
    { 
     $('#screencurtain').hide(); 
     $('#messages').click(); 
    } 
    else 
    { 
     $('.alertbox').effect('pulsate'); 
    } 
}); 
+5

Поместите прозрачный элемент на весь документ. –

+0

Но тогда как я могу обнаружить, что пользователь нажимает на сообщение? Нажатие на сообщение - вот что заставляет эту ситуацию решить проблему и снова использовать приложение. –

+1

Поместите сообщение в элемент, который находится поверх прозрачного элемента. Хорошим примером этого является диалоговое окно jQuery UI, использующее «модальный: истинный». –

ответ

2

Вы можете поместить прозрачный DIV, охватывающий весь экран

var screenWidth = $(window).width(), screenHeight = $(window).height(); 

$("<div>").width(screenWidth).height(screenHeight).css({ 
    zIndex : 100000 
}).appendTo("body"); 

//Disables scrolling if exists 
$("html, body").css({ 'overflow' : '100%', 'height' : '100%' }); 
+0

вот идея комментариев комментариев, но я не могу переместить интерактивный div поверх этого нового. –

+0

@VincentDuprez Вы можете временно переместить сообщение 'div' сверху, а затем вернуть его обратно в исходное положение, когда пользователь покидает сообщение. – Teemu

+0

Просто увеличьте свойство z-index для clickable div до 100001. Таким образом, интерактивный div будет находиться поверх прозрачного div –

0

Может быть, это может помочь вам больше: -

$(function() { 

$('div').click(function() { 
    alert('div1'); 
}); 

document.addEventListener('click', function(e) { 
    alert('document'); 
    e.stopPropagation(); 
}, true); 

$('div').click(function() { 
    alert('div2'); 
}); 

}); 

http://jsfiddle.net/wLwMh/381/

+0

Вот что я пробовал, но несовместимо с IE –

+0

@ VincentDuprez Вам просто нужно немного изменить его, чтобы он работал с помощью jQuery. – Archer

0

Я думаю, что вы хотите посмотри на .выкл() http://api.jquery.com/off/

если у вас есть что-то с событием щелчка, как это:

$("#selector").on('click', function(){ 
    //do something here 
}); 

в любой момент вы можете сделать это и удалить обработчик щелчка:

$("#selector").off('click'); 

или удалить все события из селектора, например, щелчок мыши, мышь, зависание и т. д. просто оставьте .off blank следующим образом:

$("#selector").off(); 

Таким образом вы можете удалить события клика из определенных элементов, а затем снова включить их, когда это необходимо.

+1

Для полноты: '$ ('*'). Off ('click')' отвяжет его от все элементы, если вы не уверены, какие элементы имеют ограниченные события. Может быть довольно медленным в больших DOM, хотя, поэтому используйте на свой страх и риск. –

+0

@ RenéWolferink Это не будет обрабатывать ссылки. Вам действительно нужно сделать обратное, и захватить события щелчка для всего и использовать 'preventDefault()', чтобы остановить что-нибудь происходит :) – Archer

+0

Точно так же, как сказал Арчер, я удалю метод off после того, как блок будет удален, чтобы удалить document click handler. (если я использую обработчик кликов документа ...) –

0

У вас почти было это с вашей первой попыткой. Попробуйте это ...

$(document).on("click", "*", function(event){ 
    event.stopImmediatePropagation(); 
    event.preventDefault(); 
    $('.alertbox').effect('shake'); 
}); 

Настоящая проблема возникает, когда вы хотите, чтобы потом снова щелкнуть вещи.

+0

интересно, я попробую его –

+0

Извините, другие действия по нажатию элементов по-прежнему запускаются. –

Смежные вопросы