js的event.stopPropagation();是什么意思


在 JavaScript 中,`event.stopPropagation()` 是一个用于阻止事件冒泡的方法。事件冒泡是指在一个元素上触发的事件会依次向上级元素传播,直到到达文档根节点。 以下是一个简单的示例代码,展示了事件冒泡以及 `event.stopPropagation()` 的作用: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> </head> <body> <div id="outer" style="background-color: lightblue; padding: 20px;"> Outer Div <div id="inner" style="background-color: lightgreen; padding: 20px;"> Inner Div </div> </div> <script> // 获取内外层 div 元素 const outerDiv = document.getElementById('outer'); const innerDiv = document.getElementById('inner'); // 为内外层 div 添加点击事件监听器 outerDiv.addEventListener('click', function (event) { console.log('Outer div clicked'); }); innerDiv.addEventListener('click', function (event) { console.log('Inner div clicked'); // 阻止事件冒泡 event.stopPropagation(); }); </script> </body> </html> ``` 代码 - 首先通过 `document.getElementById` 方法获取了内外层的 `div` 元素。 - 然后使用 `addEventListener` 方法为内外层 `div` 元素添加了点击事件监听器。 - 当点击内层 `div` 时,由于调用了 `event.stopPropagation()`,事件不会继续向父元素(外层 `div`)传播,因此只会在控制台输出 `Inner div clicked`。如果去掉 `event.stopPropagation()` 这一行,点击内层 `div` 时,控制台会依次输出 `Inner div clicked` 和 `Outer div clicked`。 我在以往的开发过程中,碰到过以下几点需要格外小心处理的地方: 1. 要注意 `event.stopPropagation()` 只会阻止事件冒泡,不会阻止默认行为。如果需要同时阻止默认行为,还需要调用 `event.preventDefault()`。 2. 在使用 `event.stopPropagation()` 时,要确保确实需要阻止事件冒泡,因为过度使用可能会导致一些预期之外的问题,例如某些依赖事件冒泡的功能无法正常工作。 3. 不同的浏览器可能对事件冒泡和捕获的实现存在细微差异,在使用 `event.stopPropagation()` 时要进行充分的测试。 [2025-09-02 11:36:57 | AI写代码神器 | 568点数解答]
- skill={ trigger:{ global:"useCard1", }, audio:2, forced:true, firstDo:true, filter:function(event,player,card){ if(get.color(event.card)!='black') return false; return event.card.name=='nanman'&&player!=event.player||event.card.name=='wanjian'&&player!=event.player||event.card.name=='taoyuan'&&player.hp<player.maxHp||event.card.name=='wugu'; }, content:function(){}, mod:{ targetEnabled:function(card){ if((get.type(ca(211点数解答 | 2025-02-01 13:23:26)204
- content: async function(event, trigger, player) { const [target] = event.targets; const [card] = event.cards; trigger.cancel(); await player.discard(event.cards); const { result } = await player.chooseControlList( true, function(event, player) { const target = _status.event.target; let att = get.attitude(player, target); if (target.hasSkillTag("maihp")) att = -att; return att > 0 ? 0 : 1; }, ["令" (179点数解答 | 2025-05-17 20:49:48)129
- 这是无名杀的一个技能,如何让他去除不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能的限制skill={ unique: true, audio: 2, trigger: { global: "phaseBefore", player: ["enterGame","phaseBegin","phaseEnd"], }, filter(event, player, name) { if (event.name != "phase") return true; if (name == "phaseBefore") return game.phaseNumber == 0; return player.storage.rehuashen?.character?.length > 0; }, async cost(event, trigger, player) { if (trigger.name !== "phase" || event.triggername === "phaseBefore") { event.result = { bool: true, cost_data: ["(556点数解答 | 2025-06-29 08:59:58)109
- skill={ audio:2, trigger:{ player:"useCard", }, frequent:true, filter:function (event,player){ if(!event.cards||event.cards.length!=1) return false; if(_status.currentPhase!=player) return false; if(!player.storage.jianying) return false; return get.suit(player.storage.jianying)==get.suit(event.cards[0])|| player.storage.jianying.number==event.cards[0].number; }, content:function (){ player.draw(); }, (713点数解答 | 2025-07-05 23:27:14)94
- jingyu: { audio: 2, trigger: { global: ["useskill", "logskillbegin", "usecard", "respond"], }, filter(event, player) { if (["global", "equip"].includes(event.type)) return false; let skill = event.sourceskill || event.skill; if (!skill || skill === "jingyu") return false; let info = get.info(skill); while (true) { if (!info || info.charlotte || info.equipskill) return false; if (info && !info.sourceskill) break; skill = info.sourceskill; info = get.info((15点数解答 | 2024-06-06 17:40:23)285
- content() { "step 0"; player.loseHp(); event.target = trigger.player; "step 1"; event.addIndex = 0; var list = [], num = target.countCards("h") - player.countCards("h"); event.num = num; if (num > 0 && target.countCards("h") > 0) list.push("令其弃置" + get.cnNumber(num) + "张手牌"); else event.addIndex++; if (target.hp > player.hp) list.push("令其失去" + get.cnNumber(target.hp - player.hp) + "点体力"); if (!lis(313点数解答 | 2025-05-28 16:03:47)136
- skill={ unique: true, audio: 2, trigger: { global: "phaseBefore", player: ["enterGame","phaseBegin","phaseEnd"], }, filter(event, player, name) { if (event.name != "phase") return true; if (name == "phaseBefore") return game.phaseNumber == 0; return player.storage.rehuashen?.character?.length > 0; }, async cost(event, trigger, player) { if (trigger.name !== "phase" || event.triggername === "phaseBefore") { ev(1573点数解答 | 2025-06-29 08:55:47)80
- 这是无名杀的一个技能,如何让他去除不可声明限定技、觉醒技、隐匿技、使命技、主公技等特殊技能的限制skill={ unique: true, audio: 2, trigger: { global: "phaseBefore", player: ["enterGame","phaseBegin","phaseEnd"], }, filter(event, player, name) { if (event.name != "phase") return true; if (name == "phaseBefore") return game.phaseNumber == 0; return player.storage.rehuashen?.character?.length > 0; }, async cost(event, trigger, player) { if (trigger.name !== "phase" || event(1326点数解答 | 2025-06-29 08:57:51)119
- { trigger: { global: "useCardToBegin", }, audio: true, filter: function (event, player) { var card = player.getEquip(5); if (card) { var name = card.name; if ( name && name.indexOf("monkey") != -1 && event.name == "tao" && event.player != player && event.cards.filterInD().length > 0 ) return true; } return fals(613点数解答 | 2025-08-10 12:52:52)63
- { trigger: { global: "useCardToBegin", }, audio: true, filter: function (event, player) { var card = player.getEquip(5); if (card) { var name = card.name; if ( name && name.indexOf("monkey") != -1 && event.name == "tao" && event.player != player && event.cards.filterInD().length > 0 ) return true; } return fals(346点数解答 | 2025-08-10 12:54:50)61
- trigger: { global: ["useCard","respond"], }, superCharlotte: true, filter: function(event,player){ if(player.name!="szq") return false; return event.player.name!="szq"; }, prompt(event,player,card) { return "令" + get.translation(event.player) + "的" + (476点数解答 | 2025-08-24 05:31:45)51
- # 模板匹配 任意对象 源代码 import cv2 import numpy as np # 初始化全局变量 template = none drawing = false x_start, y_start = 0, 0 # 鼠标事件回调函数 def select_template(event, x, y, flags, param): global template, drawing, x_start, y_start if event == cv2.event_lbuttondown: drawing = true x_start, y_start = x, y # 记录起始点 elif event == cv2.event_mousemove and drawing: img_copy = frame.copy() cv2.rectangle(img_copy, (x_start, y_start), (x, y), (0, 255, 0), 2) cv2.imsh(28点数解答 | 2024-11-15 09:10:30)167