js函數(shù)中onmousedown和onclick的區(qū)別和聯(lián)系探討
更新時間:2013年05月19日 15:20:32 作者:
了解這兩個事件的區(qū)別,但是實際并沒有使用到這兩個事件的區(qū)別去做一些操作,通常使用onclick的時候也可以使用onmousedown,使用onclick的時候更多一些
這兩個事件很常見。
了解這兩個事件的區(qū)別,但是實際并沒有使用到這兩個事件的區(qū)別去做一些操作。
通常使用onclick的時候也可以使用onmousedown,使用onclick的時候更多一些。
今天碰到了非使用onmousedown不可的時候,故特此記錄。
先說一下區(qū)別:onclick是在鼠標(biāo)點擊彈起之后觸發(fā)的事件。onmousedown是在鼠標(biāo)按下之后觸發(fā)的事件。
簡單的說onclick = onmousedown + onmouseup;
如果在某個地方按下鼠標(biāo)后移開鼠標(biāo)在另外一個地方松開鼠標(biāo)會觸發(fā)onmousedown事件,但是onclick事件卻不會被觸發(fā)。
我們今天要實現(xiàn)的功能是點擊a標(biāo)簽,切換到另外一個頁面,在原頁面關(guān)閉之前需要觸發(fā)一個函數(shù)。不是windowunload。
之前使用的是onclick事件,IE中測試無問題,但是在FF中測試發(fā)現(xiàn),在頁面被銷毀之前還沒有來得及執(zhí)行這個函數(shù)。
如果使用onmousedown事件,雖然也沒有辦法保證該函數(shù)一定被執(zhí)行,但是為該函數(shù)的執(zhí)行爭取了一定的時間,因為跳轉(zhuǎn)是在鼠標(biāo)彈起之后執(zhí)行的。
解決辦法一:onclick="return test()",當(dāng)且僅當(dāng)當(dāng)該函數(shù)返回true之后才執(zhí)行跳轉(zhuǎn)。這樣導(dǎo)致了一個新的問題。如果我們在test函數(shù)中執(zhí)行了多線程程序或者新開線程的程序后,會先返回true,跳轉(zhuǎn),新開的線程就沒有被執(zhí)行。如下面的函數(shù):
function test()
{
(new Image()).src="1.html";
window.open("1.html","_new");
//alert("ok");
return true;
}
我在1.html文件中設(shè)置了<body onload="javascript:alert('ok')">,當(dāng)1.html并沒有被完全渲染結(jié)束時,跳轉(zhuǎn)已經(jīng)執(zhí)行了。new image函數(shù)也沒有保證已經(jīng)被執(zhí)行了。
在使用單一線程執(zhí)行函數(shù)時,可使用return test()這種方法。
解決辦法二:估計一下test函數(shù)的多線程函數(shù)的最長執(zhí)行速度,加入執(zhí)行時間為100.不在a標(biāo)簽中使用跳轉(zhuǎn)。在test函數(shù)中使用setTimeout(location.href="1.html",100)來執(zhí)行跳轉(zhuǎn)。
了解這兩個事件的區(qū)別,但是實際并沒有使用到這兩個事件的區(qū)別去做一些操作。
通常使用onclick的時候也可以使用onmousedown,使用onclick的時候更多一些。
今天碰到了非使用onmousedown不可的時候,故特此記錄。
先說一下區(qū)別:onclick是在鼠標(biāo)點擊彈起之后觸發(fā)的事件。onmousedown是在鼠標(biāo)按下之后觸發(fā)的事件。
簡單的說onclick = onmousedown + onmouseup;
如果在某個地方按下鼠標(biāo)后移開鼠標(biāo)在另外一個地方松開鼠標(biāo)會觸發(fā)onmousedown事件,但是onclick事件卻不會被觸發(fā)。
我們今天要實現(xiàn)的功能是點擊a標(biāo)簽,切換到另外一個頁面,在原頁面關(guān)閉之前需要觸發(fā)一個函數(shù)。不是windowunload。
之前使用的是onclick事件,IE中測試無問題,但是在FF中測試發(fā)現(xiàn),在頁面被銷毀之前還沒有來得及執(zhí)行這個函數(shù)。
如果使用onmousedown事件,雖然也沒有辦法保證該函數(shù)一定被執(zhí)行,但是為該函數(shù)的執(zhí)行爭取了一定的時間,因為跳轉(zhuǎn)是在鼠標(biāo)彈起之后執(zhí)行的。
解決辦法一:onclick="return test()",當(dāng)且僅當(dāng)當(dāng)該函數(shù)返回true之后才執(zhí)行跳轉(zhuǎn)。這樣導(dǎo)致了一個新的問題。如果我們在test函數(shù)中執(zhí)行了多線程程序或者新開線程的程序后,會先返回true,跳轉(zhuǎn),新開的線程就沒有被執(zhí)行。如下面的函數(shù):
復(fù)制代碼 代碼如下:
function test()
{
(new Image()).src="1.html";
window.open("1.html","_new");
//alert("ok");
return true;
}
我在1.html文件中設(shè)置了<body onload="javascript:alert('ok')">,當(dāng)1.html并沒有被完全渲染結(jié)束時,跳轉(zhuǎn)已經(jīng)執(zhí)行了。new image函數(shù)也沒有保證已經(jīng)被執(zhí)行了。
在使用單一線程執(zhí)行函數(shù)時,可使用return test()這種方法。
解決辦法二:估計一下test函數(shù)的多線程函數(shù)的最長執(zhí)行速度,加入執(zhí)行時間為100.不在a標(biāo)簽中使用跳轉(zhuǎn)。在test函數(shù)中使用setTimeout(location.href="1.html",100)來執(zhí)行跳轉(zhuǎn)。
您可能感興趣的文章:
- JS實現(xiàn)同一DOM元素上onClick事件與onDblClick事件并存的解決方法
- javascript中onclick(this)用法介紹
- js給onclick事件賦值,動態(tài)傳參數(shù)實例解說
- JavaScript給按鈕綁定點擊事件(onclick)的方法
- javascript 動態(tài)改變onclick事件觸發(fā)函數(shù)代碼
- IE8的JavaScript點擊事件(onclick)不兼容的解決方法
- js動態(tài)添加onclick事件可傳參數(shù)與不傳參數(shù)
- js修改onclick動作的四種方法(推薦)
- js onclick事件傳參講解
- 代碼觸發(fā)js事件(click、change)示例應(yīng)用
- JavaScript中click和onclick本質(zhì)區(qū)別與用法分析
相關(guān)文章
document.getElementById的簡寫方式(獲取id對象的簡略寫法)
在js編寫中,經(jīng)常需要獲取id對象,如果直接用getElementById來獲取,代碼多而且老的瀏覽器不支持這屬性,所有大家可以考慮用下面的代碼。2010-09-09
JavaScript中的call方法和apply方法使用對比
這篇文章主要介紹了JavaScript中的call方法和apply方法使用對比,需要的朋友可以參考下2015-08-08
2019年度web前端面試題總結(jié)(主要為Vue面試題)
轉(zhuǎn)眼2019又要過去了,作為一名前端碼農(nóng),又熬過一個沒日沒夜的年頭,頭發(fā)又少了不少,去年的學(xué)習(xí)計劃一半也沒完成,唉。。。 現(xiàn)在為大家總結(jié)一下這一年面試的幾家公司的關(guān)于前端面試題吧2020-01-01
THREE.JS入門教程(6)創(chuàng)建自己的全景圖實現(xiàn)步驟
Three.js是一個偉大的開源WebGL庫,WebGL允許JavaScript操作GPU,在瀏覽器端實現(xiàn)真正意義的3D,全景圖非??帷J褂肨hree.js做一個屬于自己的全景圖并不是那么困難,感興趣的朋友可以了解下啊,希望本文對你有所幫助2013-01-01

