setCapture和releaseCapture

来源:互联网 发布:清华大学网络学堂外网 编辑:程序博客网 时间:2024/05/29 11:12

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的关闭窗口等破坏性操作,将一些重要的操作能够在破坏性操作执行之前得到处理.

有一点遗憾:setCapturereleaseCapture 不支持键盘事件.只对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则是单数形式。

转自:

花落花相醉

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 加了低标号的油怎么办 别克车钥匙丢了怎么办 霜子哀伤断了怎么办 侧车窗外有雨水怎么办 昂科威15t变速箱异响怎么办 别克昂科拉一公里9毛怎么办? 雷诺科雷傲车钥匙丢了怎么办 奥迪a6l烧机油了怎么办 卡地亚手镯刮花怎么办 卡地亚戒指花了怎么办 手表摔了不走了怎么办 ck手表表扣很难打开怎么办 小天才泡了水怎么办 小天才手表掉水里了怎么办 小天才电话手表进水了怎么办 小天才手表进水了怎么办 小天才电话手表丢了怎么办 小天才电话手表黑屏怎么办 安全守护注册码忘记了怎么办 儿童安全锁的门打不开怎么办 守护宝老年机打不开了怎么办 小米电话手表坏了怎么办 小米手表带坏了怎么办 小米电话手表屏幕坏了怎么办 雷诺梅甘娜06款系统错乱怎么办 轿车碰了一个坑怎么办 车子卖了没过户怎么办 9岁儿童肠胃痉挛怎么办 鹿角胶水放多了怎么办 打胰岛素血糖还是高怎么办 血糖高打胰岛素降不下去怎么办 儿童低烧37度1怎么办 小孩发烧一会冷一会热怎么办 月子里得的风湿怎么办 腰窝中间凸起肉怎么办 线雕后一个月脸发红肿胀怎么办 雷诺氏病手指僵硬疼怎么办 哺乳妈妈吃咸了怎么办 吃流产药哺乳了怎么办 坐月子吃咸了怎么办啊 拔罐放血后头晕怎么办