- 页面元素拖拽 -- HTML中的setCapture和releaseCapture
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 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>关于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则是单数形式。
相关推荐
Cocos Creator3.5.2使用Spine切换皮肤
3、然后获取当前spine中是否有皮肤数据,如果spine连皮肤数据都没有,接着写可能会error,这里的 skins[skin],是判断皮肤列表中是否有需要更换的皮肤。2、因为spine往往意味着异步加载,换肤时也经常出现频繁异步的情况,所以下一步我们要可以判断当前spine组件里是否已经加载好了spine文件。换肤前隐藏好需要换肤的节点,避免穿帮;官网文档的换肤流程太简化,对于实际使用来说会有各种各样的问题。1、首先获取对应的spine组件。这里的skin自然是外部传入的需要换肤的皮肤名。
微信小程序新增拖动组件:movable-view
小程序在520节日前夜,让程序员们又躁动了一把,更新了一些很诱人的功能,如内容转发API,iBeacon API,振动API,屏幕亮度调节API等,也增强了地图组件的功能
224G PAM-4 通道的 PCB 和封装设计
该行业正在努力实现层厚非常低的 sub-Dk = 3 材料,以及更先进的加工,这将使封装和 PCB 中的透射电镜截止值更高。当回波损耗占主导地位时,我们基本上需要去除沿互连产生阻抗失配的任何元件,就像上面描述的更光滑的铜和更低的 Dk 值一样。第二个影响是传输线阻抗匹配在 56 GHz 范围内的非常高的频率下非常困难的主要原因之一,另一个因素是 Tx 或 Rx 封装/缓冲器中的寄生效应。由于 PCB 和封装中的长度刻度,这是 BGA 上的焊盘、过孔和球等小结构开始在输入阻抗中产生明显偏差的频率范围。
微信小程序之---模版组件拖拽开发尝试
搜索了下小程序模版,找到了一个极速应用模版,专门开发小程序的,可以看到很多类型的模版,有复杂样式,常见组件,功能特点如下: 1.丰富的组件及模版可以拖拽组件,单独对组件元素设置各种属性而不需要一句代码 2.可以打包成微信开发工具源码可随时发布,随时扫描 3.包含完整详细的后台操作界面,数据管理,用户管理等 4.教程及社区问题讨论较为完善 但是。。。 看着很美好。。 其实我只想
DDR内存接口深度解析:从寻址机制到FPGA时序约束实战
在高速数字系统设计中,内存接口是决定系统性能与稳定性的关键。DDR(双倍数据速率)技术通过在时钟的上升沿和下降沿传输数据,实现了带宽的倍增,广泛应用于消费电子、通信设备和工控主板等领域。其核心原理在于利用三维存储阵列(Bank、Row、Column)的分级寻址机制,通过先进行行激活、再进行列访问的固定时序,实现高速数据吞吐。理解这一寻址顺序是进行精准时序分析的基础。在工程实践中,FPGA作为内存控制器,需通过严谨的时序约束(如set_input_delay)来确保信号在高速传输下的建立与保持时间要求,从而将
基于STM32的红外测温系统设计
为了实现本次的毕业设计,我搜集了大量的文献与资料,通过这些资料了解到红外测温的优点,与实现所需的基本器件,并设计了几个方案,最终选择了STM32作为主控芯片,为此还查阅了关于STM32的资料,在此次设计中采用的是MLX90614医用红外测温模块,通过查阅其数据手册了解其测量精度高且自带温度补偿,所以选择了该传感器作为红外测温模块,本次设计到此已经基本完成,硬件部分和软件部分的设计已基本完成。
基于jquery的页面元素拖拽组件
欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl
Stata实战入门:从数据导入到基础分析的全流程指南
本文提供了Stata实战入门的全流程指南,从数据导入、清洗到基础分析和可视化,帮助初学者快速掌握Stata的核心功能。通过详细的步骤和实用技巧,读者可以高效完成数据处理、变量操作、描述性统计和回归分析等任务,提升数据分析效率。
selenium实现浏览器截屏,拖拽页面元素
1.实现浏览器截屏//调用getscreenshotAs方法把当前浏览器打开的页面进行截图,保存到file对象中 File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); try { //把file对象转换为一个保存在c潘霞testing目录中名字为test.png的图片文件 //目标文
水文模型新手必看:用SWAT-CUP做参数率定,如何正确设置预热期、率定期和验证期?(附数据准备避坑指南)
本文详细介绍了使用SWAT-CUP进行水文模型参数率定的完整流程,重点解析了预热期、率定期和验证期的正确设置方法,并提供了数据准备的避坑指南。通过实操步骤和常见问题解决方案,帮助新手快速掌握SWAT-CUP参数率定的核心技巧,提升水文模型模拟精度。
用Multisim仿真AD630锁定放大器:从2012年电赛A题实战到避坑指南
本文详细介绍了如何使用Multisim仿真AD630锁定放大器,从2012年电赛A题实战出发,提供完整的电路搭建、参数优化及避坑指南。重点解析AD630的开关调制架构和双相位检测的工程实现,帮助读者在强噪声背景下有效提取微弱信号,提升电子设计竞赛和工程实践中的信号处理能力。
JavaScript经典案例:页面元素拖拽
效果展示: CSS代码: <style type="text/css"> #rect { position: absolute; width: 100px; height: 100px; line-height: 100px; text-align: center; background-color: plum; } #circle { position: absolute; width: 100px; height: 100px; line-h
File Load Error for Untitled.ipynb Unhandled error 解决方案
本文主要介绍了File Load Error for Untitled.ipynb Unhandled error 解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案
基于grid布局实现页面元素的动态拖拽替换
本人看见网上的都是基于flex布局的动态拖拽,就想尝试写一下grid布局的拖拽实现一下,于是有了本篇文章,本篇主要都是基于元素实现,文章主要时提供了一个思路,需要时请根据自己的实际需求更改或者封装。觉得不错记得点个赞:
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
精雕软件(JDpaint) 5.5 绿色版
精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版
拖动获取元素_如何实现页面元素的拖拽——JavaScript拖拽插件SortableJS
介绍演示地址: https://sortablejs.github.io/Sortable/Github:https://github.com/SortableJS/SortableSortableJS是一款用于在现代浏览器和触摸设备上的拖拽插件,不需要jQuery,但支持jQuery,支持Meteor,AngularJS,React,Polymer,Vue,Knockout和任何CSS库,例如B...
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
Vue拖拽组件实战指南:从零构建可自由布局的页面元素
还在为页面元素布局固定而烦恼吗?想要让用户能够自由拖动和调整页面上的组件大小?vue-draggable-resizable正是你需要的解决方案。这个专为Vue.js设计的组件,让实现拖拽调整功能变得像搭积木一样简单。想象一下,你的用户可以在页面上随心所欲地移动和调整各个模块,创造出完全个性化的界面布局,这种交互体验是不是很酷? ## 为什么你的项目需要拖拽调整功能? 在现代Web应用中,用户
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
selenium--拖拽页面元素
from selenium import webdriver import unittest from selenium.webdriver import ActionChains import time class Test_dragpage(unittest.TestCase): def test_dragpageElement(self): ...
利用JS实现页面元素拖拽
利用JS实现卡片拖拽 需求分析: 拖拽的流程: 当鼠标在被拖拽元素上按下时,开始拖拽(onmousedown) 当鼠标移动时被拖拽的元素跟随鼠标移动 ????️(onmousemove) 当鼠标松开时,被拖拽的元素固定在当前位置(onmouseup) 前置知识: 「1」通过JS修改或读取元素的CSS样式 「2」什么是事件对象?什么是事件冒泡?如何阻止事件冒泡?中的什么是事件对象。 编码详情: 一、创建一个盒子,????值为“box1” 二、编写JS代码 为什么需要计算盒子的偏移量呢❓ 是因为倘若我
java【selenium】拖拽页面元素
import static org.junit.jupiter.api.Assertions.*; import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api....
js实现页面元素的拖拽
平时在我们页面上,经常会悬浮着一些功能按钮,如帮助,联系客服等,按钮的显示比较简单,用定位悬浮在自己需要的位置上就行,比如下面的页面上我们展示一个帮助的按钮,用户点击后可以展示一些帮助的信息: 代码: 但是这样定位一般是固定在这个位置,如果这时候刚好【帮助按钮】挡住了这个位置原本有的其他操作按钮,那么我们就需要能够把【帮助按钮】拖开,不影响原本页面上的操作。一般实现拖动的思路是:在【帮助按钮】上鼠标按下时,记录下当前的坐标,以及原本相对于父元素的位置,然后监听【帮助按钮】的鼠标移动事件【onmousem
vue中使用zrender实现页面元素拖拽
业务描述 这也算是一个比较经典的页面交互,长按鼠标,可以将页面上的一些dom元素拖拽到指定区域,生成指定图形 所用到的技术就是h5的draggable属性和canvas画布,而本文所用的zrender,是一个对canvas的常见操作进行了简单封装的库(ps:著名的echarts.js底层就是又基于zrender构建的 准备工作 npm install zrender -S 代码 话不多说,直接上代码,一些坑我也会在后面指出 zrender可直接在组件中引入 // vue template层代码 <
前端JS拖拽页面元素
前端JS拖拽组件 代码如下: function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { //alert(ev.target.parentNode.previousElementSibling.id); ev.dataTransfer.setData("Text",e...
直播平台制作,WebDriver API 拖拽页面元素
以上就是直播平台制作,WebDriver API 拖拽页面元素, 更多内容欢迎关注之后的文章。直播平台制作,WebDriver API 拖拽页面元素。
前端实现页面元素拖拽
要实现拖拽的效果,有两种实现方式: 插件:Resizable | jQuery UI或者jquery-resizable-columns 原生:文章-怎么用 javascript 实现拖拽 mousedown:记录鼠标当前坐标mousemove:对比当前坐标与mousedown的坐标div宽 width : div.height +
利用PyUserInput页面元素实现拖拽
实际脚本编写中遇到,利用selenium2Library中drag and drop 和 by offset方法都不能实现拖拽的时候。多次尝试后,改用PyUserInput中的Pymouse,但是其中drag方法仍然不能实现拖拽,脑细胞死一片后,发现pymouse的drag方法中用了press和release方法,但并不能确定哪个方法导致的拖拽失效。后来换了种思路如下成功实现拖拽: #-*-c...
实现页面元素的拖拽(jqueryui实现)
之前实现元素的拖拽很多都是通过js手写的,后来发现使用jqueryui实现,简单特别多,而且能完成很多附加功能。 首先是最基本的用法。$(" ").draggable()就能实现指定元素的拖拽 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
1820



被折叠的 条评论
为什么被折叠?



