Rumah hujung hadapan web tutorial js 让Firefox支持event对象实现代码_javascript技巧

让Firefox支持event对象实现代码_javascript技巧

May 16, 2016 pm 06:42 PM
firefox

通常为了兼容IE与FireFox,一般的事件处理方法为:

复制代码 代码如下:

btn.onclick=handle_btn_click;
function handle_btn_click(evt){
if(evt==null)evt=window.event;//IE
//处理事件.
}

对于简单的程序,这不算麻烦.
但对于一些复杂的程序,某写函数根本就不是直接与事件挂钩的.如果要把event传进该参数,那么所有的方法都要把event传来传去..这简直就是噩梦.
下面介绍一个解决这个麻烦事的方法,与原理.
JScript中,函数的调用是有一个 func.caller 这个属性的.
例如
复制代码 代码如下:

function A()
{
B();
}
function B()
{
alert(B.caller);
}

如果B被A调用,那么B.caller就是A
另外,函数有一个arguments属性. 这个属性可以遍历函数当前执行的参数:
复制代码 代码如下:

function myalert()
{
var arr=[];
for(var i=0;iarr[i]=myalert.arguments[i];
alert(arr.join("-"));
}
myalert("hello","world",1,2,3)

就能显示 hello-world-1-2-3
(arguments的个数与调用方有关,而与函数的参数定义没有任何关系)
根据这两个属性,我们可以得到第一个函数的event对象:
复制代码 代码如下:

btn.onclick=handle_click;
function handle_click()
{
showcontent();
}
function showcontent()
{
var evt=SearchEvent();
if(evt&&evt.shiftKey)//如果是基于事件的调用,并且shift被按下
window.open(global_helpurl);
else
location.href=global_helpurl;
}
function SearchEvent()
{
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
if(arg0.constructor==Event) // 如果就是event 对象
return arg0;
}
func=func.caller;
}
return null;
}

这个例子使用了SearchEvent来搜索event对象. 其中 'Event' 是 FireFox 的 event.constructor .
在该例子运行时,
SearchEvent.caller就是showcontent,但是showcontent.arguments[0]是空.所以 func=func.caller 时,func变为handle_click .
handle_click 被 FireFox 调用, 虽然没有定义参数,但是被调用时,第一个参数就是event,所以handle_click.arguments[0]就是event !
针对上面的知识,我们可以结合 prototype.__defineGetter__ 来实现 window.event 在 FireFox 下的实现:
下面给出一个简单的代码.. 有兴趣的可以补充(本人已经有修改)
复制代码 代码如下:


click here!!


javascript和JScript也是不相同的,前者是客户端的脚本,后者是服务端的脚本和VBScript一样被服务端所支持
当然我这里不是要说两者的区别,只是让自己了解到自己现在的水平(不是一般的差)...
如果就只给出了上面的代码,相信刚开始要搞兼容性的朋友一定很难看理解这些代码的用处
这里我就一一的解释下上面这些代码的用法吧
先看下__defineGetter__和__defineSetter__这两个方法的解释吧:
一.Getter是一种获取一个属性的值的方法,Setter是一种设置一个属性的值的方法。可以为任何预定义的核心对象或用户自定义对象定getter和setter方法,从而为现有的对象添加新的属性。
二.可以在什么时候对对象和事件添加新的属性?
1.在对象初始化时定义
2.在对象定义后通过Object的__defineGetter__、__defineSetter__方法来追加定义
详细的用法可以在请看这里对__defineGetter__、__defineSetter__的解释(地址:http://anbutu.javaeye.com/blog/post/194276)
所以我们看到了,在FixPrototypeForGecko()函数里分别给三个对象添加了属性,当然是在FF下对对象的添加:
HTMLElement添加了"runtimeStyle"属性,属性值为element_prototype_get_runtimeStyle函数的返回的值
window添加了"event"属性,属性值为window_prototype_get_event返回的值
Event添加了"srcElement"属性,基属性值为event_prototype_get_srcElement函数所返回的值
这样我们就为这三个对象在FF下扩展了新的属性
所以我们在判断浏览器是否为FF后执行FixPrototypeForGecko()过程,这个时候在FF下这三个对象的就有了新的属性
于是当我们点击DIV标签后在弹出的窗口中我们看到了"[object HTMLDivElement]"字样,也说明我们已经成功的为window对象添加了event属性
复制代码 代码如下:

if(window.addEventListener) {
FixPrototypeForGecko();
alert(window.event.srcElement)
}

大家可以看到element_prototype_get_runtimeStyle过程和event_prototype_get_srcElement过程所以返回的值都能很容易理解
那下面我们来看看window_prototype_get_event()过程是怎么样返回事件的
过程的返回值是SearchEvent()过程的结果,看下这个过程
复制代码 代码如下:

function SearchEvent()
{
//IE
if(document.all)
return window.event;
func=SearchEvent.caller;
while(func!=null)
{
var arg0=func.arguments[0];
if(arg0)
{
//if(arg0.constructor==Event||arg0.constructor==MouseEvent)
if(arg0.constructor==Event||arg0.constructor==MouseEvent || (typeof(arg0)=="object" && arg0.preventDefault && arg0.stopPropagation))
return arg0;
}
func=func.caller;
}
return null;
}

要明白这个过程就得先明白两个方法:caller和arguments(在文章上面有相应的解释)
在这里再解释下constructor构造者这个属性,返回的是对象的相应对象的创建者
在while循环里alert(func)我们就可以看到func.caller的返回了,最后一次返回的就是我们的鼠标点击事件了
因为handle_click()过程是我们在点击div后执行的,所以最后的func.caller就是我们的点击事件了,这个时候的funcj就是 handle_click(),那么也就相当于是handle_click.caller,当然handle_click的调用者当然就是onclick 事件了,也就是[MouseEvent]
可以看到我在 if(arg0.constructor==Event||arg0.constructor==MouseEvent)增加了一个条件,是因为arg0.constructor现在的结果就是MouseEvent
看到这里相信大家也知道在FF下怎样编写event了
最后再说下"addEventListener"为对象注册事件方法
复制代码 代码如下:

<script> <BR>function addObjectEvent(objId,eventName,eventFunc) <BR>{ <BR>var targetObj = document.getElementById(objId); <BR>if(targetObj) <BR>{ <BR>if(targetObj.attachEvent) <BR>{ <BR>targetObj.attachEvent(eventName,eventFunc); <BR>} <BR>else if(targetObj.addEventListener) <BR>{ <BR>eventName = eventName.toString().replace(/on(.*)/i,'$1'); <BR>targetObj.addEventListener(eventName,eventFunc,true); <BR>} <BR>} <BR>} <BR>function test1() <BR>{ <BR>alert('test1'); <BR>} <BR>function test2() <BR>{ <BR>alert('test2'); <BR>} <BR></script>
on click

<script> <BR>addObjectEvent('hi','onclick',test1); <BR>addObjectEvent('hi','onclick',test2);//先执行test2(队列) <BR></script>
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

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
3 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)

Topik panas

Tutorial Java
1665
14
Tutorial PHP
1269
29
Tutorial C#
1249
24
Bagaimana untuk mengalih keluar Firefox Snap dalam Ubuntu Linux? Bagaimana untuk mengalih keluar Firefox Snap dalam Ubuntu Linux? Feb 21, 2024 pm 07:00 PM

Untuk mengalih keluar FirefoxSnap dalam Ubuntu Linux, anda boleh mengikuti langkah berikut: Buka terminal dan log masuk ke sistem Ubuntu anda sebagai pentadbir. Jalankan arahan berikut untuk menyahpasang FirefoxSnap: sudosnapremovefirefox Anda akan digesa untuk kata laluan pentadbir anda. Masukkan kata laluan anda dan tekan Enter untuk mengesahkan. Tunggu pelaksanaan arahan selesai. Setelah selesai, FirefoxSnap akan dialih keluar sepenuhnya. Ambil perhatian bahawa ini akan mengalih keluar versi Firefox yang dipasang melalui pengurus pakej Snap. Jika anda memasang versi Firefox yang lain melalui cara lain (seperti pengurus pakej APT), anda tidak akan terjejas. Pergi melalui langkah-langkah di atas

Bolehkah mozilla firefox dinyahpasang? Bolehkah mozilla firefox dinyahpasang? Mar 15, 2023 pm 04:40 PM

Mozilla Firefox boleh dinyahpasang; Firefox ialah penyemak imbas pihak ketiga dan boleh dinyahpasang jika ia tidak diperlukan. Kaedah nyahpasang: 1. Dalam menu Mula, klik "Sistem Windwos" - "Panel Kawalan"; 2. Dalam antara muka "Panel Kawalan", klik "Program dan Ciri" 3. Dalam antara muka baharu, cari dan klik dua kali Ikon Pelayar Firefox; 4. Dalam tetingkap pop timbul, klik "Seterusnya" 5. Klik "Nyahpasang".

Ciri baharu Firefox 113: sokongan untuk animasi AV1, penjana kata laluan yang dipertingkatkan dan ciri gambar dalam gambar Ciri baharu Firefox 113: sokongan untuk animasi AV1, penjana kata laluan yang dipertingkatkan dan ciri gambar dalam gambar Mar 05, 2024 pm 05:20 PM

Menurut berita terkini, sementara Mozilla mengeluarkan versi stabil Firefox 112, ia juga mengumumkan bahawa versi utama seterusnya, Firefox 113, telah memasuki saluran Beta dan menyokong animasi AV1, penjana kata laluan yang dipertingkatkan dan ciri gambar dalam gambar. Fungsi/ciri baharu utama Firefox 113 adalah seperti berikut: Sokongan untuk imej animasi format AV1 (AVIS); Meningkatkan keselamatan penjana kata laluan dengan memperkenalkan aksara khas , dan dayakan skrin penuh dengan lebih mudah Mod menyediakan fail pemasangan DEB rasmi untuk pengedaran Debian dan Ubuntu ciri import penanda halaman yang dikemas kini, ikon untuk penanda halaman yang diimport disokong secara lalai Penyahkodan video AV1 dipercepatkan perkakasan didayakan secara lalai pada perkakasan yang disokong menggunakan w

Bagaimana untuk menggunakan Mozilla Firefox dalam Scrapy untuk menyelesaikan masalah mengimbas kod QR untuk log masuk? Bagaimana untuk menggunakan Mozilla Firefox dalam Scrapy untuk menyelesaikan masalah mengimbas kod QR untuk log masuk? Jun 22, 2023 pm 09:50 PM

Untuk perangkak merangkak tapak web yang memerlukan log masuk, kod pengesahan atau log masuk kod imbasan adalah masalah yang sangat menyusahkan. Scrapy ialah rangka kerja perangkak yang sangat mudah digunakan dalam Python, tetapi apabila memproses kod pengesahan atau mengimbas kod QR untuk log masuk, beberapa langkah khas perlu diambil. Sebagai pelayar biasa, Mozilla Firefox menyediakan penyelesaian yang boleh membantu kami menyelesaikan masalah ini. Modul teras Scrapy dipintal, yang hanya menyokong permintaan tak segerak, tetapi sesetengah tapak web memerlukan penggunaan kuki dan

Ubuntu 23.10 akan menjalankan Firefox dalam mod Wayland asli secara lalai Ubuntu 23.10 akan menjalankan Firefox dalam mod Wayland asli secara lalai Feb 29, 2024 am 10:10 AM

Canonical baru-baru ini mengumumkan bahawa dalam Ubuntu 23.10 yang akan datang, Firefox Snap telah dikonfigurasikan untuk dijalankan dalam mod Wayland secara lalai. Nota: Ubuntu kini mempunyai sesi Wayland secara lalai, dan Firefox juga boleh berfungsi seperti biasa. Walau bagaimanapun, pada masa ini FirefoxSnap sebenarnya berjalan dalam mod keserasian XWayland, bukannya mod Wayland asli yang ketat. Canonical mengumumkan bahawa ia akan menjalankan pelayar Firefox dalam mod Wayland secara lalai, supaya masalah seperti kabur antara muka dan herotan penskalaan tidak akan berlaku pada paparan HiDPI, dan ia akan menyokong gerak isyarat sentuh seperti menyeret dan mencubit. Seperti yang dinyatakan di atas, Ubuntu

Pelayar Firefox Firefox 115 dikeluarkan, menyokong versi terakhir Win7/Win8.1 Pelayar Firefox Firefox 115 dikeluarkan, menyokong versi terakhir Win7/Win8.1 Mar 04, 2024 pm 04:46 PM

Berita terkini hari ini, Mozilla secara rasmi mengeluarkan kemas kini versi stabil pelayar Firefox 115 hari ini Perkara yang paling penting tentang kemas kini ini ialah ini adalah versi terakhir yang menyokong Win7/Win8, macOS10.12, 10.13 dan 10.14. Alamat muat turun: https://ftp.mozilla.org/pub/firefox/releases/115.0/Mozilla dinyatakan dalam log kemas kini rasmi: Microsoft akan menamatkan sokongan untuk sistem Win7 dan Win8 pada Januari 2023, dan Firefox 115 dikeluarkan hari ini Versinya ialah kemas kini versi terakhir yang diterima oleh pengguna sistem tersebut. Pengguna Win7 dan Win8

Bagaimana untuk menyelesaikan masalah yang Font Awesome tidak dipaparkan dalam Firefox di bawah Apache/Nginx Bagaimana untuk menyelesaikan masalah yang Font Awesome tidak dipaparkan dalam Firefox di bawah Apache/Nginx May 21, 2023 pm 05:43 PM

1. penyelesaian pelayan nginx Pelayan menggunakan nginx Untuk menambah medan akses-control-allow-origin pada pengepala respons, kaedah menambah adalah menggunakan arahan add_header: Contoh konfigurasi: Salin kod seperti berikut: lokasi/aset/ {gzip_staticon; expiresmax;add_headercache-controlpublic;add_headeraccess-control-allow-origin*;} 2. Penyelesaian pelayan Apache hebat (firefox tidak boleh memaparkan api

Firefox 115 Beta dikeluarkan: Memperkenalkan Tindakan Pantas Firefox 115 Beta dikeluarkan: Memperkenalkan Tindakan Pantas Mar 04, 2024 pm 03:10 PM

Berita baharu semalam: Walaupun Mozilla mengeluarkan kemas kini versi stabil Firefox 114, ia juga mengalihkan fokus pembangunannya kepada versi Firefox 115 dan melancarkan versi Beta hari ini. Adalah diketahui daripada laporan bahawa Firefox 115 memperkenalkan butang CookieBannerReduction dan QuickActions yang pada asalnya dirancang untuk dilancarkan dalam versi 114. Selepas pengguna mendayakan CookieBannerReduction dalam Firefox versi 115 dan melawati tapak web yang disokong, penyemak imbas secara automatik akan menolak permintaan kuki pada cookiebanner. Ciri kedua ialah butang QuickActions pada bar alamat

See all articles