102_自定义事件

自定义事件与事件处理机制详解

1. Event()

1.1. Event()构造函数, 创建一个新的事件对象Event。

1.2. 语法

var event = new Event(typeArg, eventInit);

1.3. typeArg是DOMString类型, 表示所创建事件的名称。

1.4. eventInit可选, 是EventInit类型的字典, 接受以下字段:

1.4.1. "bubbles"可选, Boolean类型, 默认值为false, 表示该事件是否冒泡。

1.4.2. "cancelable"可选, Boolean类型, 默认值为false, 表示该事件能否被取消。

2. event.bubbles

2.1. event.bubbles返回一个布尔值, 表明当前事件是否会向DOM树上层元素冒泡, 是一个只读属性。

2.2. 语法

var bool = event.bubbles;

2.3. 一些特定的事件类型会冒泡, 这时该事件对象的bubbles属性为true, 你可以检查该属性的值来判断一个事件对象是否冒泡。

3. event.stopPropagation()

3.1. event.stopPropagation()阻止捕获和冒泡阶段中当前事件的进一步传播。但是, 它不能防止任何默认行为的发生; 例如: 对链接的点击仍会被处理。如果要停止这些行为, 请参见preventDefault方法, 它可以阻止事件触发后默认动作的发生。

3.2. 语法

event.stopPropagation();

3.3. event.stopPropagation()方法没有参数也没有返回值。

4. event.cancelable

4.1. event.cancelable是一个只读属性, 表明该事件是否可以被取消, 当事件被阻止之后, 该事件就好像没有被触发一样。如果事件不能被取消, 则其cancelable属性的值为false, 且事件发生时无法在事件监听回调中停止事件。

4.2. 在许多事件的监听回调中调用preventDefault()前, 都需要检查cancelable属性的值。

4.3. 大部分由用户与页面交互产生的原生浏览器事件都可以被取消。取消click, scroll或beforeunload事件将分别阻止用户点击某些元素、滚动页面或跳离页面。

4.4. 语法

var bool = event.cancelable;

5. event.preventDefault()

5.1. event.preventDefault()取消事件(如果该事件可取消)。

5.2. 语法

event.preventDefault();

5.3. event.preventDefault()方法没有参数也没有返回值。

6. EventTarget.dispatchEvent(event)

6.1. EventTarget.dispatchEvent(event)向一个指定的事件目标派发一个事件, 并以合适的顺序同步调用目标元素相关的事件处理函数。标准事件处理规则(包括事件捕获和可选的冒泡过程)同样适用于通过手动的使用dispatchEvent(event)方法派发的事件。

6.2. 语法

var cancelled = !target.dispatchEvent(event)

6.3. event参数是要被派发的事件对象。

6.4. target调用者被用来初始化事件和决定将会触发事件的目标。

6.4. 当该事件是可取消的(cancelable为true)并且至少一个该事件的事件处理方法调用了Event.preventDefault(), 则返回值为false; 否则返回true。

6.5. 与浏览器原生事件不同, 原生事件是由DOM派发的, 并通过event loop异步调用事件处理程序, 而dispatchEvent()则是同步调用事件处理程序。在调用dispatchEvent()后, 所有监听该事件的事件处理程序将在代码继续前执行并返回。

7. 例子

7.1. 代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>自定义事件Event</title>

		<style type="text/css">
			div {
				width: 150px;
				height: 90px;
				line-height: 90px;
				background-color: #D94A38;
				margin-top: 20px;
				text-align: center;
			}
			p {
				width: 150px;
				height: 32px;
				line-height: 32px;
				background-color: green;
				text-align: center;
			}
		</style>
	</head>
	<body>
		<div id="div1"><p id="p1">冒泡</p></div>
		<div id="div2"><p id="p2">冒泡</p></div>	

		<div id="div3"><p id="p3">捕获</p></div>	
		<div id="div4"><p id="p4">捕获</p></div>	

		<div id="div5"><p id="p5">捕获</p></div>	
		<div id="div6"><p id="p6">冒泡</p></div>	

		<a id="a1" href="https://www.baidu.com" target="_blank">百度</a>
		<a id="a2" href="https://map.baidu.com" target="_blank">百度地图</a>

		<script type="text/javascript">
			// 首先看元素, 第一外层元素是捕获还是冒泡, 外层元素是捕获就是捕获传播。外层元素是冒泡, 然后看事件是否支持冒泡。
			var div1 = document.getElementById('div1'), p1 = document.getElementById('p1');
			var ev1 = new Event("upbubbles1", {"bubbles": true, "cancelable": true});

			function div1Event(e){
				console.log('div1自定义的事件被触发了');
			} 

			function p1Event(e){
				console.log('p1自定义的事件被触发了');
				console.log('p1自定义的事件是否会向DOM树上层元素冒泡: ' + e.bubbles);
				console.log('p1自定义的事件是否可以取消: ' + e.cancelable);
			}
			
			div1.addEventListener('upbubbles1', div1Event);
			p1.addEventListener('upbubbles1', p1Event);
			p1.dispatchEvent(ev1);

			
			var div2 = document.getElementById('div2'), p2 = document.getElementById('p2');
			var ev2 = new Event("upbubbles2", {"bubbles": true, "cancelable": true});

			function div2Event(e){
				console.log('div2自定义的事件被触发了');
			}

			function p2Event(e){
				console.log('p2自定义的事件被触发了');
				console.log('p2自定义的事件是否会向DOM树上层元素冒泡: ' + e.bubbles);
				console.log('p2自定义的事件是否可以取消: ' + e.cancelable);
				// 阻止事件进一步传播
				e.stopPropagation();
			}
			
			div2.addEventListener('upbubbles2', div2Event);
			p2.addEventListener('upbubbles2', p2Event);
			p2.dispatchEvent(ev2);
			

			var div3 = document.getElementById('div3'), p3 = document.getElementById('p3');
			var ev3 = new Event("upbubbles3", {"bubbles": true, "cancelable": true});

			function div3Event(e){
				console.log('div3自定义的事件被触发了');
			} 

			function p3Event(e){
				console.log('p3自定义的事件被触发了');
				console.log('p3自定义的事件是否会向DOM树上层元素冒泡: ' + e.bubbles);
				console.log('p3自定义的事件是否可以取消: ' + e.cancelable);
			}
			
			div3.addEventListener('upbubbles3', div3Event, true);
			p3.addEventListener('upbubbles3', p3Event, true);
			p3.dispatchEvent(ev3);

			
			var div4 = document.getElementById('div4'), p4 = document.getElementById('p4');
			var ev4 = new Event("upbubbles4", {"bubbles": false, "cancelable": true});

			function div4Event(e){
				console.log('div4自定义的事件被触发了');
			}

			function p4Event(e){
				console.log('p4自定义的事件被触发了');
				console.log('p4自定义的事件是否会向DOM树上层元素冒泡: ' + e.bubbles);
				console.log('p4自定义的事件是否可以取消: ' + e.cancelable);
			}
			
			div4.addEventListener('upbubbles4', div4Event, true);
			p4.addEventListener('upbubbles4', p4Event, true);
			p4.dispatchEvent(ev4);


			var div5 = document.getElementById('div5'), p5 = document.getElementById('p5');
			var ev5 = new Event("notupbubbles5", {"bubbles": true, "cancelable": true});

			function div5Event(e){
				console.log('div5自定义的事件被触发了');
				// 阻止事件进一步传播
				e.stopPropagation();
			}

			function p5Event(e){
				console.log('p5自定义的事件被触发了');
				console.log('p5自定义的事件是否会向DOM树上层元素冒泡: ' + e.bubbles);
				console.log('p5自定义的事件是否可以取消: ' + e.cancelable);
			}
			
			div5.addEventListener('notupbubbles5', div5Event, true);
			p5.addEventListener('notupbubbles5', p5Event, true);
			p5.dispatchEvent(ev5);


			var div6 = document.getElementById('div6'), p6 = document.getElementById('p6');
			var ev6 = new Event("notupbubbles6");

			function div6Event(e){
				console.log('div6自定义的事件被触发了');
			}

			function p6Event(e){
				console.log('p6自定义的事件被触发了');
				console.log('p6自定义的事件是否会向DOM树上层元素冒泡: ' + e.bubbles);
				console.log('p6自定义的事件是否可以取消: ' + e.cancelable);
			}
			
			div6.addEventListener('notupbubbles6', div6Event, false);
			p6.addEventListener('notupbubbles6', p6Event, false);
			p6.dispatchEvent(ev6);


			var a1 = document.getElementById('a1');
			a1.addEventListener('click', function(e){
				// 阻止超链接的默认跳转行为, 同时超链接点击也不变色
				console.log('a1超链接点击的事件是否可以取消: ' + e.cancelable);
				e.preventDefault();
			});
		</script>
	</body>
</html>

7.2. 效果图

8. Event.cancelBubble

8.1. Event.cancelBubble属性是Event.stopPropagation()的一个曾用名。在从事件处理程序返回之前将其值设置为true可阻止事件的传播。

8.2. 语法

event.cancelBubble = bool;
let bool = event.cancelBubble;

9. Event.target

9.1. target对触发事件的对象的引用。当事件处理程序在事件的冒泡或捕获阶段被调用时, 它与event.currentTarget不同。

9.2. 语法

let theTarget = event.target

10. event.currentTarget

10.1. currentTarget是一个只读属性, 当事件沿着DOM触发时, 事件的当前目标。它总是指向事件绑定的元素, 而Event.target则是事件触发的元素。

10.2. 语法

var currentEventTarget = event.currentTarget;

11. Event.type

11.1. Event.type是一个只读属性, 会返回一个字符串, 表示该事件对象的事件类型。

11.2. 语法

var str = event.type

12. Event.isTrusted

12.1. Event.isTrusted是一个只读属性, 它是一个布尔值。当事件是由用户行为生成的时候, 这个属性的值为true, 而当事件是由脚本创建、修改、通过EventTarget.dispatchEvent()派发的时候, 这个属性的值为false。

12.2. 语法

var eventIsTrusted = event.isTrusted;

13. event.defaultPrevented

13.1. event.defaultPrevented返回一个布尔值, 表示是否取消了事件的默认行为。表明当前事件是否调用了event.preventDefault()方法。

13.2. 语法

bool = event.defaultPrevented

14. 例子

14.1. 代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>自定义事件Event属性</title>

		<style type="text/css">
			div {
				width: 150px;
				height: 90px;
				line-height: 90px;
				background-color: #D94A38;
				margin-top: 20px;
				text-align: center;
			}
			p {
				width: 150px;
				height: 32px;
				line-height: 32px;
				background-color: green;
				text-align: center;
			}
		</style>
	</head>
	<body>
		<div id="div1"><p id="p1">冒泡</p></div>
		<div id="div2"><p id="p2">捕获</p></div>	

		<div id="div3"></div>	

		<a id="a1" href="https://www.baidu.com" target="_blank">百度</a>

		<script type="text/javascript">
			var div1 = document.getElementById('div1'), p1 = document.getElementById('p1');
			var ev1 = new Event("upbubbles1", {"bubbles": true, "cancelable": true});

			function div1Event(e){
				console.log('div1自定义的事件被触发了');
			} 

			function p1Event(e){
				var t = e.target;
				var ct = e.currentTarget;
				console.log('事件触发的元素: ' + t.id);
				console.log('事件绑定的元素: ' + ct.id);

				console.log('p1自定义的事件被触发了');
				
				// 阻止事件进一步传播
				e.cancelBubble = true;
			}
			
			div1.addEventListener('upbubbles1', div1Event);
			p1.addEventListener('upbubbles1', p1Event);
			p1.dispatchEvent(ev1);

			
			var div2 = document.getElementById('div2'), p2 = document.getElementById('p2');
			var ev2 = new Event("upbubbles2", {"bubbles": true, "cancelable": true});

			function div2Event(e){
				var t = e.target;
				var ct = e.currentTarget;
				console.log('事件触发的元素: ' + t.id);
				console.log('事件绑定的元素: ' + ct.id);
				console.log('div2自定义的事件被触发了');

				// 阻止事件进一步传播
				e.cancelBubble = true;
			}

			function p2Event(e){
				console.log('p2自定义的事件被触发了');
			}
			
			div2.addEventListener('upbubbles2', div2Event, true);
			p2.addEventListener('upbubbles2', p2Event, true);
			p2.dispatchEvent(ev2);
			

			var div3 = document.getElementById('div3');
			var ev3 = new Event("upbubbles3", {"bubbles": true, "cancelable": true});

			function div3Event(e){
				console.log('div3自定义的事件被触发了');
				console.log('事件对象的事件类型: ' + e.type);
				console.log('事件是由脚本创建的: ' + (!e.isTrusted));
			} 
			
			div3.addEventListener('upbubbles3', div3Event, true);
			div3.dispatchEvent(ev3);


			var a1 = document.getElementById('a1');
			a1.addEventListener('click', function(e){
				e.preventDefault();
				console.log('是否取消了事件的默认行为: ' + e.defaultPrevented);
			});
		</script>
	</body>
</html>

14.2. 效果图

<think> 我们被要求回答:如何自定义ECharts图例颜色? 根据引用[2]和引用[3]的内容,自定义图例颜色可以通过在option中设置`color`数组来实现。这个数组中的颜色值会依次应用到图例项和对应的数据系列上。 具体步骤: 1. 在option中定义`color`属性,值为一个颜色数组,例如:`color: ['#ff671b','#666666','#888888']`。 2. 图例(legend)的数据项(data)需要与系列(series)中的name一一对应,这样颜色才能正确匹配。 注意:如果图例项数量多于`color`数组的长度,ECharts会循环使用数组中的颜色。 另外,引用[1]提到了自定义tooltip显示图例颜色,但用户当前问题只关注图例颜色,所以主要参考引用[2]和引用[3]。 下面给出一个完整的示例配置: ```javascript option = { // 步骤1:定义颜色数组 color: ['#ff671b', '#666666', '#888888'], legend: { data: ['类别1', '类别2', '类别3'], // 图例项,需要与series中的name对应 // 其他legend配置... }, series: [ { name: '类别1', // 与legend中的第一项匹配,将使用color数组的第一个颜色 type: 'bar', data: [10, 20, 30] }, { name: '类别2', // 使用color数组的第二个颜色 type: 'bar', data: [20, 30, 40] }, { name: '类别3', // 使用color数组的第三个颜色 type: 'bar', data: [30, 40, 50] } ] }; ``` 这样,每个系列的颜色就会按照`color`数组中定义的颜色显示,同时图例的颜色也会相应地改变。 如果需要单独为某个系列设置颜色,也可以在series的每个数据系列中通过`itemStyle`覆盖全局颜色,例如: ```javascript series: [ { name: '类别1', type: 'bar', data: [10, 20, 30], itemStyle: { color: 'red' // 单独设置该系列的颜色为红色 } }, // ...其他系列 ] ``` 但是,这样设置后,图例的颜色也会变为红色。因此,如果希望图例颜色与系列颜色一致,通常推荐使用全局的`color`数组。 **注意事项**: - 确保图例的`data`数组中的顺序与`series`数组中系列的顺序一致,这样颜色才能正确匹配。 - 如果图例是通过`series`的`name`自动生成的,则无需在`legend`中设置`data`,但同样要保证`color`数组的顺序与系列顺序一致。 如果图例项和系列顺序不一致,可以通过调整`legend.data`的顺序来匹配,或者使用`series`中的`colorBy`属性(ECharts 4.0+)来改变颜色分配策略(默认是'series'按系列分配,也可以是'data'按数据项分配)。 总结:自定义图例颜色的核心是设置`color`数组,并注意图例项与系列的对应关系。 §§相关问题§§ 1. 如何在ECharts中自定义tooltip的样式? 2. 如何调整ECharts图例的位置和样式? 3. 当图例项较多时,如何分页显示图例? 4. ECharts中如何实现图例的选中和取消选中事件? 5. 如何动态更新ECharts图例的颜色? </think> ### ECharts 自定义图例颜色方法 在 ECharts 中自定义图例颜色,主要通过以下两种方式实现: #### 1. **全局颜色设置(推荐)** 在 `option` 顶层设置 `color` 数组,颜色值将按顺序应用到图例和数据系列: ```javascript option = { // 关键设置:定义图例颜色数组 color: ['#ff671b', '#666666', '#888888', 'red', 'cyan'], // 颜色数组 legend: { data: ['股票', '银行存款', '其他', '广告', '营销'], // 图例项(需与颜色顺序一致) formatter: function(name) { return name; } // 可选:自定义图例文本 }, series: [ { name: '股票', type: 'bar', data: [...] }, // 自动应用 #ff671b { name: '银行存款', type: 'bar', data: [...] }, // 自动应用 #666666 // ...其他系列 ] }; ``` **效果**:图例颜色与数据系列颜色自动匹配[^2][^3]。 #### 2. **单独设置系列颜色** 在 `series` 中为每个系列单独指定颜色: ```javascript series: [ { name: '股票', type: 'bar', data: [120, 132, 101], itemStyle: { color: '#ff671b' } // 单独设置颜色 }, { name: '银行存款', type: 'bar', data: [220, 182, 191], itemStyle: { color: '#666666' } // 单独设置颜色 } ] ``` ### 注意事项 1. **顺序匹配** `color` 数组的颜色顺序需与 `legend.data` 和 `series` 中的顺序一致[^3]。 2. **动态更新** 使用 `setOption` 更新时保留颜色: ```javascript myChart.setOption(newOption, { notMerge: false }); // 保留原颜色配置 ``` 3. **透明度设置** 支持 RGBA 格式: ```javascript color: ['rgba(255,103,27,0.8)', 'rgba(102,102,102,0.6)'] ``` ### 完整示例 ```javascript // 初始化图表 const chart = echarts.init(document.getElementById('chart')); // 配置项 const option = { color: ['#ff671b', '#666666', '#888888'], // 颜色数组 legend: { data: ['股票', '银行存款', '其他'], left: '10%', itemWidth: 12, itemHeight: 12 }, xAxis: { type: 'category', data: ['Q1', 'Q2', 'Q3'] }, yAxis: { type: 'value' }, series: [ { name: '股票', type: 'bar', data: [120, 200, 150] }, { name: '银行存款', type: 'bar', data: [100, 150, 80] }, { name: '其他', type: 'bar', data: [80, 120, 180] } ] }; // 渲染图表 chart.setOption(option); ``` ### 效果说明 通过以上配置,图例会显示为自定义颜色: - 股票 → `#ff671b`(橙色) - 银行存款 → `#666666`(深灰) - 其他 → `#888888`(浅灰) [^2]: 直接定义 `color` 数组即可全局设置图例颜色。 [^3]: 颜色数组按顺序应用到图例项,需与数据系列顺序一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值