Предотвращение события click правой кнопкой мыши

$(function(){
    $(document).on("contextmenu",function(e){
        e.preventDefault();
    });
});

Если вы хотите придать вашему веб приложению более естественное поведение, возможно вы захотите отменить клик правой кнопки мыши. Когда происходит клик правой кнопкой мыши, браузеры вызывают событие contextmenu и как любое другое событие, вы можете прослушать его и вызвать метод preventDefault(). Вот как это работает:

Сделай свою таблицу стилей редактируемой

<style type="text/css" id="regular-style-block">
    html {
        background-color:#222229;
        position:relative;
    }
    body {
        font:14px/1.3 'Segoe UI', Arial, sans-serif;
        color:#e4e4e9;
        min-height:500px;
    }
</style>

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

Чтобы сделать этот блок видимым и редактируемым, запустите этот код в консоли:

$('#regular-style-block').css({
    'display':'block', 
    'white-space':'pre',
    'background': '#666'})
.attr('contentEditable',true);

Оптимизируйте ваши селекторы

Если вам нужно немного дополнительной производительности, но вы хотите использовать jQuery, вам следует попытаться оптимизировать ваши селекторы. Здесь используются time и timeEnd методы консоли вашего браузера

<div id="peanutButter">
    <div id="jelly" class="jellyTime"></div>
</div>
// Давайте проведем несколько измерений!
var iterations = 10000, i;
console.time('Fancy');
for(i=0; i < iterations; i++){
// Это очень медленный способ обойти элементы DOM
$('#peanutButter div:first');
}
console.timeEnd('Fancy');
console.time('Parent-child');
for(i=0; i < iterations; i++){
// Лучше, но все равно медленно
$('#peanutButter div');
}
console.timeEnd('Parent-child');
console.time('Parent-child by class');
for(i=0; i < iterations; i++){
// Для некоторых браузеров такой подход немного быстрее
$('#peanutButter .jellyTime');
}
console.timeEnd('Parent-child by class');
console.time('By class name');
for(i=0; i < iterations; i++){
// Еще лучше
$('.jellyTime');
}
console.timeEnd('By class name');
console.time('By id');
for(i=0; i < iterations; i++){
// Самый лучший
$('#jelly');
}
console.timeEnd('By id');

Запуск этого примера в современном браузере приведет к примерно следующему результату:

Используйте кэширование

Каждый раз, когда вы создаете новый объект jQuery, передавая селектор элемента, jQuery обходит DOM и связывает этот селектор с реальным элементом страницы. Это довольно медленный процесс в JavaScript, но ситуация меняется в лучшую сторону при использовании современных браузеров, которые поддерживают функцию document.querySelector, возвращающую элементы напрямую связанные с CSS селекторами. К сожалению, проблема остается актуальной в таких браузерах как IE8 и более ранних версиях. Хорошей практикой является повторное использование объектов jQuery, предварительно сохранив их в переменную.

<ul id="pancakes">
    <li>first</li>
    <li>second</li>
    <li>third</li>
    <li>fourth</li>
    <li>fifth</li>
</ul>
// Плохой способ:
    $('#pancakes li').eq(0).remove();
    $('#pancakes li').eq(1).remove();
    $('#pancakes li').eq(2).remove();
// Хороший:
    var pancakes = $('#pancakes li');
    pancakes.eq(0).remove();
    pancakes.eq(1).remove();
    pancakes.eq(2).remove();
// Альтернативный:
    pancakes.eq(0).remove().end()
    .eq(1).remove().end()
    .eq(2).remove().end();

Определяйте повторяющуюся функцию только один раз

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

<button id="menuButton">Show Menu!</button>
<a href="#" id="menuLink">Show Menu!</a>

Js пример 1

// Это приводит к множественному копированию callback-функции в памяти
$('#menuButton, #menuLink').click(function(){
// ...
});

Js пример 2

// Так лучше:
function showMenu(){
alert('Showing menu!');
// Тело слушателя
}
$('#menuButton').click(showMenu);
$('#menuLink').click(showMenu);

Если вы определяете callback-функцию так, как показано в первом примере и jQuery объект содержит больше одного элемента, копии функции сохранятся в памяти для каждого элемента коллекции.

Одиночный вызов обработчика событий

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

var press = $('#press');
// Это метод который сработает только единожды:
press.one('click',function(){
alert('This alert will pop up only once');
});

Внутри себя этот метод вызывает метод on() с 1 в качестве последнего аргумента:


press.on('click',null,null,function(){alert('I am the one and only!');}, 1)

Самый простой Ajax запрос

jQuery предлагает короткий метод для быстрой загрузки контента в элемент при помощи Ajax - метод $.load().

HTML

<p class="content"></p>
<p class="content"></p>

JS

var contentDivs = $('.content');
// Возьмем содержимого текстового файла:
contentDivs.eq(0).load('1.txt');
// Берем содержимое HTML файла и отображаем элемент с id header
contentDivs.eq(1).load('1.html #header');

В отличие от остальных Ajax запросов, тут вы можете указать CSS селектор, который ограничит результат. К тому же данные не возвращаются, а непосредственно заменяют содержимое элемента.

Метод map() 

Другим полезным, но малоизвестным методом библиотеки jQuery, является map(). Он обходит все элементы jQuery объекта и собирает новый массив. Вот, как его использовать:

Which days would you like to work on?
<ul id="week">
    <li><input type="checkbox" value="Monday" class="day" checked /> Monday </li>
    <li><input type="checkbox" value="Tuesday" class="day" checked /> Tuesday </li>
    <li><input type="checkbox" value="Wednesday" class="day" checked />Wednesday </li>
    <li><input type="checkbox" value="Thursday" class="day" checked /> Thursday </li>
    <li><input type="checkbox" value="Friday" class="day" checked /> Friday </li>
    <li><input type="checkbox" value="Saturday" class="day" /> Saturday </li>
    <li><input type="checkbox" value="Sunday" class="day" /> Sunday </li>
</ul>
<p id="workdays"></p>
// Найдем все чекбоксы:
var checkboxes = $('#week .day');
function callback(){
// Обходим все выбранные чекбоксы и выводим их значения
var days = checkboxes.filter(':checked').map(function(){
// Возвращенное значени станет частью нового массива
return $(this).val();
}).get();
$('#workdays').text('You want to work on ' + days.join(', '));
}
checkboxes.on('click',callback);

В этом примере у нас есть семь чекбоксов, символизирующих дни недели. При клике на чекбокс параграф #workdays обновляется и в него записываются те дни, в которые вы хотите работать.

Предотвращение события click правой кнопкой мыши

By ganya

Предотвращение события click правой кнопкой мыши

  • 1