`
shirlly
  • 浏览: 1661154 次
  • 性别: Icon_minigender_2
  • 来自: 福州
社区版块
存档分类
最新评论

setCapture和releaseCapture的小应用

阅读更多
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();
    }
}

4).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();
        }
    }
}

5).对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 LANGUAGE="JavaScript">... 
        <!--      
            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" style="width:500px;height:400px;border:1px solid #999;padding:2px" 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>

转自:http://blog.csdn.net/redleaf1995/archive/2008/03/06/2154784.aspx
分享到:
评论

相关推荐

    JS高级拖动技术 setCapture,releaseCapture

    在JavaScript中,`setCapture` 和 `releaseCapture` 是两个高级拖动技术中涉及的关键方法,主要用于处理鼠标事件的捕获。这两个方法主要用于在复杂的用户交互场景,特别是拖放操作时,确保事件处理的准确性和效率。...

    HTML中的setCapture和releaseCapture使用介绍

    HTML中的`setCapture`和`releaseCapture`是两个在Internet Explorer浏览器中特有的API,用于管理和控制鼠标事件的处理。这两个方法主要用于在拖动操作或需要持续监听鼠标事件时,确保事件能够正确地被目标元素捕获,...

    IE8利用自带的setCapture和releaseCapture解决iframe的拖拽事件方法

    在本文中,我们将深入探讨如何在IE8浏览器中解决iframe的拖拽事件问题,特别是利用IE特有的`setCapture`和`releaseCapture`方法。 首先,我们要明白在现代浏览器如Chrome中,实现拖拽功能相对简单,通常可以使用...

    捕捉鼠标,防止鼠标逃出窗口(2KB)...

    3. **SetCapture和ReleaseCapture方法**:在VB中没有直接的SetCapture和ReleaseCapture方法,但在WinAPI(Windows API)中提供了这样的功能。我们需要使用Declare语句引入这些API函数,然后在代码中调用它们来捕捉和...

    易语言拾色器

    在拾色器应用中,SetCapture可能用于在用户点击屏幕时捕获当前鼠标位置的颜色,而ReleaseCapture则在操作完成后释放捕获,防止干扰其他程序。 "StretchBlt"是另一个重要的Windows API函数,用于在设备上下文中执行...

    JS拖动技术 关于setCapture使用

    在实现拖动效果时,`setCapture` 和 `releaseCapture` 是两个重要的方法,它们主要用于处理鼠标事件的捕获与释放。下面将详细介绍这两个方法以及如何在拖动技术中应用它们。 `setCapture` 方法是HTML元素的一个属性...

    VC++鼠标捕捉的使用方法

    本篇文章将深入探讨如何在VC++环境下利用API函数`SetCapture()`和`ReleaseCapture()`来实现鼠标捕捉功能。 首先,理解鼠标捕捉的概念:当一个窗口捕获了鼠标,所有的鼠标输入(包括鼠标移动和按钮点击)都将被该...

    JS setCapture 区域外事件捕捉

    当使用setCapture方法将事件捕获后,该方法会将鼠标事件的监听器应用到整个文档的范围内,这意味着在这个对象之外发生的鼠标事件也将被捕获。但是,当不再需要事件捕获的时候,必须调用releaseCapture方法来释放这个...

    限制鼠标活动区域

    开发者可以利用API函数,如SetCapture和ReleaseCapture,来捕获和释放鼠标输入。当捕获窗口时,所有鼠标事件都会被该窗口接收,即使鼠标移动到窗口外部也是如此。通过这种方式,我们可以创建一个虚拟的“活动区域”...

    Javascript 事件捕获的备忘(setCapture,captureEvents)

    在IE中使用`setCapture`和`releaseCapture`,在其他遵循W3C标准的浏览器中使用`window.captureEvents`和`window.releaseEvents`。 需要注意的是,虽然事件捕获在某些情况下非常有用,但它也可能导致性能问题,因为...

    易语言窗口慢慢下沉

    分析这些源码可以更深入地理解这个过程,包括如何获取窗口句柄、如何计算移动的距离和速度、以及如何协调`SetCapture`和`ReleaseCapture`的使用。对于学习易语言和Windows GUI编程的开发者来说,这是一个宝贵的实践...

    易语言解决捕获鼠标时鼠标位置问题

    本文将深入探讨如何使用易语言解决在捕获鼠标时获取鼠标位置的问题,以及相关函数`SetCapture`和`ReleaseCapture`的使用方法。 首先,我们来理解“捕获鼠标”的概念。捕获鼠标意味着在程序运行期间,即使鼠标离开了...

    ddf.zip_Capture_DEMO_mouser

    2. **SetCapture和ReleaseCapture**:SetCapture用于开始捕获鼠标,ReleaseCapture则用于结束捕获。捕获开始后,所有鼠标消息(除了左键和右键单击)都会发送到捕获窗口,直到释放捕获。 3. **GetCapture的作用**:...

    易语言窗口无时钟吸附

    4. **SetCapture和ReleaseCapture**:这两个函数是Windows API中的关键部分,它们用于捕获和释放鼠标的输入。在实现吸附功能时,SetCapture可以确保鼠标移动时的事件都由当前窗口接收,即使鼠标离开了窗口边界,这样...

    易语言近在眼前超级列表框装饰阿目例程改进消除闪烁

    "SetCapture"和"ReleaseCapture"是Windows API中的两个关键函数,它们在易语言中同样可以使用。这两个函数涉及到窗口的消息捕获机制。`SetCapture`函数允许一个窗口捕获所有鼠标输入,即使鼠标离开了该窗口的边界,...

    虚拟鼠标VisualC++

    4. 鼠标拖放操作:可能需要结合SetCapture和ReleaseCapture函数来捕获和释放鼠标,以及MoveToEx和LineTo函数来绘制拖动轨迹。 5. 处理用户输入:程序需要监听键盘事件,如按键按下,然后根据用户的输入指令执行相应...

    VC中如何捕获和释放鼠标

    综上所述,掌握`SetCapture`和`ReleaseCapture`的使用,以及理解逻辑坐标和设备坐标之间的转换,对于创建具有高度交互性的VC++应用程序至关重要。在实际开发中,你可以参考提供的源代码(cvery.comvc23788224)学习...

    易语言调色板

    调色板是编程中常见的元素,尤其是在图形用户界面(GUI)设计中,它可以帮助开发者快速选取和应用所需的色彩。 源码的分享通常是为了学习和研究目的,对于易语言调色板源码,我们可以从中学习到以下几个关键知识点...

    Windows api 查询

    例如,GetAsyncKeyState获取按键状态,GetCursorPos获取鼠标位置,SetCapture和ReleaseCapture用于捕获和释放鼠标。 5. **内存管理**:Windows API提供了动态内存分配和释放的函数,如GlobalAlloc、LocalAlloc、...

Global site tag (gtag.js) - Google Analytics