Rumah hujung hadapan web tutorial js Mari kita bincangkan tentang pemahaman tentang mekanisme mesej JS dan kemahiran mekanisme_javascript acara

Mari kita bincangkan tentang pemahaman tentang mekanisme mesej JS dan kemahiran mekanisme_javascript acara

May 16, 2016 pm 03:05 PM

Mekanisme mesej/peristiwa ialah mekanisme yang terdapat dalam hampir semua bahasa pembangunan Ia bukan satu-satunya dalam bahasa, ia dipanggil mesej (Event), dan di beberapa tempat ia dipanggil (Mesej). , prinsipnya adalah serupa. Cuma beberapa kaedah pelaksanaan adalah lebih rumit. Nama bersatu peranti kami dipanggil mesej.

Konsep Asas Mesej

Terdapat beberapa pemula yang tidak biasa dengan mekanisme ini. Mari perkenalkan secara ringkas beberapa konsep asas Jika anda sudah biasa dengannya, anda boleh melangkau bahagian ini.
Mesej boleh difahami sebagai struktur data, termasuk bahagian asas berikut:

1. Sumber mesej: Ia adalah sumber mesej dan objek yang menghantar mesej

2. Nama mesej: Ia adalah pengecam unik mesej

3. Data mesej: data yang dilampirkan selepas mesej dihantar, data mungkin kosong

Mesej boleh dibahagikan kepada dua jenis:

1. Mesej sistem: mesej yang dihantar oleh sistem pengendalian atau sistem satu peranti Nama mesej ditetapkan.

2. Mesej tersuai: Mesej ditakrifkan oleh pembangun sendiri dan dihantar sendiri Nama mesej adalah sewenang-wenangnya dan boleh ditakrifkan sewenang-wenangnya.

Contoh:

Sebagai contoh, jika pengguna mengklik butang do_Button, mesej sistem akan dicetuskan, yang mengandungi 3 bahagian:

1. Sumber mesej: objek butang dalam klik pengguna

2. Nama mesej: sentuh

3. Data mesej: Mesej ini tidak disertakan dengan data

Sebagai contoh, pengguna mencetuskan acara tersuai melalui butang do_Button, yang mengandungi 3 bahagian:

1.Sumber mesej: objek butang

2. Nama mesej: Pengguna boleh mentakrifkannya seperti yang dikehendaki, ia boleh dipanggil aaa, bbb, ccc

3. Data mesej: Data yang dilampirkan ditetapkan apabila mesej dicetuskan

Mod Terbit/Langgan

Corak terbitkan/langganan ialah salah satu corak reka bentuk yang paling biasa digunakan dan merupakan teras mekanisme pemesejan Ciri-cirinya ialah mengurangkan gandingan supaya dua objek bebas tidak bergantung antara satu sama lain. Pengenalan ringkas, pelajar yang biasa boleh melangkaunya.

Mari kita gambarkan masalah ini dahulu dengan contoh mudah dari realiti, rujuk gambar di bawah:


Kita boleh lihat dari gambar ini

1. Pengguna dan penerbit tidak mengenali antara satu sama lain Pengguna tidak perlu tahu penerbit mana yang mereka mahukan diterbitkan;

2. Kedua-dua pengguna dan penerbit mesti tahu pejabat pos.

3. Pengguna perlu memberitahu pejabat pos nama dan alamat pengguna dan nama majalah yang mereka ingin langgan

4. Berbilang pengguna boleh melanggan majalah yang sama

5. Selepas pejabat pos menerima majalah, ia akan memberitahu pengguna satu persatu dan menghantar majalah kepada pengguna pada masa yang sama.

Selepas membaca contoh kehidupan sebenar di atas, mari lihat penerangan abstrak untuk menjadikannya lebih jelas Lihat gambar di bawah:

sepadan dengan penerangan contoh sebenar di atas:

1. Sistem/pembangun dan objek fungsi tidak bergantung antara satu sama lain Sistem/pembangun hanya mencetuskan mesej dan tidak peduli siapa yang menerimanya

2. Sistem/pembangun dan objek fungsi mesti boleh mendapatkan objek sumber mesej

3 Apabila objek fungsi melanggan mesej, ia perlu menunjukkan nama mesej dan rujukan kepada objek fungsi

4. Objek berbilang fungsi boleh melanggan mesej dengan sumber mesej yang sama dan nama yang sama

5 Apabila sumber mesej mencetuskan mesej, ia akan memberitahu semua pelanggan satu demi satu dan menghantar data ke objek fungsi panggil balik

Selepas membaca huraian abstrak, mari kita lihat contoh sebenar pembangunan deviceone, mengambil do_Button sebagai contoh.

1. Apabila pengguna mengklik pada butang dan menyentuhnya, sistem akan memperoleh objek butang sebagai sumber mesej dan melancarkan mesej "sentuhan" Mana-mana objek fungsi yang melanggan mesej "sentuhan". menerimanya. Mesej ini menyebabkan fungsi itu dilaksanakan.

//获取button对象
var btn_hello = ui("btn_hello");
//定义函数对象
function f(){
//当btn_hello这个按钮接收到手指点击就会执行下面的代码
deviceone.print("f 函数接收到点击触发消息")
}
function f(){
//当btn_hello这个按钮接收到手指点击就会执行下面的代码
deviceone.print("f 函数接收到点击触发消息")
}
//f,f订阅button的touch消息
btn_hello.on("touch",f);
btn_hello.on("touch",f);
Salin selepas log masuk

2. Kami boleh mentakrifkan dua mesej tersuai "message1" dan "message2" untuk objek butang, dan mempunyai dua objek fungsi melanggan kedua-dua mesej ini. Tetapi pada akhirnya, pembangun mesti mencetuskan mesej ini dengan memanggil fungsi api Ini adalah perbezaan daripada mesej sistem.

//获取button对象
var btn_hello = ui("btn_hello");
//定义函数对象
function f(d){
//当btn_hello这个按钮接收到开发者触发的消息message就会执行下面的代码
deviceone.print("f 函数接收到message消息,消息的数据是:"+d)
}
function f(d){
//当btn_hello这个按钮接收到开发者触发的消息message就会执行下面的代码
deviceone.print("f 函数接收到message消息,消息的数据是:"+d)
}
//f,f订阅button的touch消息
btn_hello.on("message",f);
btn_hello.on("message",f);
//触发消息
btn_hello.fire("message","data");
btn_hello.fire("message","data");
Salin selepas log masuk

看到这里,你肯定会奇怪,为什么我们要在button上自定义对象?这有神马意义?其实确实没有意义也没有必要,这里只是拿button举例子,在常规的开发中,基本不会这么用。

消息的使用

前面讲了这么多,现在才是deviceone消息的使用。使用其实很简单,上面的例子基本说明的了系统事件和自定义事件的使用方法。

有几个概念再说明一下

1.deviceone的所有对象,包括UI,MM,SM对象都可以是消息源

// SM对象可以是消息源
var page = sm("do_Page");
page.on("loaded",function()){
// 这个是page对象的系统消息,这个消息不需要手动触发,系统会自动触发
}
page.on("message",function(d)){
// 这个是page对象的自定义消息
}
page.fire("message","data");
// MM对象可以是消息源
var http = mm("do_Http");
http.on("result",function()){
// 这个是http对象的系统消息,这个消息不需要手动触发,接受到http服务端的反馈后会自动触发
}
http.on("message",function(d)){
// 这个是http对象的自定义消息
}
http.fire("message","data");
//UI对象可以是消息源
var alayout = ui("alayout_id");
alayout.on("touch",function()){
// 这个是alayout对象的系统消息,这个消息不需要手动触发,手机点击就会触发
}
alayout.on("message",function(d)){
// 这个是alayout对象的自定义消息
}
alayout.fire("message","data");
Salin selepas log masuk

2.消息源对象有作用域,所以订阅和触发的消息源必须是是一个作用域的同一个对象。这里结合数据分享和数据传递文档来理解。

看以下的例子,test1.ui和test2.ui有可能在一个page作用域,也有可能不在一个作业域,只有在一个作用域fire的消息才能正确送达回调函数。

判断是否一样,可以通过打印page的地址 page.getAddress().

//在test.ui.js里订阅消息
var page = sm("do_Page");
deviceone.print(page.getAddress());
page.on("message",function(d)){
deviceone.print(d);
}
//在test.ui.js触发消息
var page = sm("do_Page");
deviceone.print(page.getAddress());
page.fire("message","data");
Salin selepas log masuk

如果不在同一page作用域,则可以把消息订阅在2个page都能共享到的app作用域
上面的代码改成:

//在test.ui.js里订阅消息
var app = sm("do_App");
app.on("message",function(d)){
deviceone.print(d);
}
//在test.ui.js触发消息
var app = sm("do_App");
app.fire("message","data");
Salin selepas log masuk

3.同样的函数对象可以重复订阅一个对象源的消息,触发消息的时候会使函数执行多次,这是初学者经常犯的错误。

var page = sm("do_Page");
var count = ;
function f(){
deviceone.print("执行次数"+(count++));
}
page.on("message",f);
page.on("message",f);
page.fire("message");
Salin selepas log masuk

看上面的例子,如果执行的话,会打印2此,因为订阅了2次,或许你会说谁会写这样的代码?实际情况肯定没有这么容易看出来执行了重复的on函数,实际情况经常是比如在点击事件里执行on函数,每点击一下按钮,就重复订阅一次。

4.消息的订阅一定要在消息的触发之前,这是初学者经常犯的错误。

var page = sm("do_Page");
var count = ;
function f(){
deviceone.print("执行次数"+(count++));
}
page.fire("message");
page.on("message",f);
Salin selepas log masuk

看上面的例子,如果执行的话,会没有效果,或许你会说谁会写这样的代码?实际情况肯定没有这么容易看出来顺序反了,实际情况经常是比如on函数执行在某一个函数的回调函数里,你无法确定回调函数啥时候执行,是否是在fire之前执行。一般碰到这种情况可以加几个deviceone.print打印一下看看是on先执行还是fire先执行。

5.有订阅就有取消订阅,取消订阅是off函数,之所以很少用,是因为closePage的时候会自动把当前page作用域订阅的消息全部释放。

但是如果消息订阅在app作用域,就要注意,可能需要手动去取消订阅。否则就会出现触发消息的时候会使函数执行多次的问题。

var page = sm("do_Page");
var count = ;
function f(){
deviceone.print("执行次数"+(count++));
}
page.on("message",f);
page.fire("message");
.page.off("message");
page.fire("message");
Salin selepas log masuk

看上面的例子,打印只会执行一次,因为fire一次后就取消订阅了。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana saya membuat dan menerbitkan perpustakaan JavaScript saya sendiri? Bagaimana saya membuat dan menerbitkan perpustakaan JavaScript saya sendiri? Mar 18, 2025 pm 03:12 PM

Artikel membincangkan membuat, menerbitkan, dan mengekalkan perpustakaan JavaScript, memberi tumpuan kepada perancangan, pembangunan, ujian, dokumentasi, dan strategi promosi.

Bagaimanakah saya mengoptimumkan kod JavaScript untuk prestasi dalam penyemak imbas? Bagaimanakah saya mengoptimumkan kod JavaScript untuk prestasi dalam penyemak imbas? Mar 18, 2025 pm 03:14 PM

Artikel ini membincangkan strategi untuk mengoptimumkan prestasi JavaScript dalam pelayar, memberi tumpuan kepada mengurangkan masa pelaksanaan dan meminimumkan kesan pada kelajuan beban halaman.

Apa yang perlu saya lakukan jika saya menghadapi percetakan kod yang dihiasi untuk resit kertas terma depan? Apa yang perlu saya lakukan jika saya menghadapi percetakan kod yang dihiasi untuk resit kertas terma depan? Apr 04, 2025 pm 02:42 PM

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 ...

Bagaimanakah saya boleh debug kod javascript dengan berkesan menggunakan alat pemaju pelayar? Bagaimanakah saya boleh debug kod javascript dengan berkesan menggunakan alat pemaju pelayar? Mar 18, 2025 pm 03:16 PM

Artikel ini membincangkan debugging JavaScript yang berkesan menggunakan alat pemaju pelayar, memberi tumpuan kepada menetapkan titik putus, menggunakan konsol, dan menganalisis prestasi.

Bagaimana saya menggunakan kerangka koleksi Java dengan berkesan? Bagaimana saya menggunakan kerangka koleksi Java dengan berkesan? Mar 13, 2025 pm 12:28 PM

Artikel ini meneroka penggunaan rangka koleksi Java yang berkesan. Ia menekankan memilih koleksi yang sesuai (senarai, set, peta, giliran) berdasarkan struktur data, keperluan prestasi, dan keselamatan benang. Mengoptimumkan penggunaan pengumpulan melalui cekap

Bagaimanakah saya menggunakan peta sumber untuk debug kod JavaScript minified? Bagaimanakah saya menggunakan peta sumber untuk debug kod JavaScript minified? Mar 18, 2025 pm 03:17 PM

Artikel ini menerangkan cara menggunakan peta sumber untuk debug JavaScript minifikasi dengan memetakannya kembali ke kod asal. Ia membincangkan membolehkan peta sumber, menetapkan titik putus, dan menggunakan alat seperti Chrome Devtools dan Webpack.

TypeScript untuk pemula, Bahagian 2: Jenis Data Asas TypeScript untuk pemula, Bahagian 2: Jenis Data Asas Mar 19, 2025 am 09:10 AM

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

Bermula dengan Chart.js: Pie, Donut, dan Carta Bubble Bermula dengan Chart.js: Pie, Donut, dan Carta Bubble Mar 15, 2025 am 09:19 AM

Tutorial ini akan menerangkan cara membuat carta pai, cincin, dan gelembung menggunakan carta.js. Sebelum ini, kami telah mempelajari empat jenis carta carta.js: carta baris dan carta bar (tutorial 2), serta carta radar dan carta rantau polar (Tutorial 3). Buat carta pai dan cincin Carta pai dan carta cincin sangat sesuai untuk menunjukkan perkadaran keseluruhan yang dibahagikan kepada bahagian yang berlainan. Sebagai contoh, carta pai boleh digunakan untuk menunjukkan peratusan singa lelaki, singa wanita dan singa muda dalam safari, atau peratusan undi yang diterima oleh calon yang berbeza dalam pilihan raya. Carta pai hanya sesuai untuk membandingkan parameter tunggal atau dataset. Harus diingat bahawa carta pai tidak dapat menarik entiti dengan nilai sifar kerana sudut kipas dalam carta pai bergantung pada saiz berangka titik data. Ini bermaksud mana -mana entiti dengan perkadaran sifar

See all articles