JQuery: Как включить клики в зоне страницы (отключение отдыха) - PullRequest
0 голосов
/ 12 ноября 2010

Я хотел бы сделать учебник на странице, поэтому моя идея состоит в том, чтобы создать какую-то «маску», которая отключит всю страницу и включит просто «невидимое» поле, где находятся вещи (ссылки и другие элементы страницы ) работает.

Это похоже на "озоновую дыру", где работают ссылки и прочее, но если вы нажмете где-нибудь еще на странице, щелчок будет "захвачен" и ничего не делать.

jQuery(".tutorial_holes").click(function(){ 
     xxxxx 
});
jQuery(document).click( function() { return false; } });

Я начинаю работать с этим ... но я не знаю, что добавить в "xxxx", чтобы сказать "оставь эту область работать".

Также я попытался с наложением 100% с z-index: 10000 и над ним (z-index: 10001) создать «дыру» ... но я также не знаю, как сказать javascript, чтобы разрешать клики в этом область нижней исходной страницы ...

Надеюсь, я объяснил себе:)

Решения, такие как диалог или добавление классов «отключить» к элементам, не будут работать:

a) Диалог создает поле над страницей, в котором вы можете «играть» ... Что я хочу, это как раз наоборот, создать поле НА СТРАНИЦЕ, где вы можете играть, отключив остальные

b) Добавление «#disable» или аналогичных решений к элементам для их отключения после сумасшествия. У меня есть тонны других плагинов jquery и поведения. Мне нужно много изменить каждую страницу. Что мне нужно, так это ненавязчивое решение «поверх» всего моего кода

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 12 ноября 2010

Вы можете использовать диалоговый плагин jQuery, входящий в состав jQueryUI, который является самым простым и быстрым способом достижения нужной вам функции.Проверьте это.

http://jqueryui.com/demos/dialog/

0 голосов
/ 30 января 2015

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

По сути, есть дваразличные способы решения этой проблемы, которые соответствуют вашим критериям (которые тоже были моими!).Оба они являются гибкими для типов элементов (они работают не только с элементами).

(для обоих этих решений предположим, что класс working-links применяется к любым элементам контейнера, которые вы хотитеиметь функциональные ссылки внутри. Имейте в виду, что, хотя оба эти примера основаны на использовании document в качестве целевого контейнера для предотвращения работы ссылок, обычно более целесообразно, чтобы цель была чем-то более изысканным, напримернезависимо от того, что окружает основную область содержимого страницы)


Первое - это отключить все щелчковые действия по умолчанию в документе, а затем (по существу) повторно включить их в соответствующем контейнере.

На практике это работает так, что обработчик событий применяется к самому объекту документа (или к любому элементу, содержащему все, что необходимо предотвратить - что было бы лучше, чтобы меню сайта и т. Д. По-прежнему работали без изменений).События всплывают вверх: вам не нужен обработчик событий для каждой ссылки, вам нужен только один в документе, чтобы перехватывать любые щелчки по ссылкам.

Мы можем воспользоваться этим поведением, чтобы прикрепить другой обработчик событий к любомуконтейнеры, в которых мы хотим, чтобы клики работали (скажем, с классом working-links), что предотвращает распространение события click до обработчика, прикрепленного к объекту документа.

$(document).on("click", function(event) {
  event.preventDefault();
});

$(".working-links").on("click", function(event) {
  event.stopPropagation();  
});

Пример ссопровождающий HTML-код на codepen.io

Обратите внимание, что я предоставил их, используя on() вместо click(), поскольку он позволяет легко изменить их на делегированные события, если вы нацеливаетесь на что-то другое, кромевесь документ и может иметь больше целевых областей, вставляемых динамически (AJAX / и т. д.).Это имеет значение только в том случае, если вы решили связать событие более избирательно: на уровне документа любые изменения внутри него не имеют значения и будут по-прежнему фиксироваться привязкой события, поскольку они все равно будут всплывать должным образом.

Это может иметь большее значение для события working-links: вам потребуется , чтобы соответствующим образом изменить это, чтобы добавить селектор в on(), если вы динамически добавляете больше на страницу после того, как этоbound.

Если вы попытались присоединить обработчик, а затем выборочно удалить его из соответствующим образом классифицированного элемента, или если вы пытались присоединить обработчик только к элементам, которые не имели класса (с помощью селектора CSS :not илиограничивая выбор jquery с помощью .not()), это поведение пузыри было причиной того, что оно не работало.Даже если вы не прикрепите event.preventDefault() к ссылкам или их контейнерам, если он присоединится к любому из их предков, он будет пузыриться на них, и действие все равно будет предотвращено.


Другойметод состоит в том, чтобы применить обработчик события click к элементу document / main container, а затем применить логику, зависящую от event.target.

. Это довольно просто, но, возможно, не так элегантно.

Мы собираемся просто захватить все события щелчка в документе (или в любом другом контейнере, который вы выбрали для таргетинга) и выяснить, заключен ли event.target в один из наших исключающих элементов.Самый простой способ сделать это, вероятно, использовать функцию is() в jquery.

Следует иметь в виду, что вам нужно будет проверять не только, находится ли event.target в наборе элементов, совпадающем сселектор класса, но также и все дочерние элементы селектора класса: в противном случае любые элементы , вложенные вне непосредственных дочерних элементов, не будут работать.

$(document).on("click", function(event) {

  if (! $(event.target).is($(".working-links, .working-links *").children())) {
    event.preventDefault();    
  }

});

Пример с сопровождающим HTML-кодом на codepen.io

С другой стороны, этот метод не требует каких-либо изменений для функционирования на динамической странице, по крайней мере, для добавления working-links классифицированных элементов. Если вы добавляете больше контейнеров без щелчков, то, очевидно, его необходимо соответствующим образом адаптировать для использования режима делегирования вызовов on() (см. Соответствующую документацию jQuery по привязке событий).

С другой стороны, это будет использовать немного больше ресурсов для обработчика событий (чтобы вычислять элемент jQuery, установленный при каждом запуске), чем другой метод. Нам, вероятно, наплевать в большинстве случаев, но это не так уж и плохо.

0 голосов
/ 12 ноября 2010

Используйте event.preventDefault(), вот пример

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html><head>
</head>
<body>
<div id="disabled">
   <a href="http://www.example.com">foo</a>
   <form action="http://www.example.com">
        <input type="submit" value="" name="" />
   </form>
</div>
<script type='text/javascript' src='http://code.jquery.com/jquery-latest.min.js'></script>
<script>
$(document).ready(function(){
    $("#disabled a, #disabled input").click(function(event){
        event.preventDefault();
    });
});
</script>
</body></html>
...