


Peristiwa menggelegak dan tangkapan masa acara JavaScript (perkongsian ringkasan)
Artikel ini membawakan anda penjelasan terperinci tentang pengetahuan asas tentang acara dalam JavaScript, termasuk acara menggelegak dan tangkapan masa saya harap ia akan membantu semua orang.
1. Acara menggelegak dan menangkap peristiwa
Apabila kita mengklik elemen pada halaman web, seperti elemen p. Jika anda memikirkannya dengan teliti, kami mengklik bukan sahaja elemen p ini, tetapi juga elemen bulatan sepusat dengan p sebagai pusat, seperti induk unsur, badan luar, unsur induk html badan dan dokumen lapisan luar. Penyebaran peristiwa di antara elemen bersarang ini dipanggil aliran peristiwa.
- 1. Acara menggelegak
- 2. Tangkapan acara
1. Aliran acara IE , bermula dengan elemen yang paling spesifik dan merambat ke atas. Pengendali acara yang kami tambah menggunakan DOM0 diproses semasa peringkat menggelegak acara. Contohnya:
Apabila anda mengklik pada p putih di lapisan dalam, ia akan dipaparkan dalam urutan:<html> <head> <script type="text/javascript"> window.onload = bubblingHandle; function bubblingHandle() { //内层p处理程序 document.getElementById("inner").onmousedown = function() { alert("inner p"); } //外层p处理程序 document.getElementById("outer").onmousedown = function() { alert("outerp"); } document.onmousedown = function() { alert("document"); } } --> </script> </head> <body> <p id="outer" style="background-color:black; padding: 15px;"> <p id="inner" style="background-color:white; padding: 5px;"></p> </p> </body></html>
inner p outer p document
Aliran acara yang dicadangkan oleh Netscape Called penangkapan acara, ia agak bertentangan dengan IE. Peristiwa mula-mula diterima oleh elemen paling kurang spesifik dan kemudian disebarkan ke nod tertentu.
2. Pemprosesan acara peringkat DOM0
peristiwa dicetuskan oleh beberapa gelagat tertentu yang berlaku dalam halaman WEB. Contohnya, apabila anda menekan butang kiri tetikus pada elemen halaman tertentu, tekan kekunci papan kekunci tertentu, atau objek mendapat atau kehilangan fokus, peristiwa yang sepadan akan dicetuskan. Interaksi antara JavaScript dan HTML dicapai melalui acara. Kami menggunakan pendengar acara untuk "mendaftar" acara dan kod yang sepadan dilaksanakan apabila acara itu berlaku.
Pengendali acara DOM tahap 0 masih disokong oleh semua penyemak imbas kerana kesederhanaan dan sokongan merentas penyemak imbasnya.
Nyatakan pengendali acara melalui kaedah peringkat DOM0- ini dalam pengendali acara
- Padam pengendali acara melalui kaedah peringkat DOM0 Menentukan acara pengendali melalui kaedah peringkat DOM0
Menentukan pengendali acara melalui kaedah peringkat DOM0 adalah sangat mudah, mula-mula, dapatkan rujukan kepada elemen yang akan dikendalikan, dan kemudian tetapkan fungsi kepada elemen yang sepadan
. (Setiap elemen termasuk tetingkap dan dokumen mempunyainya sendiri.) Ambil perhatian bahawa pengendali acara yang ditambahkan dengan cara ini akan diproses semasa fasa menggelegak aliran acara. 事件处理程序属性
事件处理程序属性
Mengenai atribut pengendali acara, perkara berikut perlu dijelaskan:
1 Atribut pengendali acara semuanya huruf kecil, bermula dengan "on", diikuti dengan jenis acara:
2 Setiap elemen seperti img, a, input, borang termasuk tetingkap dan dokumen mempunyai atribut pengendali acara sendiri. Contohnya:onclick //单击鼠标 onload //图像或页面载入完成 onmouseover //将鼠标移动到某元素上面 onmousemove //移动鼠标 onfocus //对象获得焦点
document.getElementById("btn1").onclick //btn1上单击鼠标 document.getElementById("img1").onmouseover //鼠标移动到img1 document.getElementById("img1").onmerror //img1图像无法载入
dalam pengendali acara
var pic1 = document.getElementById("img1"); pic1.onmouseover = function() { alert("This is a nice pic!"); };
. Oleh itu, pengendali acara ini merujuk kepada elemen itu! Mari kita ilustrasikan dengan contoh berikut:
Padamkan pengendali acara melalui kaedah peringkat DOM0元素方法
Untuk memadamkan pengendali acara, cuma tetapkan atribut pengendali acara yang sepadan kepada null:
<input id="btn1" type="button" value="Click Me" /> ...//省略 <script type="text/javascript"> <!-- var btn1 = document.getElementById("btn1"); btn1.onclick = function() { alert(this.id + "\n" + this.type + "\n" + this.value); }; --> </script>
3. Pemprosesan acara peringkat DOM2
1 addEventListener dan removeEventListener
pic1.onmouseover = null;
1 DOM2 tidak bergantung pada atribut pengendali acara
2 bantah pada masa yang sama Ikut perintah pendaftaran.
- DOM2 mentakrifkan 2 kaedah: Semua nod DOM mengandungi dua kaedah ini adalah seperti berikut. Kedua-duanya menerima 3 parameter nama acara untuk diproses (tidak termasuk pada), fungsi pemprosesan acara ke-2 dan pembolehubah Boolean ke-3:
Sebagai contoh, kami menambah 2 pengendali acara untuk acara klik butang btn1, pemprosesan acara Program diproses dalam peringkat acara menggelegak:
addEventListener() //指定事件处理程序 removeEventListener() //删除事件处理程序
Apabila butang btn1 diklik, kotak dialog akan muncul dalam urutan:
Kami boleh menggunakan kaedah removeEventListener() untuk memadam kami Bagi pengendali acara yang baru dinyatakan, sila ambil perhatian bahawa parameter mesti konsisten:<input id="btn1" type="button" value="Click Me" /> ... <script type="text/javascript"> <!-- var btn1 = document.getElementById("btn1"); var handle1 = function() { alert("handle1!"); } var handle2 = function() { alert("handle2!"); } btn1.addEventListener("click", handle1, false); btn1.addEventListener("click", handle2, false); --> </script>
handle1! handle2!
Adalah penting untuk ambil perhatian bahawa jika kami menggunakan fungsi tanpa nama untuk menentukan pengendali acara, kami tidak boleh menggunakan kaedah removeEventListener() untuk mengalih keluar pengendali acara:
btn1.addEventListener("click", function(){ alert("click!"); }, false); btn1.removeEventListener("click", function(){ alert("click!"); }, false); //无法取消!
这样是无法取消以上指定的事件处理程序的!因为上面addEventListener和removeEventListener中的2个事件处理函数虽然代码相同,实质上是2个不同的函数引用。
另外,强调一点,以上两个函数的第一个参数(要处理的事件名)是没有on前缀的。这一点和IE不同,后面会说明。
tips: IE9, Firefox, Safari, Chrome以及Opera均支持DOM2级事件处理程序。
DOM2事件处理程序中的this
DOM2事件处理程序和DOM0相同,它们的this都在其依附的元素作用域中运行。this的指代参考DOM0的示例。这里之所以要特别指出DOM2的this,是为了和IE事件处理程序进行区分。IE中事件处理程序this与事件指定方式有关。
四、IE事件处理程序及跨浏览器支持
attachEvent()与detachEvent()
IE并没有提供对W3C事件模型的支持,其实现了2个和DOM2模型类似的方法:
attachEvent() detachEvent()
这两个方法只接收2个参数:事件名称以及事件处理函数。由于IE8及更早版本只支持事件冒泡,这两个方法添加的事件处理程序会在事件冒泡阶段被执行。
和DOM2不同的是:
- 1、IE事件处理方法运行作用域为全局作用域,this指代window;
- 2、第一个参数事件名以on为前缀;
- 3、当为同一对象的相同事件指定多个处理程序时,执行顺序和DOM2相反,IE中以添加它们的相反顺序执行。
例如:
<input id="btn1" type="button" value="Click Me" /> ... <script type="text/javascript"> <!-- var btn1 = document.getElementById("btn1"); var handle1 = function() { alert("handle1!" + "\n" + (this === window)); }; var handle2 = function() { alert("handle2!"+ "\n" + (this === window)); }; btn1.attachEvent("onclick", handle1); btn1.attachEvent("onclick", handle2); --> </script>
执行结果:
handle2! true handle1! true
跨浏览器支持
虽然可以使用屏蔽浏览器差异的JS库,实际上,我们自己编写一个跨浏览器兼容的事件处理代码并不是一件困难的事情,同时更有利于我们对原生JavaScript的学习理解。我们使用一个习惯上称为EventUtil的对象来进行跨浏览器事件处理:
var EventUtil = { addEventHandler : function(element, eventType, handler) { if(element.addEventListener){ element.addEventListener(eventType, handler, flase); } else if(element.attachEvent) { element.attachEvent("on" + eventType, handler); } else { element["on" + eventType] = handler; } }, removeEventHandler : function(element, eventType, handler) { if(element.aremoveEventListener){ element.addEventListener(eventType, handler, flase); } else if(element.detachEvent) { element.attachEvent("on" + eventType, handler); } else { element["on" + eventType] = null; } } }
为了保证事件处理代码能够在大多数浏览器中一致地运行,我们这里只关注冒泡阶段。以上代码使用浏览器能力检测,首先检测是否支持DOM2级方法addEventListener和removeEventListener,如果支持则使用该方法;如果不支持该方法,检测是否是IE8级更早版本的attachEvent或detachEvent方法,若支持则使用该方法;如果对以上2种方法都不支持,则使用DOM0级方法。要注意,DOM0级对每个事件只能指定一个事件处理程序。
以上对象使用示例如下:
var btn1 = document.getElementById("btn1");var handle1 = function() { alert("handle1!" + "\n" + (this === window)); };var handle2 = function() { alert("handle2!"+ "\n" + (this === window)); }; EventUtil.addEventHandler(btn1, "click", handler1); EventUtil.addEventHandler(btn1, "click", handler2); EventUtil.removeEventHandler(btn1, "click", handler2);
五、事件对象
在触发某个事件时,会产生一个event对象。该对象中包含与事件有关的信息。例如触发事件的元素、事件的类型、与特定事件相关的如鼠标位置信息等。
- 1、DOM事件对象
- 2、IE事件对象与跨浏览器事件对象
1、DOM事件对象
不论使用DOM0级还是DOM2级方法指定事件处理程序,事件触发时都会自动将一个event对象传入事件处理程序,例如:
var btn1 = document.getElementById("btn1"); btn1.onmouseover = function(evnt) { alert(evnt.type); }var handle = function(evnt) { alert(evnt.type); }; btn1.addEventListener("click", handle, false);
以上是一个简单的event对象的示例。event对象中的type属性是一个只读字符串属性,其中包含着事件的类型。例如我们上例中的click和onmouseover。event对象中包含有大量的有关事件的属性和方法(例如event.stopPropagation()方法可用于停止事件在捕获或者冒泡阶段的继续传播,preventDefault()方法会取消阻止事件的行)在此就不一一列举了。其中常用的如下:
属性/方法 | 值类型 | 读写 | 描述 |
---|---|---|---|
currentTarget | Element | readonly | 事件处理程序当前正在处理的元素 |
target | Element | readonly | 事件的目标 |
type | String | readonly | 触发事件的类型 |
preventDefault | Function | readonly | 取消事件默认行为,如链接的默认行为就是被单击时跳转到href指定的url |
stopPropagation | Function | readonly | 取消事件进一步冒泡或捕获 |
2、IE事件对象与跨浏览器事件对象
IE事件对象
在IE中,当使用DOM0级指定事件处理程序时,event对象被认为是window的一个属性,例如获取鼠标点击坐标的代码:
var mouseLoc = function() { var loc = "x: " + window.event.screenX + "\n" + "y: " + window.event.screenY; alert(loc); };
当使用attachEvent()方法指定事件处理程序时,event对象会被作为参数传入事件处理程序,我们将以上的代码重写:
var mouseLoc = function(event) { var loc = "x: " + event.screenX + "\n" + "y: " + event.screenY; alert(loc); }; btn1.attachEvent("onclick", mouseLoc);
IE中event对象的相关属性方法:
属性/方法 | 值类型 | 读写 | 描述 |
---|---|---|---|
cancelBubble | Boolean | read/write | 默认为false,置为true时取消事件冒泡(同DOM中stopPropagation) |
returnValue | Boolean | read/write | 默认为true,设为false取消事件默认行为(同DOM中preventDefault) |
srcElement | Element | readonly | 事件目标 |
type | String | readonly | 事件类型 |
跨浏览器事件对象
解决跨浏览器问题的思路是一贯的,我们可以对浏览器进行能力检测,这里我们对上面的EventUtil对象进行扩展,对我们学习原生JS,这是一个很漂亮的对象:
var EventUtil = { addEventHandler : function(element, eventType, handler) { if(element.addEventListener){ element.addEventListener(eventType, handler, flase); } else if(element.attachEvent) { element.attachEvent("on" + eventType, handler); } else { element["on" + eventType] = handler; } }, removeEventHandler : function(element, eventType, handler) { if(element.aremoveEventListener){ element.addEventListener(eventType, handler, flase); } else if(element.detachEvent) { element.attachEvent("on" + eventType, handler); } else { element["on" + eventType] = null; } }, getEvent: function (event) { return event ? event : window.event; }, getTarget: function (event) { return event.target || event.srcElement; }, preventDefault: function (event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, stopPropagation: function (event) { if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubbles = true; } }, getRelatedTarget: function (event) { if (event.relatedTarger) { return event.relatedTarget; } else if (event.toElement) { return event.toElement; } else if (event.fromElement) { return event.fromElement; } else { return null; } } }
【相关推荐:javascript学习教程】
Atas ialah kandungan terperinci Peristiwa menggelegak dan tangkapan masa acara JavaScript (perkongsian ringkasan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Soalan dan penyelesaian yang sering ditanya untuk percetakan tiket kertas terma depan dalam pembangunan front-end, percetakan tiket adalah keperluan umum. Walau bagaimanapun, banyak pemaju sedang melaksanakan ...

Tidak ada gaji mutlak untuk pemaju Python dan JavaScript, bergantung kepada kemahiran dan keperluan industri. 1. Python boleh dibayar lebih banyak dalam sains data dan pembelajaran mesin. 2. JavaScript mempunyai permintaan yang besar dalam perkembangan depan dan stack penuh, dan gajinya juga cukup besar. 3. Faktor mempengaruhi termasuk pengalaman, lokasi geografi, saiz syarikat dan kemahiran khusus.

Bagaimana cara menggabungkan elemen array dengan ID yang sama ke dalam satu objek dalam JavaScript? Semasa memproses data, kita sering menghadapi keperluan untuk mempunyai id yang sama ...

JavaScript adalah asas kepada pembangunan web moden, dan fungsi utamanya termasuk pengaturcaraan yang didorong oleh peristiwa, penjanaan kandungan dinamik dan pengaturcaraan tak segerak. 1) Pengaturcaraan yang didorong oleh peristiwa membolehkan laman web berubah secara dinamik mengikut operasi pengguna. 2) Penjanaan kandungan dinamik membolehkan kandungan halaman diselaraskan mengikut syarat. 3) Pengaturcaraan Asynchronous memastikan bahawa antara muka pengguna tidak disekat. JavaScript digunakan secara meluas dalam interaksi web, aplikasi satu halaman dan pembangunan sisi pelayan, sangat meningkatkan fleksibiliti pengalaman pengguna dan pembangunan silang platform.

Perbincangan mendalam mengenai punca-punca utama perbezaan dalam output konsol.log. Artikel ini akan menganalisis perbezaan hasil output fungsi Console.log dalam sekeping kod dan menerangkan sebab -sebab di belakangnya. � ...

Perbincangan mengenai realisasi kesan animasi tatal dan elemen Parallax dalam artikel ini akan meneroka bagaimana untuk mencapai yang serupa dengan laman web rasmi Shiseido (https://www.shiseido.co.jp/sb/wonderland/) ... ...

Sebaik sahaja anda telah menguasai tutorial TypeScript peringkat kemasukan, anda harus dapat menulis kod anda sendiri dalam IDE yang menyokong TypeScript dan menyusunnya ke dalam JavaScript. Tutorial ini akan menyelam ke dalam pelbagai jenis data dalam TypeScript. JavaScript mempunyai tujuh jenis data: null, undefined, boolean, nombor, rentetan, simbol (diperkenalkan oleh ES6) dan objek. Typescript mentakrifkan lebih banyak jenis atas dasar ini, dan tutorial ini akan meliputi semuanya secara terperinci. Jenis data null Seperti JavaScript, Null dalam TypeScript

JavaScript boleh dijalankan di PowerPoint, dan boleh dilaksanakan dengan memanggil fail JavaScript luaran atau membenamkan fail HTML melalui VBA. 1. Untuk menggunakan VBA untuk memanggil fail JavaScript, anda perlu mendayakan makro dan mempunyai pengetahuan pengaturcaraan VBA. 2. Benamkan fail HTML yang mengandungi JavaScript, yang mudah dan mudah digunakan tetapi tertakluk kepada sekatan keselamatan. Kelebihan termasuk fungsi lanjutan dan fleksibiliti, sementara kelemahan melibatkan keselamatan, keserasian dan kerumitan. Dalam praktiknya, perhatian harus dibayar kepada keselamatan, keserasian, prestasi dan pengalaman pengguna.
