许å¤äºä»¶ä¼èªå¨è§¦åæµè§å¨æ§è¡æäºè¡ä¸ºã
ä¾å¦ï¼
- ç¹å»ä¸ä¸ªé¾æ¥ ââ 触å导èªï¼navigationï¼å°è¯¥ URLã
- ç¹å»è¡¨åçæäº¤æé® ââ 触åæäº¤å°æå¡å¨çè¡ä¸ºã
- 卿æ¬ä¸æä¸é¼ æ æé®å¹¶ç§»å¨ ââ é䏿æ¬ã
妿æä»¬ä½¿ç¨ JavaScript å¤çä¸ä¸ªäºä»¶ï¼é£ä¹æä»¬é常ä¸å¸æåçç¸åºçæµè§å¨è¡ä¸ºãèæ¯æ³è¦å®ç°å ¶ä»è¡ä¸ºè¿è¡æ¿ä»£ã
黿¢æµè§å¨è¡ä¸º
æä¸¤ç§æ¹å¼æ¥åè¯æµè§å¨æä»¬ä¸å¸æå®æ§è¡é»è®¤è¡ä¸ºï¼
- 主æµçæ¹å¼æ¯ä½¿ç¨
event对象ãæä¸ä¸ªevent.preventDefault()æ¹æ³ã - 妿å¤çç¨åºæ¯ä½¿ç¨
on<event>ï¼è䏿¯addEventListenerï¼åé çï¼é£è¿åfalseä¹åæ ·ææã
å¨ä¸é¢è¿ä¸ªç¤ºä¾ä¸ï¼ç¹å»é¾æ¥ä¸ä¼è§¦å导èªï¼navigationï¼ï¼æµè§å¨ä¸ä¼æ§è¡ä»»ä½æä½ï¼
<a href="/" onclick="return false">Click here</a>
or
<a href="/" onclick="event.preventDefault()">here</a>
å¨ä¸ä¸ä¸ªç¤ºä¾ä¸ï¼æä»¬å°ä½¿ç¨æ¤ææ¯æ¥å建 JavaScript 驱å¨çèåã
false æ¯ä¸ä¸ªä¾å¤äºä»¶å¤çç¨åºè¿åçå¼é常ä¼è¢«å¿½ç¥ã
å¯ä¸çä¾å¤æ¯ä»ä½¿ç¨ on<event> åé
çå¤çç¨åºä¸è¿åç return falseã
卿æå
¶ä»æ
åµä¸ï¼return å¼é½ä¼è¢«å¿½ç¥ãå¹¶ä¸ï¼è¿å true 没ææä¹ã
示ä¾ï¼èå
èèä¸ä¸ªç½ç«èåï¼å¦ä¸æç¤ºï¼
<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>ãè¿æ ·åæå 个åå ï¼ä¾å¦ï¼
- 许å¤äººå欢使ç¨âå³é®åå»â ââ âå¨ä¸ä¸ªæ°çªå£æå¼é¾æ¥âã妿æä»¬ä½¿ç¨
<button>æ<span>ï¼è¿ä¸ªææå°±æ æ³å®ç°ã - æç´¢å¼æå¨å»ºç«ç´¢å¼æ¶éµå¾ª
<a href="...">龿¥ã
æä»¥æä»¬å¨æ è®°ï¼markupï¼ä¸ä½¿ç¨äº <a>ãä½é常æä»¬æç®å¤ç JavaScript ä¸çç¹å»ãå æ¤ï¼æä»¬åºè¯¥é»æ¢æµè§å¨é»è®¤è¡ä¸ºã
åè¿æ ·ï¼
menu.onclick = function(event) {
if (event.target.nodeName != 'A') return;
let href = event.target.getAttribute('href');
alert( href ); // ...å¯ä»¥ä»æå¡å¨å è½½ï¼UI çæç
return false; // 黿¢æµè§å¨è¡ä¸ºï¼ä¸åå¾è®¿é® URLï¼
};
妿æä»¬çç¥ return falseï¼é£ä¹å¨æä»¬çä»£ç æ§è¡å®æ¯åï¼æµè§å¨å°æ§è¡å®çâé»è®¤è¡ä¸ºâ ââ 导èªè³å¨ href ä¸ç URLã
顺便说ä¸å¥ï¼è¿é使ç¨äºä»¶å§æä¼ä½¿æä»¬çèåæ´çµæ´»ãæä»¬å¯ä»¥æ·»å åµå¥åè¡¨å¹¶ä½¿ç¨ CSS å¯¹å ¶è¿è¡æ ·å¼è®¾ç½®æ¥å®ç° âslide downâ çææã
æäºäºä»¶ä¼ç¸äºè½¬åã妿æä»¬é»æ¢äºç¬¬ä¸ä¸ªäºä»¶ï¼é£å°±æ²¡æç¬¬äºä¸ªäºä»¶äºã
ä¾å¦ï¼å¨ <input> åæ®µä¸ç mousedown ä¼å¯¼è´å¨å
¶ä¸è·å¾ç¦ç¹ï¼ä»¥å focus äºä»¶ã妿æä»¬é»æ¢ mousedown äºä»¶ï¼å¨è¿å°±æ²¡æç¦ç¹äºã
å°è¯ç¹å»ä¸é¢ç第ä¸ä¸ª <input> ââ ä¼åç focus äºä»¶ã使¯å¦æä½ ç¹å»ç¬¬äºä¸ªï¼å没æèç¦ã
<input value="Focus works" onfocus="this.value=''">
<input onmousedown="return false" onfocus="this.value=''" value="Click me">
è¿æ¯å 为æµè§å¨è¡ä¸ºå¨ mousedown ä¸è¢«åæ¶ã妿æä»¬ç¨å¦ä¸ç§æ¹å¼è¿è¡è¾å
¥ï¼åä»ç¶å¯ä»¥è¿è¡èç¦ãä¾å¦ï¼å¯ä»¥ä½¿ç¨ Tab é®ä»ç¬¬ä¸ä¸ªè¾å
¥åæ¢å°ç¬¬äºä¸ªè¾å
¥ãä½é¼ æ ç¹å»åä¸è¡ã
å¤çç¨åºé项 âpassiveâ
addEventListener çå¯é项 passive: true åæµè§å¨ååºä¿¡å·ï¼è¡¨æå¤çç¨åºå°ä¸ä¼è°ç¨ preventDefault()ã
为ä»ä¹éè¦è¿æ ·åï¼
ç§»å¨è®¾å¤ä¸ä¼åçä¸äºäºä»¶ï¼ä¾å¦ touchmoveï¼å½ç¨æ·å¨å±å¹ä¸ç§»å¨æææ¶ï¼ï¼é»è®¤æ
åµä¸ä¼å¯¼è´æ»å¨ï¼ä½æ¯å¯ä»¥ä½¿ç¨å¤çç¨åºç preventDefault() æ¥é»æ¢æ»å¨ã
å æ¤ï¼å½æµè§å¨æ£æµå°æ¤ç±»äºä»¶æ¶ï¼å®å¿
é¡»é¦å
å¤çææå¤çç¨åºï¼ç¶åå¦ææ²¡æä»»ä½å°æ¹è°ç¨ preventDefaultï¼å页é¢å¯ä»¥ç»§ç»æ»å¨ãä½è¿å¯è½ä¼å¯¼è´ UI ä¸ä¸å¿
è¦çå»¶è¿åâæå¨âã
passive: true é项åè¯æµè§å¨ï¼å¤çç¨åºä¸ä¼åæ¶æ»å¨ãç¶åæµè§å¨ç«å³æ»å¨é¡µé¢ä»¥æä¾æå¤§ç¨åº¦çæµç
ä½éªï¼å¹¶éè¿æç§æ¹å¼å¤çäºä»¶ã
å¯¹äºæäºæµè§å¨ï¼Firefoxï¼Chromeï¼ï¼é»è®¤æ
åµä¸ï¼touchstart å touchmove äºä»¶ç passive 为 trueã
event.defaultPrevented
妿é»è®¤è¡ä¸ºè¢«é»æ¢ï¼é£ä¹ event.defaultPrevented 屿§ä¸º trueï¼å¦å为 falseã
è¿å¿æä¸ä¸ªæè¶£çç¨ä¾ã
ä½ è¿è®°å¾æä»¬å¨ åæ³¡åæè· ä¸ç« ä¸è®¨è®ºè¿ç event.stopPropagation()ï¼ä»¥å为ä»ä¹åæ¢å泡æ¯ä¸å¥½çåï¼
ææ¶æä»¬å¯ä»¥ä½¿ç¨ event.defaultPrevented æ¥ä»£æ¿ï¼æ¥éç¥å
¶ä»äºä»¶å¤çç¨åºï¼è¯¥äºä»¶å·²ç»è¢«å¤çã
æä»¬æ¥çä¸ä¸ªå®é çä¾åã
é»è®¤æ
åµä¸ï¼æµè§å¨å¨ contextmenu äºä»¶ï¼åå»é¼ æ å³é®ï¼æ¶ï¼æ¾ç¤ºå¸¦ææ åé项çä¸ä¸æèåãæä»¬å¯ä»¥é»æ¢å®å¹¶æ¾ç¤ºæä»¬èªå®ä¹çèåï¼å°±åè¿æ ·ï¼
<button>Right-click shows browser context menu</button>
<button oncontextmenu="alert('Draw our menu'); return false">
Right-click shows our context menu
</button>
ç°å¨ï¼é¤äºè¯¥ä¸ä¸æèåå¤ï¼æä»¬è¿æ³å®ç°ææ¡£èå´çä¸ä¸æèåã
å³é®å廿¶ï¼åºè¯¥æ¾ç¤ºæè¿çä¸ä¸æèåï¼
<p>Right-click here for the document context menu</p>
<button id="elem">Right-click here for the button context menu</button>
<script>
elem.oncontextmenu = function(event) {
event.preventDefault();
alert("Button context menu");
};
document.oncontextmenu = function(event) {
event.preventDefault();
alert("Document context menu");
};
</script>
é®é¢æ¯ï¼å½æä»¬ç¹å» elem æ¶ï¼æä»¬ä¼å¾å°ä¸¤ä¸ªèåï¼æé®çº§åææ¡£çº§ï¼äºä»¶å泡ï¼çèåã
å¦ä½ä¿®å¤å¢ï¼å
¶ä¸ä¸ä¸ªè§£å³æ¹æ¡æ¯ï¼â彿们卿é®å¤çç¨åºä¸å¤çé¼ æ å³é®åå»äºä»¶æ¶ï¼æä»¬é»æ¢å
¶å泡âï¼ä½¿ç¨ event.stopPropagation()ï¼
<p>Right-click for the document menu</p>
<button id="elem">Right-click for the button menu (fixed with event.stopPropagation)</button>
<script>
elem.oncontextmenu = function(event) {
event.preventDefault();
event.stopPropagation();
alert("Button context menu");
};
document.oncontextmenu = function(event) {
event.preventDefault();
alert("Document context menu");
};
</script>
ç°å¨æé®çº§èå妿工ä½ã使¯ä»£ä»·å¤ªå¤§ï¼æä»¬æç»äºä»»ä½å¤é¨ä»£ç 对å³é®ç¹å»ä¿¡æ¯ç访é®ï¼å æ¬æ¶éç»è®¡ä¿¡æ¯ç计æ°å¨çãè¿æ¯é叏䏿æºçã
å¦ä¸ä¸ªæ¿ä»£æ¹æ¡æ¯ï¼æ£æ¥ document å¤çç¨åºæ¯å¦é»æ¢äºæµè§å¨çé»è®¤è¡ä¸ºï¼å¦æé»æ¢äºï¼é£ä¹è¯¥äºä»¶å·²ç»å¾å°äºå¤çï¼æä»¬æ éå对æ¤äºä»¶ååºååºã
<p>Right-click for the document menu (added a check for event.defaultPrevented)</p>
<button id="elem">Right-click for the button menu</button>
<script>
elem.oncontextmenu = function(event) {
event.preventDefault();
alert("Button context menu");
};
document.oncontextmenu = function(event) {
if (event.defaultPrevented) return;
event.preventDefault();
alert("Document context menu");
};
</script>
ç°å¨ä¸åé½å¯ä»¥æ£å¸¸å·¥ä½äºã妿æä»¬æåµå¥çå
ç´ ï¼å¹¶ä¸æ¯ä¸ªå
ç´ é½æèªå·±çä¸ä¸æèåï¼é£ä¹è¿ä¹æ¯å¯ä»¥è¿è¡çãåªéç¡®ä¿æ£æ¥æ¯ä¸ª contextmenu å¤çç¨åºä¸ç event.defaultPreventedã
æ£å¦æä»¬æçå°çï¼event.stopPropagation() å event.preventDefault()ï¼ä¹è¢«è®¤ä¸ºæ¯ return falseï¼æ¯ä¸¤ä¸ªä¸åçä¸è¥¿ãå®ä»¬ä¹é´æ¯«æ å
³èã
è¿æå
¶ä»å®ç°åµå¥ä¸ä¸æèåçæ¹å¼ãå
¶ä¸ä¹ä¸æ¯æ¥æä¸ä¸ªå
·æ document.oncontextmenu å¤çç¨åºçå
¨å±å¯¹è±¡ï¼ä»¥å使æä»¬è½å¤å¨å
¶ä¸åå¨å
¶ä»å¤çç¨åºçæ¹æ³ã
è¯¥å¯¹è±¡å°æè·ä»»ä½å³é®åå»ï¼æµè§åå¨çå¤çç¨åºå¹¶è¿è¡éå½çå¤çç¨åºã
使¯ï¼æ¯æ®µéè¦ä¸ä¸æèåç代ç é½åºè¯¥äºè§£è¯¥å¯¹è±¡ï¼å¹¶ä½¿ç¨å®ç帮å©ï¼è䏿¯ä½¿ç¨èªå·±ç contextmenu å¤çç¨åºã
æ»ç»
æå¾å¤é»è®¤çæµè§å¨è¡ä¸ºï¼
mousedownââ å¼å§éæ©ï¼ç§»å¨é¼ æ è¿è¡éæ©ï¼ã- å¨
<input type="checkbox">ä¸çclickââ éä¸/åæ¶éä¸çinputã submitââ ç¹å»<input type="submit">æè å¨è¡¨ååæ®µä¸æä¸ Enter é®ä¼è§¦å该äºä»¶ï¼ä¹åæµè§å¨å°æäº¤è¡¨åãkeydownââ æä¸ä¸ä¸ªæé®ä¼å¯¼è´å°å符添å å°åæ®µï¼æè 触åå ¶ä»è¡ä¸ºãcontextmenuââ äºä»¶åçå¨é¼ æ å³é®å廿¶ï¼è§¦åçè¡ä¸ºæ¯æ¾ç¤ºæµè§å¨ä¸ä¸æèåã- â¦â¦è¿ææ´å¤â¦â¦
妿æä»¬åªæ³éè¿ JavaScript æ¥å¤çäºä»¶ï¼é£ä¹ææé»è®¤è¡ä¸ºé½æ¯å¯ä»¥è¢«é»æ¢çã
æ³è¦é»æ¢é»è®¤è¡ä¸º ââ å¯ä»¥ä½¿ç¨ event.preventDefault() æ return falseã第äºä¸ªæ¹æ³åªéç¨äºéè¿ on<event> åé
çå¤çç¨åºã
addEventListener ç passive: true é项åè¯æµè§å¨è¯¥è¡ä¸ºä¸ä¼è¢«é»æ¢ãè¿å¯¹äºæäºç§»å¨ç«¯çäºä»¶ï¼å touchstart å touchmoveï¼å¾æç¨ï¼ç¨ä»¥åè¯æµè§å¨å¨æ»å¨ä¹åä¸åºçå¾
ææå¤çç¨åºå®æã
妿é»è®¤è¡ä¸ºè¢«é»æ¢ï¼event.defaultPrevented çå¼ä¼åæ trueï¼å¦å为 falseã
仿æ¯ä¸æ¥è¯´ï¼éè¿é»æ¢é»è®¤è¡ä¸ºå¹¶æ·»å JavaScriptï¼æä»¬å¯ä»¥èªå®ä¹ä»»ä½å
ç´ çè¡ä¸ºãä¾å¦ï¼æä»¬å¯ä»¥ä½¿é¾æ¥ <a> åæé®ä¸æ ·å·¥ä½ï¼èæé® <button> ä¹å¯ä»¥å龿¥é£æ ·å·¥ä½ï¼éå®åå°å¦ä¸ä¸ª URL çï¼ã
使们é常åºè¯¥ä¿ç HTML å
ç´ çè¯ä¹ãä¾å¦ <a> åºè¯¥è¡¨ç°ä¸ºå¯¼èªï¼navigationï¼ï¼è䏿¯æé®ã
é¤äºâåªæ¯ä¸ä»¶å¥½äºâä¹å¤ï¼è¿è¿ä¼ä½¿ä½ ç HTML å ·ææ´å¥½çå¯è®¿é®æ§ã
å¦å¤ï¼å¦ææä»¬èè使ç¨å¸¦æ <a> ç示ä¾ï¼é£ä¹è¯·æ³¨æï¼æµè§å¨å
许æä»¬å¨æ°çªå£ä¸æå¼æ¤ç±»é¾æ¥ï¼éè¿å³é®åå»å®ä»¬ä»¥åå
¶ä»æ¹å¼ï¼ã大家é½å欢è¿ä¹åã使¯ï¼å¦ææä»¬ä½¿ç¨ JavaScript 让æé®è¡ä¸ºè¡¨ç°å¾å龿¥ï¼çè³ä½¿ç¨ CSS å°å
¶æ ·å¼è®¾ç½®æçèµ·æ¥ä¹å龿¥ï¼å³ä½¿è¿æ ·ï¼ä½ä»ç¶æ æ³å¨æé®ä¸ä½¿ç¨ç¹å®äº <a> çæµè§å¨åè½ã
è¯è®º
<code>æ ç¾æå ¥åªæå 个è¯ç代ç ï¼æå ¥å¤è¡ä»£ç å¯ä»¥ä½¿ç¨<pre>æ ç¾ï¼å¯¹äºè¶ è¿ 10 è¡ç代ç ï¼å»ºè®®ä½ ä½¿ç¨æ²ç®±ï¼plnkrï¼JSBinï¼codepenâ¦ï¼