setCapture函数的作用就是将后续的mouse事件都发送给这个对象,releaseCapture就是将鼠标事件还回去,由 document、window、object之类的自行来处理。这样就保证了在拖动的过程中,不会由于经过了其它的元素而受到干扰。

另外,还有一个很重 要的事情是,在Win32上,mouse move的事件不是一个连续的,也就是说,并不是我们每次移动1px的鼠标指针,就会发生一个mousemove,windows会周期性检查mouse 的位置变化来产生mousemove的事件。

所以,如果是一个很小的页面对象,比如一个直径5px的圆点,如果没有setCapture和 releaseCapture,那么在鼠标按住之后,快速的移动鼠标,就有可能鼠标移动走了,但是小圆点还在原地,就是因为下一次的mousemove事 件已经不再发给这个圆点对象了。

web开发和windows开发最大的区别就是windows开发是有状态的,而web开发是无状态的,在windows中,一切操作都可以由程序来控制 ,除非强制执行ctrl+alt+del;但web操作就不一样了,即使执行很重要的操作,用户一点击浏览器关闭按钮,就将前面操作成果化为乌有.尽管可以在onunload事件中加些代码,让用户可以选择是否退出,但不能从根本上解决问题!

前几天,从网上看到setCapture方法,了解了一下,大体是这样的意思,当在IE文档某个区域中使用了这个方法,并且写了onclick或者 onmouse***等有关的鼠标事件方法,那么它就会监视相应的鼠标操作,即使你的鼠标移出了IE,它也一样能捕获到.如果你在某div中的 onclick事件中写了一个alert命令,这时,你点击的关闭按钮,它也一样会弹出alert窗口.releaseCapture与 setCapture方法相反,释放鼠标监控.

利用这个特性,我们可以延缓IE的关闭窗口等破坏性操作,将一些重要的操作能够在破坏性操作执行之前得到处理.

有一点遗憾:setCapture和releaseCapture 不支持键盘事件.只对onmousedown, onmouseup, onmousemove, onclick, ondblclick, onmouseover, onmouseout这样的鼠标事件起作用.

下面是一个小例子,若我们要对divMain这个div元素里面的内容进行保护:

1.对divMain执行setCapture方法: 
document.getElementById("divMain").setCapture();

2.加入一按钮btnChange,可以进行setCapture和releaseCapture切换,定义一全局变量;
var isFreeze = true;

3.在btnChange的onclick事件中,加入下列代码:

function change_capture(obj) {    isFreeze = !isFreeze;

    if(isFreeze) {        obj.value = "releaseCapture";        document.getElementById("divMain").setCapture();    } else {        obj.value = "setCapture";        alert('保存!');                        //可以执行重要操作        document.getElementById("divMain").releaseCapture();    }}

divMain的onclick事件中,加入下列代码:

function click_func(){    if(event.srcElement.id == "divMain")    {        alert("处理中...");                                                            //常规操作        document.getElementById("divMain").setCapture();    }    else    {        if(isFreeze && event.srcElement.id != "btnChange")        {            alert('未执行releaseCapture,不能点击');            document.getElementById("divMain").setCapture();        }    }}

对ALT+F4进行处理,在body的onkeydown事件中加入下列代码:

function keydown_func(){    if (event.keyCode==115 && event.altKey)            //ALT+F4    {        if(isFreeze)        {                alert('保存!');                                        //可以执行重要操作               }                        //window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");                    //return false;        }        document.getElementById("divMain").setCapture();}

完整代码如下:

<html>

  <head>    <title>      setCapture和releaseCapture的小应用    </title>    <script>      < !--      var isFreeze = true;

      function click_func() {        if (event.srcElement.id == "divMain") {          alert("处理中..."); //常规操作          document.getElementById("divMain").setCapture();        } else {          if (isFreeze && event.srcElement.id != "btnChange") {            alert('未执行releaseCapture,不能点击');            document.getElementById("divMain").setCapture();          }        }      }

      function keydown_func() {

        if (event.keyCode == 115 && event.altKey) //ALT+F4        {          if (isFreeze) {            alert('保存!'); //可以执行重要操作          }

          //window.showModelessDialog("about:blank","","dialogWidth:1px;dialogheight:1px");//return false;        }        document.getElementById("divMain").setCapture();      }

      function change_capture(obj) {        isFreeze = !isFreeze;        if (isFreeze) {          obj.value = "releaseCapture";          document.getElementById("divMain").setCapture();        } else {          obj.value = "setCapture";          alert('保存!'); //可以执行重要操作          document.getElementById("divMain").releaseCapture();        }      }      //--> 

    </script>  </head>

  <body onkeydown="keydown_func();">    <div id="divMain" onclick="click_func();">      点一下IE的菜单或者按钮看看:) 又或者IE窗口外的地方      <input type="button" value="releaseCapture" onclick="change_capture(this);"      id="btnChange">      <script language="javascript">        document.getElementById("divMain").setCapture();      </script>    </div>  </body>

</html>

关于javascript中call和apply函数的应用

我们经常在javascipt中的面向对象应用中遇到call和apply函数;有时会被搞糊涂。其实它们可以改变函数或对象中的this保留字的值;this保留字的默认值就是这个类本身。举例说明:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">

  <head>    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />    <script language="javascript">      test = {        value: 'default',exec: function() {          alert(this.value);        }      }      function hhh(obj) {        test.exec();test.exec.apply(obj);      }    </script>  </head>

  <body>    <input type="button" onclick="hhh(this);" value="test" />  </body>

</html>

运行以上的页面就很快明白了.

call和apply函数可以处理匿名函数

关于类的初始化应用如下:

Person = function() {  this.Init.apply(this, arguments);};Person.prototype = {  first: null,  last: null,  Init: function(first, last) {    this.first = first;    this.last = last;  },  fullName: function() {    return this.first + ' ' + this.last;  },  fullNameReversed: function() {    return this.last + ', ' + this.first;  }};

var s = new Person2('creese', 'yang');alert(s.fullName());alert(s.fullNameReversed());

call和apply函数可以赋值函数内容(带匿名参数;但不触发)

关于函数绑定事件应用如下:

Function.prototype.BindForEvent = function() {
var __m = this, object = arguments[0], args = new Array();
for(var i = 1; i < arguments.length; i++){
   args.push(arguments[i]);
}
return function(event) {
    return __m.apply(object, [( event || window.event)].concat(args));
}
}

call和apply函数关于函数绑定参数应用如下:

Function.prototype.Bind = function() {
var __m = this, object = arguments[0], args = new Array();
for(var i = 1; i < arguments.length; i++){
   args.push(arguments[i]);
}
return function() {
    return __m.apply(object, args);
}
}

call和apply函数功能是一样的;就是参数格式不同;fun.call(obj, arguments);apply的arguments是数组形式;call则是单数形式。

转自:

花落花相醉

setCapture和releaseCapture相关推荐

  1. 理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,是理解消息的关键)

    理解SetCapture.ReleaseCapture.GetCapture 正常情况下,鼠标指针位于哪个窗口区域内,鼠标消息就自动发给哪个窗口.如果调用了SetCapture,之后无论鼠标的位置在哪 ...

  2. win32中SetCapture 和 ReleaseCapture的使用

    最近在用win32写<visual C++经典游戏程序设计>中的扫雷游戏,在写到鼠标点击雷区的时候用到了SetCapture,和ReleaseCapture这对系统函数. 那么为什么需要用 ...

  3. setCapture和releaseCapture的小应用

    web开发和windows开发最大的区别就是windows开发是有状态的,而web开发是无状态的,在windows中,一切操作都可以由程序来控制 ,除非强制执行ctrl+alt+del;但web操作就 ...

  4. SetCapture()和ReleaseCapture()

    查MSND,对SetCapture()函数的说明为:"该函数在属于当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内.同一时刻只能有一 ...

  5. setCapture和releaseCapture的小应用(转)

    web开发和windows开发最大的区别就是windows开发是有状态的,而web开发是无状态的,在windows中,一切操作都可以由程序来控制 ,除非强制执行ctrl+alt+del;但web操作就 ...

  6. 关于SetCapture() 和 ReleaseCapture()的使用方法

    查MSND,对SetCapture()函数的说明为:"该函数在属于当前线程的指定窗体里设置鼠标捕获.一旦窗体捕获了鼠标,全部鼠标输入都针对该窗体,不管光标是否在窗体的边界内.同一时刻仅仅能有 ...

  7. 关于SetCapture() 和 ReleaseCapture()的用法

    http://blog.csdn.net/lanyzh0909/article/details/5543399 查MSND,对SetCapture()函数的说明为:"该函数在属于当前线程的指 ...

  8. 关于SetCapture() 和 ReleaseCapture()的用法的个人理解

    1. 函数功能:在当前线程的指定窗口里设置鼠标捕获.一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内还是边界外.同一时刻只能有一个窗口捕获鼠标. 2. 失效条件: A. 当鼠标 ...

  9. win32 SetCapture 和 ReleaseCapture的使用

    最近在用win32写<visual C++经典游戏程序设计>中的扫雷游戏,在写到鼠标点击雷区的时候用到了SetCapture,和ReleaseCapture这对系统函数. 那么为什么需要用 ...

最新文章

  1. Handler消息机制(六):Looper.loop()为什么不会阻塞主线程?
  2. Redis几个认识误区
  3. 完美解决 向UILable 文字最后插入N张图片,支持向限制行数的UILable 最后一行插入,多余文字显示......
  4. asp开发中存储过程应用全接触 _asp技巧
  5. GVA gin vue从后端接口获取多选下拉框数据
  6. 使用CArchive类进行序列化
  7. (原创)c#学习笔记08--面向对象编程简介02--OOP技术05--运算符重载
  8. 最浅显易懂的 SAPGUI 里 ABAP 调试器的使用方法介绍
  9. C#LeetCode刷题-随机数
  10. JavaScript重载解读
  11. 统计两个IP地址之间的IP个数
  12. 详解分级基金(杠杆基金)【精华】 【转】
  13. 计算机属于电器还是学习用品,大学生必备的3件学习用品,学生表示:很实用!...
  14. android webview 本地视频播放,Android中webview html5 自动播放本地视频
  15. Flutter—— 仿自如APP裸眼3D效果
  16. python编程查看gpu显存使用
  17. 第五届“强网”拟态防御国际精英挑战赛——特邀战队篇
  18. LeetCode876 --- 剑指Offer 22
  19. Win98 源代码(特别版)
  20. android 8.1 蓝牙打不开之CLOCK_BOOTTIME_ALARM问题

热门文章

  1. 前端--最具文艺范的程序员
  2. C++有符号和无符号整型
  3. 一批在线外语原版书库
  4. 《三星GT-I9082 ROOT图文简明教程》
  5. c51简单delay函数i的值跟延时的时间呈线性关系
  6. 禅道----禅道和Gitlab对接
  7. 小米系列手机adb devices提示找不到设备
  8. 小米2 不能连接调试的问题
  9. win2003搭建IIS
  10. EER(等概率错误)