Ðногие ÑобÑÑÐ¸Ñ Ð°Ð²ÑомаÑиÑеÑки влекÑÑ Ð·Ð° Ñобой дейÑÑвие бÑаÑзеÑа.
ÐапÑимеÑ:
- Ðлик по ÑÑÑлке иниÑииÑÑÐµÑ Ð¿ÐµÑÐµÑ Ð¾Ð´ на новÑй URL.
- ÐажаÑие на ÐºÐ½Ð¾Ð¿ÐºÑ Â«Ð¾ÑпÑавиÑÑ» в ÑоÑме â оÑÑÑÐ»ÐºÑ ÐµÑ Ð½Ð° ÑеÑвеÑ.
- ÐажаÑие кнопки мÑÑи над ÑекÑÑом и ÐµÑ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ðµ в Ñаком ÑоÑÑоÑнии â иниÑииÑÑÐµÑ ÐµÐ³Ð¾ вÑделение.
ÐÑли Ð¼Ñ Ð¾Ð±ÑабаÑÑваем ÑобÑÑие в JavaScript, Ñо заÑаÑÑÑÑ Ñакое дейÑÑвие бÑаÑзеÑа нам не нÑжно. Ð ÑÑаÑÑÑÑ, его можно оÑмениÑÑ.
ÐÑмена дейÑÑÐ²Ð¸Ñ Ð±ÑаÑзеÑа
ÐÑÑÑ Ð´Ð²Ð° ÑпоÑоба оÑмениÑÑ Ð´ÐµÐ¹ÑÑвие бÑаÑзеÑа:
- ÐÑновной ÑпоÑоб â ÑÑо воÑполÑзоваÑÑÑÑ Ð¾Ð±ÑекÑом
event. ÐÐ»Ñ Ð¾ÑÐ¼ÐµÐ½Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð±ÑаÑзеÑа ÑÑÑеÑÑвÑÐµÑ ÑÑандаÑÑнÑй меÑодevent.preventDefault(). - ÐÑли же обÑабоÑÑик назнаÑен ÑеÑез
on<ÑобÑÑие>(не ÑеÑезaddEventListener), Ñо Ñакже можно веÑнÑÑÑfalseиз обÑабоÑÑика.
Ð ÑледÑÑÑем пÑимеÑе пÑи клике по ÑÑÑлке пеÑÐµÑ Ð¾Ð´ не пÑоизойдÑÑ:
<a href="/" onclick="return false">Ðажми здеÑÑ</a>
или
<a href="/" onclick="event.preventDefault()">здеÑÑ</a>
false из обÑабоÑÑика â ÑÑо иÑклÑÑениеÐбÑÑно знаÑение, коÑоÑое возвÑаÑÐ°ÐµÑ Ð¾Ð±ÑабоÑÑик ÑобÑÑиÑ, игноÑиÑÑеÑÑÑ.
ÐдинÑÑвенное иÑклÑÑение â ÑÑо return false из обÑабоÑÑика, назнаÑенного ÑеÑез on<ÑобÑÑие>.
РдÑÑгиÑ
ÑлÑÑаÑÑ
return не нÑжен, он никак не обÑабаÑÑваеÑÑÑ.
ÐÑимеÑ: менÑ
РаÑÑмоÑÑим Ð¼ÐµÐ½Ñ Ð´Ð»Ñ ÑайÑа, напÑимеÑ:
<ul id="menu" class="menu">
<li><a href="/html">HTML</a></li>
<li><a href="/javascript">JavaScript</a></li>
<li><a href="/css">CSS</a></li>
</ul>
ÐаннÑй пÑÐ¸Ð¼ÐµÑ Ð¿Ñи помоÑи CSS Ð¼Ð¾Ð¶ÐµÑ Ð²ÑглÑдеÑÑ Ñак:
Ð HTML-ÑазмеÑке вÑе ÑлеменÑÑ Ð¼ÐµÐ½Ñ ÑвлÑÑÑÑÑ Ð½Ðµ кнопками, а ÑÑÑлками, Ñо еÑÑÑ Ñегами <a>. Ð ÑÑом подÑ
оде еÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе пÑеимÑÑеÑÑва, напÑимеÑ:
- ÐекоÑоÑÑе поÑеÑиÑели оÑÐµÐ½Ñ Ð»ÑбÑÑ ÑоÑеÑание «пÑавÑй клик â оÑкÑÑÑÑ Ð² новом окне». ÐÑли Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ
<button>или<span>, Ñо данное ÑоÑеÑание ÑабоÑаÑÑ Ð½Ðµ бÑдеÑ. - ÐоиÑковÑе движки пеÑеÑ
одÑÑ Ð¿Ð¾ ÑÑÑлкам
<a href="...">пÑи индекÑаÑии.
ÐоÑÑÐ¾Ð¼Ñ Ð² ÑазмеÑке Ð¼Ñ Ð¸ÑполÑзÑем <a>. Ðо нам необÑ
одимо обÑабаÑÑваÑÑ ÐºÐ»Ð¸ÐºÐ¸ в JavaScript, а ÑÑандаÑÑное дейÑÑвие бÑаÑзеÑа (пеÑеÑ
од по ÑÑÑлке) â оÑмениÑÑ.
ÐапÑимеÑ, Ð²Ð¾Ñ Ñак:
menu.onclick = function(event) {
if (event.target.nodeName != 'A') return;
let href = event.target.getAttribute('href');
alert( href ); // Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð´Ð³ÑÑзка Ñ ÑеÑвеÑа, генеÑаÑÐ¸Ñ Ð¸Ð½ÑеÑÑейÑа и Ñ.п.
return false; // оÑмениÑÑ Ð´ÐµÐ¹ÑÑвие бÑаÑзеÑа (пеÑеÑ
од по ÑÑÑлке)
};
ÐÑли Ð¼Ñ ÑбеÑÑм return false, Ñо поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑÑика ÑобÑÑÐ¸Ñ Ð±ÑаÑÐ·ÐµÑ Ð²ÑÐ¿Ð¾Ð»Ð½Ð¸Ñ Â«Ð´ÐµÐ¹ÑÑвие по ÑмолÑаниÑ» â пеÑеÑ
од по адÑеÑÑ Ð¸Ð· href. Ð ÑÑо нам здеÑÑ Ð½Ðµ нÑжно, Ð¼Ñ Ð¾Ð±ÑабаÑÑваем клик Ñами.
ÐÑÑаÑи, иÑполÑзование здеÑÑ Ð´ÐµÐ»ÐµÐ³Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑобÑÑий Ð´ÐµÐ»Ð°ÐµÑ Ð½Ð°Ñе Ð¼ÐµÐ½Ñ Ð¾ÑÐµÐ½Ñ Ð³Ð¸Ð±ÐºÐ¸Ð¼. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ добавиÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе ÑпиÑки и ÑÑилизоваÑÑ Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ CSS â обÑабоÑÑик не поÑÑебÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹.
ÐекоÑоÑÑе ÑобÑÑÐ¸Ñ ÐµÑÑеÑÑвеннÑм обÑазом вÑÑекаÑÑ Ð´ÑÑг из дÑÑга. ÐÑли Ð¼Ñ Ð¾Ñменим пеÑвое ÑобÑÑие, Ñо поÑледÑÑÑие не возникнÑÑ.
ÐапÑимеÑ, ÑобÑÑие mousedown Ð´Ð»Ñ Ð¿Ð¾Ð»Ñ <input> пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑокÑÑиÑовке на нÑм и запÑÑÐºÐ°ÐµÑ ÑобÑÑие focus. ÐÑли Ð¼Ñ Ð¾Ñменим ÑобÑÑие mousedown, Ñо ÑокÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ пÑоизойдÑÑ.
Ð ÑледÑÑÑем пÑимеÑе попÑобÑйÑе нажаÑÑ Ð½Ð° пеÑвом <input> â пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑобÑÑие focus. Ðо еÑли Ð²Ñ Ð½Ð°Ð¶Ð¸Ð¼Ð°ÐµÑе по вÑоÑÐ¾Ð¼Ñ ÑлеменÑÑ, Ñо ÑобÑÑÐ¸Ñ focus не бÑдеÑ.
<input value="ФокÑÑ ÑабоÑаеÑ" onfocus="this.value=''">
<input onmousedown="return false" onfocus="this.value=''" value="Ðликни менÑ">
ÐÑо поÑомÑ, ÑÑо оÑменено ÑÑандаÑÑное дейÑÑвие mousedown. ÐпÑоÑем, ÑокÑÑиÑовка на ÑлеменÑе вÑÑ ÐµÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°, еÑли Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð´ÑÑгой ÑпоÑоб. ÐапÑимеÑ, нажаÑием клавиÑи Tab можно пеÑейÑи Ð¾Ñ Ð¿ÐµÑвого Ð¿Ð¾Ð»Ñ Ð²Ð²Ð¾Ð´Ð° ко вÑоÑомÑ. Ðо ÑолÑко не ÑеÑез клик мÑÑÑÑ Ð½Ð° ÑлеменÑ, ÑÑо болÑÑе не ÑабоÑаеÑ.
ÐпÑÐ¸Ñ Â«passive» Ð´Ð»Ñ Ð¾Ð±ÑабоÑÑика
ÐеобÑзаÑелÑÐ½Ð°Ñ Ð¾Ð¿ÑÐ¸Ñ passive: true Ð´Ð»Ñ addEventListener ÑигнализиÑÑÐµÑ Ð±ÑаÑзеÑÑ, ÑÑо обÑабоÑÑик не ÑобиÑаеÑÑÑ Ð²ÑполнÑÑÑ preventDefault().
ÐоÑÐµÐ¼Ñ ÑÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾?
ÐÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑобÑÑиÑ, как touchmove на мобилÑнÑÑ
ÑÑÑÑойÑÑваÑ
(когда полÑзоваÑÐµÐ»Ñ Ð¿ÐµÑемеÑÐ°ÐµÑ Ð¿Ð°Ð»ÐµÑ Ð¿Ð¾ ÑкÑанÑ), коÑоÑое по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ð°ÑÐ¸Ð½Ð°ÐµÑ Ð¿ÑокÑÑÑкÑ, но Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ оÑмениÑÑ ÑÑо дейÑÑвие, иÑполÑзÑÑ preventDefault() в обÑабоÑÑике.
ÐоÑÑомÑ, когда бÑаÑÐ·ÐµÑ Ð¾Ð±Ð½Ð°ÑÑÐ¶Ð¸Ñ Ñакое ÑобÑÑие, он должен Ð´Ð»Ñ Ð½Ð°Ñала запÑÑÑиÑÑ Ð²Ñе обÑабоÑÑики и поÑле, еÑли preventDefault не вÑзÑваеÑÑÑ Ð½Ð¸Ð³Ð´Ðµ, он Ð¼Ð¾Ð¶ÐµÑ Ð½Ð°ÑаÑÑ Ð¿ÑокÑÑÑкÑ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзваÑÑ Ð½ÐµÐ½ÑжнÑе задеÑжки в полÑзоваÑелÑÑком инÑеÑÑейÑе.
ÐпÑÐ¸Ñ passive: true ÑообÑÐ°ÐµÑ Ð±ÑаÑзеÑÑ, ÑÑо обÑабоÑÑик не ÑобиÑаеÑÑÑ Ð¾ÑменÑÑÑ Ð¿ÑокÑÑÑкÑ. Тогда бÑаÑÐ·ÐµÑ Ð½Ð°ÑÐ¸Ð½Ð°ÐµÑ ÐµÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾, обеÑпеÑÐ¸Ð²Ð°Ñ Ð¼Ð°ÐºÑималÑно плавнÑй инÑеÑÑейÑ, паÑаллелÑно обÑабаÑÑÐ²Ð°Ñ ÑобÑÑие.
ÐÐ»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
бÑаÑзеÑов (Firefox, Chrome) опÑÐ¸Ñ passive по ÑмолÑÐ°Ð½Ð¸Ñ Ð²ÐºÐ»ÑÑена в true Ð´Ð»Ñ ÑакиÑ
ÑобÑÑий, как touchstart и touchmove.
event.defaultPrevented
СвойÑÑво event.defaultPrevented ÑÑÑановлено в true, еÑли дейÑÑвие по ÑмолÑÐ°Ð½Ð¸Ñ Ð±Ñло пÑедоÑвÑаÑено, и false, еÑли неÑ.
РаÑÑмоÑÑим пÑакÑиÑеÑкое пÑименение ÑÑого ÑвойÑÑва Ð´Ð»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ Ð°ÑÑ Ð¸ÑекÑÑÑÑ.
ÐомниÑе, в главе ÐÑплÑÑие и погÑÑжение Ð¼Ñ Ð³Ð¾Ð²Ð¾Ñили о event.stopPropagation() и Ñпоминали, ÑÑо оÑÑанавливаÑÑ Â«Ð²ÑплÑÑие» â плоÑ
о?
Ðногда вмеÑÑо ÑÑого Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ event.defaultPrevented, ÑÑÐ¾Ð±Ñ Ð¿ÑоÑигналиÑÑ Ð´ÑÑгим обÑабоÑÑикам, ÑÑо ÑобÑÑие обÑабоÑано.
ÐавайÑе поÑмоÑÑим пÑакÑиÑеÑкий пÑимеÑ.
Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑаÑÐ·ÐµÑ Ð¿Ñи ÑобÑÑии contextmenu (клик пÑавой кнопкой мÑÑи) показÑÐ²Ð°ÐµÑ ÐºÐ¾Ð½ÑекÑÑное Ð¼ÐµÐ½Ñ Ñо ÑÑандаÑÑнÑми опÑиÑми. ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ оÑмениÑÑ ÑобÑÑие по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ показаÑÑ ÑÐ²Ð¾Ñ Ð¼ÐµÐ½Ñ, как здеÑÑ:
<button>ÐÑавÑй клик вÑзÑÐ²Ð°ÐµÑ ÐºÐ¾Ð½ÑекÑÑное Ð¼ÐµÐ½Ñ Ð±ÑаÑзеÑа</button>
<button oncontextmenu="alert('РиÑÑем наÑе менÑ'); return false">
ÐÑавÑй клик вÑзÑÐ²Ð°ÐµÑ Ð½Ð°Ñе конÑекÑÑное менÑ
</button>
ТепеÑÑ Ð² дополнение к ÑÑÐ¾Ð¼Ñ ÐºÐ¾Ð½ÑекÑÑÐ½Ð¾Ð¼Ñ Ð¼ÐµÐ½Ñ ÑеализÑем конÑекÑÑное Ð¼ÐµÐ½Ñ Ð´Ð»Ñ Ð²Ñего докÑменÑа.
ÐÑи пÑавом клике должно показÑваÑÑÑÑ Ð±Ð»Ð¸Ð¶Ð°Ð¹Ñее конÑекÑÑное менÑ.
<p>ÐÑавÑй клик здеÑÑ Ð²ÑзÑÐ²Ð°ÐµÑ ÐºÐ¾Ð½ÑекÑÑное Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа</p>
<button id="elem">ÐÑавÑй клик здеÑÑ Ð²ÑзÑÐ²Ð°ÐµÑ ÐºÐ¾Ð½ÑекÑÑное Ð¼ÐµÐ½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸</button>
<script>
elem.oncontextmenu = function(event) {
event.preventDefault();
alert("ÐонÑекÑÑное Ð¼ÐµÐ½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸");
};
document.oncontextmenu = function(event) {
event.preventDefault();
alert("ÐонÑекÑÑное Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа");
};
</script>
ÐÑоблема заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо когда Ð¼Ñ ÐºÐ»Ð¸ÐºÐ°ÐµÐ¼ по ÑлеменÑÑ elem, Ñо Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем два менÑ: конÑекÑÑное Ð¼ÐµÐ½Ñ Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ и (ÑобÑÑие вÑплÑÐ²Ð°ÐµÑ Ð²Ð²ÐµÑÑ
) конÑекÑÑное Ð¼ÐµÐ½Ñ Ð´Ð»Ñ Ð´Ð¾ÐºÑменÑа.
Ðак ÑÑо попÑавиÑÑ? Ðдно из ÑеÑений â ÑÑо подÑмаÑÑ: «Ðогда Ð¼Ñ Ð¾Ð±ÑабаÑÑваем пÑавÑй клик в обÑабоÑÑике на кнопке, оÑÑановим вÑплÑÑие», и вÑзваÑÑ event.stopPropagation():
<p>ÐÑавÑй клик вÑзÑÐ²Ð°ÐµÑ Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа</p>
<button id="elem">ÐÑавÑй клик вÑзÑÐ²Ð°ÐµÑ Ð¼ÐµÐ½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ (добавлен event.stopPropagation)</button>
<script>
elem.oncontextmenu = function(event) {
event.preventDefault();
event.stopPropagation();
alert("ÐонÑекÑÑное Ð¼ÐµÐ½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸");
};
document.oncontextmenu = function(event) {
event.preventDefault();
alert("ÐонÑекÑÑное Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа");
};
</script>
ТепеÑÑ ÐºÐ¾Ð½ÑекÑÑное Ð¼ÐµÐ½Ñ Ð´Ð»Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ ÑабоÑÐ°ÐµÑ ÐºÐ°Ðº задÑмано. Ðо Ñена ÑлиÑком вÑÑока. ÐÑ Ð½Ð°Ð²Ñегда запÑеÑили доÑÑÑп к инÑоÑмаÑии о пÑавÑÑ ÐºÐ»Ð¸ÐºÐ°Ñ Ð´Ð»Ñ Ð»Ñбого внеÑнего кода, вклÑÑÐ°Ñ ÑÑÑÑÑики, коÑоÑÑе могли Ð±Ñ ÑобиÑаÑÑ ÑÑаÑиÑÑикÑ, и Ñ.п. ÐÑо Ñлегка неÑазÑмно.
ÐлÑÑеÑнаÑивнÑм ÑеÑением бÑло Ð±Ñ Ð¿ÑовеÑиÑÑ Ð² обÑабоÑÑике document, бÑло ли оÑменено дейÑÑвие по ÑмолÑаниÑ? ÐÑли да, Ñогда ÑобÑÑие бÑло обÑабоÑано, и нам не нÑжно на него ÑеагиÑоваÑÑ.
<p>ÐÑавÑй клик вÑзÑÐ²Ð°ÐµÑ Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа (добавлена пÑовеÑка event.defaultPrevented)</p>
<button id="elem">ÐÑавÑй клик вÑзÑÐ²Ð°ÐµÑ Ð¼ÐµÐ½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸</button>
<script>
elem.oncontextmenu = function(event) {
event.preventDefault();
alert("ÐонÑекÑÑное Ð¼ÐµÐ½Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸");
};
document.oncontextmenu = function(event) {
if (event.defaultPrevented) return;
event.preventDefault();
alert("ÐонÑекÑÑное Ð¼ÐµÐ½Ñ Ð´Ð¾ÐºÑменÑа");
};
</script>
СейÑÐ°Ñ Ð²ÑÑ ÑабоÑÐ°ÐµÑ Ð¿ÑавилÑно. ÐÑли Ñ Ð½Ð°Ñ ÐµÑÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе ÑлеменÑÑ Ð¸ каждÑй из ниÑ
Ð¸Ð¼ÐµÐµÑ ÐºÐ¾Ð½ÑекÑÑное менÑ, Ñо код Ñакже бÑÐ´ÐµÑ ÑабоÑаÑÑ. ÐÑоÑÑо ÑбедиÑеÑÑ, ÑÑо пÑовеÑÑеÑе event.defaultPrevented в каждом обÑабоÑÑике contextmenu.
Ðак Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ видеÑÑ, event.stopPropagation() и event.preventDefault() (Ñакже извеÑÑнÑй как return false) â ÑÑо две ÑазнÑе ÑÑнкÑии. Ðни никак не ÑвÑÐ·Ð°Ð½Ñ Ð´ÑÑг Ñ Ð´ÑÑгом.
ÐÑÑÑ Ñакже неÑколÑко алÑÑеÑнаÑивнÑÑ
пÑÑей, ÑÑÐ¾Ð±Ñ ÑеализоваÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе конÑекÑÑнÑе менÑ. Ðдним из ниÑ
ÑвлÑеÑÑÑ ÐµÐ´Ð¸Ð½Ñй глобалÑнÑй обÑÐµÐºÑ Ñ Ð¾Ð±ÑабоÑÑиком document.oncontextmenu и меÑодами, позволÑÑÑими Ñ
ÑаниÑÑ Ð² нÑм дÑÑгие обÑабоÑÑики.
ÐбÑÐµÐºÑ Ð±ÑÐ´ÐµÑ Ð¿ÐµÑÐµÑ Ð²Ð°ÑÑваÑÑ Ð»Ñбой клик пÑавой кнопкой мÑÑи, пÑоÑмаÑÑиваÑÑ ÑÐ¾Ñ ÑанÑннÑе обÑабоÑÑики и запÑÑкаÑÑ ÑооÑвеÑÑÑвÑÑÑий.
Ðо пÑи ÑÑом каждÑй ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ ÐºÐ¾Ð´Ð°, коÑоÑÐ¾Ð¼Ñ ÑÑебÑеÑÑÑ ÐºÐ¾Ð½ÑекÑÑное менÑ, должен знаÑÑ Ð¾Ð± ÑÑом обÑекÑе и иÑполÑзоваÑÑ ÐµÐ³Ð¾ вмеÑÑо ÑобÑÑвенного обÑабоÑÑика contextmenu.
ÐÑого
ÐейÑÑвий бÑаÑзеÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð¾ÑÑаÑоÑно много:
mousedownâ наÑÐ¸Ð½Ð°ÐµÑ Ð²ÑделÑÑÑ ÑекÑÑ (еÑли двигаÑÑ Ð¼ÑÑкой).clickна<input type="checkbox">â ÑÑÐ°Ð²Ð¸Ñ Ð¸Ð»Ð¸ ÑбиÑÐ°ÐµÑ Ð³Ð°Ð»Ð¾ÑÐºÑ Ð²input.submitâ пÑи нажаÑии на<input type="submit">или пÑи нажаÑии клавиÑи Enter в ÑоÑме даннÑе оÑпÑавлÑÑÑÑÑ Ð½Ð° ÑеÑвеÑ.keydownâ пÑи нажаÑии клавиÑи в поле ввода поÑвлÑеÑÑÑ Ñимвол.contextmenuâ пÑи пÑавом клике показÑваеÑÑÑ ÐºÐ¾Ð½ÑекÑÑное Ð¼ÐµÐ½Ñ Ð±ÑаÑзеÑа.- â¦Ð¸ многие дÑÑгиеâ¦
ÐÑе ÑÑи дейÑÑÐ²Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ оÑмениÑÑ, еÑли Ð¼Ñ Ñ Ð¾Ñим обÑабоÑаÑÑ ÑобÑÑие иÑклÑÑиÑелÑно пÑи помоÑи JavaScript.
ЧÑÐ¾Ð±Ñ Ð¾ÑмениÑÑ Ð´ÐµÐ¹ÑÑвие бÑаÑзеÑа по ÑмолÑаниÑ, иÑполÑзÑйÑе event.preventDefault() или return false. ÐÑоÑой меÑод ÑабоÑаеÑ, ÑолÑко еÑли обÑабоÑÑик назнаÑен ÑеÑез on<ÑобÑÑие>.
ÐпÑÐ¸Ñ passive: true Ð´Ð»Ñ addEventListener ÑообÑÐ°ÐµÑ Ð±ÑаÑзеÑÑ, ÑÑо дейÑÑвие по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¾Ñменено. ÐÑо оÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
ÑобÑÑий на мобилÑнÑÑ
ÑÑÑÑойÑÑваÑ
, ÑакиÑ
как touchstart и touchmove, ÑÑÐ¾Ð±Ñ ÑообÑиÑÑ Ð±ÑаÑзеÑÑ, ÑÑо он не должен ожидаÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÑеÑ
обÑабоÑÑиков, а ÐµÐ¼Ñ ÑледÑÐµÑ ÑÑÐ°Ð·Ñ Ð¿ÑиÑÑÑпаÑÑ Ðº вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ, напÑимеÑ, к пÑокÑÑÑке.
ÐÑли ÑобÑÑие по ÑмолÑÐ°Ð½Ð¸Ñ Ð¾Ñменено, Ñо знаÑение event.defaultPrevented ÑÑановиÑÑÑ true, инаÑе false.
ТеÑ
ниÑеÑки, оÑменÑÑ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð±ÑаÑзеÑа по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ добавлÑÑ JavaScript, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ наÑÑÑоиÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ лÑбого ÑлеменÑа. ÐапÑимеÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ заÑÑавиÑÑ ÑÑÑÐ»ÐºÑ <a> ÑабоÑаÑÑ ÐºÐ°Ðº кнопкÑ, а ÐºÐ½Ð¾Ð¿ÐºÑ <button> веÑÑи ÑÐµÐ±Ñ ÐºÐ°Ðº ÑÑÑлка (пеÑенапÑавлÑÑÑ Ð½Ð° дÑÑгой URL).
Ðо нам ÑледÑÐµÑ ÑоÑ
ÑанÑÑÑ ÑеманÑиÑеÑкое знаÑение HTML ÑлеменÑов. ÐапÑимеÑ, не кнопки, а Ñег <a> должен пÑименÑÑÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑеÑ
одов по ÑÑÑлкам.
Ðомимо Ñого, ÑÑо ÑÑо Â«Ñ Ð¾ÑоÑо», ÑÑо Ð´ÐµÐ»Ð°ÐµÑ Ð²Ð°Ñ HTML лÑÑÑе Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ Ð´Ð¾ÑÑÑпноÑÑи Ð´Ð»Ñ Ð»Ñдей Ñ Ð¾Ð³ÑаниÑеннÑми возможноÑÑÑми и Ñ Ð¾ÑобÑÑ ÑÑÑÑойÑÑв.
Также, еÑли Ð¼Ñ ÑаÑÑмаÑÑиваем пÑÐ¸Ð¼ÐµÑ Ñ Ñегом <a>, Ñо обÑаÑиÑе внимание: бÑаÑÐ·ÐµÑ Ð¿ÑедоÑÑавлÑÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð¾ÑкÑÑваÑÑ ÑÑÑлки в новом окне (ÐºÐ»Ð¸ÐºÐ°Ñ Ð¿Ñавой кнопкой мÑÑи или иÑполÑзÑÑ Ð´ÑÑгие возможноÑÑи). РполÑзоваÑелÑм ÑÑо нÑавиÑÑÑ. Ðо еÑли Ð¼Ñ Ð·Ð°Ð¼ÐµÐ½Ð¸Ð¼ ÑÑÑÐ»ÐºÑ ÐºÐ½Ð¾Ð¿ÐºÐ¾Ð¹ и ÑÑилизÑем ÐµÑ ÐºÐ°Ðº ÑÑÑлкÑ, иÑполÑзÑÑ CSS, Ñо ÑпеÑиÑиÑнÑе ÑÑнкÑии бÑаÑзеÑа Ð´Ð»Ñ Ñега <a> вÑÑ Ñавно ÑабоÑаÑÑ Ð½Ðµ бÑдÑÑ.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)