zhyiwww
          用平實的筆,記錄編程路上的點點滴滴………
          posts - 536,comments - 394,trackbacks - 0
          /*********************************************************
          ?* @author ??? ??? ??? zhangyi
          ?* @email? ??? ??? ??? zhyiwww@163.com
          ?* @date ??? ??? ??? ? 2007-4-2
          ?*
          ?* 轉載請注明出處 http://www.aygfsteel.com/zhyiwww
          ?* @copyright ??? ???? zhangyi
          ?*********************************************************/


          這個功能,我花了好幾天的時間才實現,主要是在拉框的時候,我可以實現,但是,我想在松開鼠標的時候,進行自己的業務處理,但是,怎么也不能響應鼠標的mouseup事件,也看了不少的例子,都是只有拉框,在移動事件里面可以實現功能,但是,鼠標的抬起事件不能響應。有的,可以相應事件,但是要鼠標在多點一下,后來就找了好多的資料,了解了事件的處理,才把這個問題搞定。
          現在把代碼重新整理了一下,希望對大家能有所幫助。

          <html>
          ?? ?<head>
          ?? ??? ?<meta http-equiv="content-type" content="text/html; charset=gbk">
          ?? ??? ?<title>拉框</title>
          ?? ?</head>
          ?? ?<body>
          ?? ??? ?<div id='lay1'
          ?? ??? ??? ?onmousedown='down(event)'
          ?? ??? ??? ?onmouseup='up(event)'
          ?? ??? ??? ?onmousemove='move(event)'
          ?? ??? ??? ?style='top:30px;left:30px;width:400px;height:400px;visibility:visible;border:solid 1px blue;'
          ?? ??? ?>?? ??? ??? ?
          ?? ??? ??? ?<div id='rect'
          ?? ??? ??? ??? ?style='position:absolute;background-color: #FF99FF'?? ??? ??? ?
          ?? ??? ??? ?>?? ??? ??? ?
          ?? ??? ?</div>?? ?
          ?? ?</div>
          ?? ??? ?<script language="javascript">
          ?? ??? ??? ?
          ?? ??? ??? ?// 是否需要(允許)處理鼠標的移動事件,默認識不處理
          ?? ??? ??? ?var select = false;
          ?? ??? ??? ?
          ?? ??? ??? ?var rect = document.getElementById("rect");
          ?? ??? ??? ?// 設置默認值,目的是隱藏圖層
          ?? ??? ??? ?rect.style.width = 0;
          ?? ??? ??? ?rect.style.height = 0;
          ?? ??? ??? ?rect.style.visibility = 'hidden';
          ?? ??? ??? ?//讓你要畫的圖層位于最上層
          ?? ??? ??? ?rect.style.zIndex = 1000;
          ?? ??? ??? ?
          ?? ??? ??? ?// 記錄鼠標按下時的坐標
          ?? ??? ??? ?var downX = 0;
          ?? ??? ??? ?var downY = 0;
          ?? ??? ??? ?// 記錄鼠標抬起時候的坐標
          ?? ??? ??? ?var mouseX2=downX;
          ?? ??? ??? ?var mouseY2=downY;
          ?? ??? ??? ?
          ?? ??? ??? ?//處理鼠標按下事件
          ?? ??? ??? ?function down(event){
          ?? ??? ??? ??? ?// 鼠標按下時才允許處理鼠標的移動事件
          ?? ??? ??? ??? ?select = true;
          ?? ??? ??? ??? ?//讓你要畫框的那個圖層顯示出來
          ?? ??? ??? ???? //rect.style.visibility = 'visible';
          ?? ??? ??? ??? ?// 取得鼠標按下時的坐標位置
          ?? ??? ??? ??? ?downX = event.clientX;
          ?? ??? ??? ??? ?downY = event.clientY;
          ?? ??? ??? ??? ?
          ?? ??? ??? ??? ?//設置你要畫的矩形框的起點位置
          ?? ??? ??? ??? ?rect.style.left = downX;
          ?? ??? ??? ??? ?rect.style.top = downY;
          ?? ??? ??? ?}
          ?? ??? ??? ?
          ?? ??? ??? ?//鼠標抬起事件
          ?? ??? ??? ?function up(event){
          ?? ??? ??? ??? ?//鼠標抬起,就不允許在處理鼠標移動事件
          ?? ??? ??? ??? ?select = false;
          ?? ??? ??? ??? ?//隱藏圖層
          ?? ??? ??? ??? ?rect.style.visibility = 'hidden';
          ?? ??? ??? ?}
          ?? ??? ??? ?
          ?? ??? ??? ?//鼠標移動事件,最主要的事件
          ?? ??? ??? ?function move(event){
          ?? ??? ??? ??? ?
          ?? ??? ??? ??? ?// 取得鼠標移動時的坐標位置
          ?? ??? ??? ??? ?mouseX2 = event.clientX;
          ?? ??? ??? ??? ?mouseY2 = event.clientY;
          ?? ??? ??? ??? ?
          ?? ??? ??? ??? ?// 設置拉框的大小?? ?
          ?? ??? ??? ??? ?rect.style.width = Math.abs( mouseX2 - downX );
          ?? ??? ??? ??? ?rect.style.height = Math.abs( mouseY2 - downY );?? ?
          ?? ??? ??? ??? ?
          ?? ??? ??? ??? ?/*
          ?? ??? ??? ??? ?
          ?? ??? ??? ??? ?這個部分,根據你鼠標按下的位置,和你拉框時鼠標松開的位置關系,可以把區域分為四個部分,根據四個部分的不同,
          ?? ??? ??? ??? ?我們可以分別來畫框,否則的話,就只能向一個方向畫框,也就是點的右下方畫框.
          ?? ??? ??? ??? ?
          ?? ??? ??? ??? ?*/
          ?? ??? ??? ??? ?if(select){
          ?? ??? ??? ??? ??? ?
          ??? ?? ??? ??? ????rect.style.visibility = 'visible';
          ???
          ?? ??? ??? ??? ??? ?// A part
          ?? ??? ??? ??? ??? ?if( mouseX2 < downX && mouseY2 < downY ){
          ?? ??? ??? ??? ??? ??? ?rect.style.left = mouseX2;
          ?? ??? ??? ??? ??? ??? ?rect.style.top = mouseY2 ;?? ?
          ?? ??? ??? ??? ??? ?}
          ?? ??? ??? ??? ??? ?
          ?? ??? ??? ??? ??? ?// B part
          ?? ??? ??? ??? ??? ?if( mouseX2 > downX && mouseY2 < downY){
          ?? ??? ??? ??? ??? ??? ?rect.style.left = downX ;
          ?? ??? ??? ??? ??? ??? ?rect.style.top = mouseY2;?? ?
          ?? ??? ??? ??? ??? ?}
          ?? ??? ??? ??? ??? ?
          ?? ??? ??? ??? ??? ?// C part
          ?? ??? ??? ??? ??? ?if( mouseX2 < downX && mouseY2 > downY){
          ?? ??? ??? ??? ??? ??? ?rect.style.left = mouseX2;
          ?? ??? ??? ??? ??? ??? ?rect.style.top = downY ;?? ?
          ?? ??? ??? ??? ??? ?}
          ?? ??? ??? ??? ??? ?
          ?? ??? ??? ??? ??? ?// D part
          ?? ??? ??? ??? ??? ?if( mouseX2 > downX && mouseY2 > downY ){
          ?? ??? ??? ??? ??? ??? ?rect.style.left = downX ;
          ?? ??? ??? ??? ??? ??? ?rect.style.top = downY;
          ?? ??? ??? ??? ??? ?}?? ??? ??? ?
          ?? ??? ??? ?
          ?? ??? ??? ??? ?}
          ?? ??? ??? ??? ?/*
          ?? ??? ??? ??? ??? ?這兩句代碼是最重要的時候,沒有這兩句代碼,你的拉框,就只能拉框,在鼠標松開的時候,
          ?? ??? ??? ??? ??? ?拉框停止,但是不能相應鼠標的mouseup事件.那么你想做的處理就不能進行.
          ?? ??? ??? ??? ??? ?這兩句的作用是使當前的鼠標事件不在冒泡,也就是說,不向其父窗口傳遞,所以才可以相應鼠標抬起事件,
          ?? ??? ??? ??? ??? ?這個部分我也理解的不是特別的清楚,如果你需要的話,你可以查資料.但是這兩句話確實最核心的部分,
          ?? ??? ??? ??? ??? ?為了這兩句話,為了實現鼠標拉框,我搞了幾天的時間.
          ?? ??? ??? ??? ?*/
          ?? ??? ?? window.event.cancelBubble = true;
          ?? ??? ?? window.event.returnValue = false;?? ?

          ?? ??? ??? ??? ?
          ?? ??? ??? ??? ?function getDivOffsetLeft(){
          ?? ??? ??? ??? ??? ?var lay1 = document.getElementById("lay1");
          ?? ??? ??? ??? ??? ?//var rect = document.getElementById("rect");
          ?? ??? ??? ??? ??? ?return lay1.offsetLeft;
          ?? ??? ??? ??? ?}
          ?? ??? ??? ??? ?function getDivOffsetTop(){
          ?? ??? ??? ??? ??? ?var lay1 = document.getElementById("lay1");
          ?? ??? ??? ??? ??? ?//var rect = document.getElementById("rect");
          ?? ??? ??? ??? ??? ?return lay1.offsetTop;
          ?? ??? ??? ??? ?}
          ?? ??? ??? ?
          ?? ??? ??? ?}
          ?? ??? ??? ?
          ?? ??? ??? ?
          ?? ??? ??? ?
          ?? ??? ?</script>

          ?? ?</body>

          </html>



          |----------------------------------------------------------------------------------------|
                                     版權聲明  版權所有 @zhyiwww
                      引用請注明來源 http://www.aygfsteel.com/zhyiwww   
          |----------------------------------------------------------------------------------------|
          posted on 2007-04-03 16:04 zhyiwww 閱讀(6507) 評論(7)  編輯  收藏 所屬分類: javascript

          FeedBack:
          # re: javascript鼠標拉框(框選)的實現
          2007-04-03 16:18 | 山風小子
          博主,您好!
          您的程序我試過了,的確很棒!
          但稍微有些不足之處,留待改進,當鼠標單擊,雙擊時,那個粉紅色的框框會突然出現。
          希望您做的更好:)  回復  更多評論
            
          # re: javascript鼠標拉框(框選)的實現
          2007-04-03 18:17 | zhyiwww
          @山風小子
          因為在鼠標按下的時候就把層顯示出來了。所以會有閃爍感。
          你看上面上面的綠色的部分,就知道有什么不同了。
          現在把 rect.style.visibility = 'visible';放在了鼠標move事件里面,也就是只要在鼠標移動事件處理的時候才會去把這一個層顯示出來。就不會有問題了。
          你可以試一下。  回復  更多評論
            
          # re: javascript鼠標拉框(框選)的實現
          2007-04-03 19:48 | cresposhi
          路過,幫忙測試了一下,有點點小bug。當拉框鼠標超過容器(也就是相應鼠標事件的區域)后,再回到容器這個時候還是正常,但在容器里單擊被拉的框位置就會跑到鼠標的右下方,顯然就錯位了,呵呵。

          既然同樣是JSer,再多說兩句,給哥們一個建議吧,這些對事件和頁面坐標操作比較多的程序最好借助于prototype框架來寫,如果你用prototype就不會發生你所說的花了幾天時間,查了N多資料才搞定那兩行藍色的代碼的事情了,因為prototype里面已經給做了,并且很完美,且兼容瀏覽器,如果你說想知道原理,需要從底層來編寫,其實可以選擇讀prototype源碼來的更快更好。并且代碼也不會長到以致于我真的很難有耐性讀完,不過我還是堅持了,支持每一個JSer,呵呵。

          呵呵 我話太多,不好意思占用樓主這么多地方,也不知道我形容清楚了沒,如果有什么疑問可以來我博客交流,閃先!  回復  更多評論
            
          # re: javascript鼠標拉框(框選)的實現
          2007-04-03 21:46 | zhyiwww
          謝謝您的建議。我覺得你的這個信息可能會對我有更大的幫助。
          其實是因為我不知道,不是我不想用。我對javascript不是很熟悉,所以才會為了這個問題花了不少的時間,不過現在能自己通過找資料去獨立的解決這個問題也覺得挺有成就感的。隨著對JS的深入,可能就能夠接受更多的信息,可以使用更多的擴展。那么在實現功能上就可以更加靈活。  回復  更多評論
            
          # re: javascript鼠標拉框(框選)的實現
          2009-11-19 09:48 | reader
          請問個問題啊!能不能讓那個畫出來的粉框在畫選完之后還能在頁面中顯示啊?
            回復  更多評論
            
          # re: javascript鼠標拉框(框選)的實現[未登錄]
          2012-02-16 00:40 | kk
          試一下給document綁定mouseup事件,呵呵。  回復  更多評論
            
          # re: javascript鼠標拉框(框選)的實現[未登錄]
          2013-04-24 10:16 |
          能幫忙優化下嗎?既然是框選,方框最好是半透明吧(不擋住后面的內容)。能綜合上http://www.yuzi.me/Share/Opacity-Transp.html  回復  更多評論
            
          主站蜘蛛池模板: 酒泉市| 封丘县| 滦平县| 内江市| 常德市| 鸡东县| 鲁甸县| 昌邑市| 黄陵县| 泸溪县| 天等县| 曲麻莱县| 克山县| 团风县| 邵武市| 河西区| 泽库县| 房产| 吉木萨尔县| 贞丰县| 黄梅县| 锡林郭勒盟| 乳源| 刚察县| 吉首市| 嘉荫县| 和平县| 和顺县| 武鸣县| 巩留县| 荆门市| 乐都县| 宁晋县| 靖宇县| 襄樊市| 垦利县| 沁阳市| 建始县| 新化县| 淮阳县| 漯河市|