javascript小实例,阻止浏览器默认行为,真的能阻止吗?支持IE和标准浏览器的阻止默认行为的方法
看到这标题,是不是有点逆天的感觉,总感觉好狂拽炫酷,耳边隐隐约约传来一个声音:你这么叼,你咋不上天呢! ~~ 额,好吧!
话入正题,我为什么会提出这么一个问题呢?
阻止浏览器默认行为,真的能阻止吗?那到底是什么样的方案,我会有这样的质疑?
那,就是它了,别看,就是你:
//阻止浏览器默认行为触发的通用方法
function stopDefault(e){
//防止浏览器默认行为(W3C)
if(e && e.preventDefault){
e.preventDefault();
}
//IE中组织浏览器行为
else{
window.event.returnValue=fale;
return false;
}
}
没错,就是你,这个在网上一搜,基本上非常通用的解决方案,以前我也对这种方法深信不疑,觉得这是前辈们的多少次实践论证出来的东西,应该是精品,但是就在我写拖拽效果的时候,在阻止浏览器默认行为时,发现在IE8下,居然嗝屁了,
你不信?那就让我们一起来看看,上面的解决方案在IE8以下的表现吧!当然,标准浏览器是没有问题的啦,毕竟e.preventDefault() 方法还是杠杠的。
首先我们要明确一下,什么是浏览器的默认行为,举个栗子:
页面上有一行文字,如果我选中,然后拖动文字,那么文字可以被拖动,拖动后再松手,可能被选中的文字就去搜索了,由于此效果不好截图,你们自己去玩一下,那这一行为就是浏览器的默认行为;
再举个栗子:
页面上有一张图片,点击图片,然后拖动,图片会好像是复制了一份,然后也是可以被拖动,这也是浏览器的默认行为,看看IE下的截图:
这个样子的,你们应该司空见惯了吧,那浏览器厂家做的某些默认行为,我们为什么要想方设法的去阻止掉呢?因为我们在做某些效果的时候,浏览器的默认行为会影响我们的效果,比如说表单中的提交按钮,理论上的默认效果是我一点击就会将我的表单提交出去,
但现实情况可能并不希望它这样,所以我们需要阻止一下。
好了,我们来说说我们阻止浏览器的默认行为的神器吧,还是以图片和文字为例子,
<img src="1.jpg" id="img1" alt="">
<p id="text">圣诞节开发能顺利的烦恼时来得快耐腐蚀的快乐你发了十多年两三点扣年费是考虑到你发来看你</p>
这是我们页面上的一张图和一行文字,随便打的
window.onload = function(){
var oImg = document.getElementById("img1");
var oText = document.getElementById("text");
oImg.onmousedown = function(e){
stopDefault(e); }
oText.onmousedown = function(e){
stopDefault(e);
} //阻止浏览器默认行为触发的通用方法
function stopDefault(e){
//防止浏览器默认行为(W3C)
if(e && e.preventDefault){
e.preventDefault();
}
//IE中组织浏览器行为
else{
window.event.returnValue=false; //实际上在IE8以下,会报错
return false;
}
}
}
这是用我们的神器来写的一个小例子,意思是当鼠标按下去的时候,我们来阻止浏览器的默认行为,看看都有什么表现,如果图片和文字不能被拖动,说明是可以阻止默认行为的,如果不能,呵呵,你就惨了~
在标准浏览器上,good,没问题,完美,在IE上,IE9以上good,IE8下,呃呃(此处有音效),嗝屁了,它们依然快乐的到处游走,跟它们就没什么关系,由此可见,上面的神器是不足以来满足我们的要求的(毁三观啊)~
那现在的问题就变了,怎样才能全面兼容阻止浏览器的默认行为呢?这就是标题的后半段要讲的内容了(主角来了)!
首先,我们要肯定的是 e.preventDefault() 方法是绝对可以在标准浏览器下阻止默认行为的,但是(重点来了),我们今天不用这个方法,而是用 return false 这个熟悉的老朋友,当然关于return ,我们又可以讲一篇长长的博文,像老太太的裹脚布一样,
这里我们不讲多么的详细,就提几点:
return 表达式是结束函数执行,返回调用函数,没有返回结果,举个栗子:
function adc(){
var a=2;
var b=3;
var sum = 0;
return ; sum = a+b;
console.log(sum);
}
adc();
看上面的这个函数,如果没有return,那么console就会打印sum的值5,但是恰恰有个return,让函数在return后就不往下执行,而是返回到调用函数,所以就没有值了,
那么return false呢,一般是返回错误的处理结果;终止处理;阻止提交表单;阻止执行默认的行为等等,值得注意的是,执行return false,其实是执行了3个行为:
1、执行event.preventDefault(); 阻止浏览器的默认行为;
2、event.stopPropagation(); 阻止冒泡行为;
3、停止回调函数执行并立即返回。
所以用此方法的时候,必须要考虑,你是否会有阻止冒泡的需求,如果有,我们就必须要用 event.preventDefault();来阻止浏览器的默认行为了,我们还是来举个栗子吧(一向的风格就是例子胜于雄辩):
window.onload = function(){
var oImg = document.getElementById("img1");
var oText = document.getElementById("text"); oImg.onmousedown = function(e){
return false;
}
oText.onmousedown = function(e){
return false;
} }
还是用上面的例子,改写一下,看看效果如何, 恩,标准浏览器,杠杠的,再看IE,IE9以上依旧如此完美,IE8以下依旧那么飘逸,好吧,看来我们要解决的梗就是如何使IE8以下浏览器能乖一点!
要解决这个问题,我先介绍一个方法(闪亮登场):
setCapture() //意思是在窗口设置鼠标捕获
额,不懂,好吧,我也不懂,那我们就用例子来描述一下:
<input type="button" value="按钮一">
<input type="button" value="按钮二">
页面上有2个按钮
window.onload = function(){
var aInput = document.getElementsByTagName("input");
//设置全局捕获,当我们给一个元素设置全局捕获后,这个元素就会监听后续的所有事件,当有事件发生的时候,就会被当前设置了全局捕获的元素所触发 /*
ie : 有,并且有效果
ff : 有,但没有效果
chrome : 没有,会报错
*/ aInput[0].setCapture(); aInput[0].onclick = function(){
alert(1);
};
aInput[1].onclick = function(){
alert(2);
} }
分别给2个按钮设点击事件,并且给按钮一开一个小灶,给它设一个全局的鼠标捕获,我们来看看,谷歌下,会报错,不支持,火狐下,没有报错,也没有别的什么反应,一切正常,说明火狐是支持的,只是没反应(因为不报错),IE下,怪异情况就出现了
无论我的鼠标在哪里点击,都会弹出1,就算是点击按钮2,也会弹出1,点到窗口外,也会弹出1,这是为什么呢?我查了一下资料,大概的解释是:
函数功能:该函数在属于当前线程的指定窗口里设置鼠标捕获。一旦窗口捕获了鼠标,所有鼠标输入都针对该窗口,无论光标是否在窗口的边界内。同一时刻只能有一个窗口捕获鼠标。如果鼠标光标在另一个线程创建的窗口上,只有当鼠标键按下时系统才将鼠标输入指向指定的窗口。
通俗的意思是:当某个元素设置了全局鼠标捕获,那个这个元素就会监听后续发生的所以事件,当有事件发生的时候,就会被当前设置了全局捕获的元素触发,
所以,我们看上面例子的怪异表现,当鼠标点击的时候,就会被绑定了全局捕获的按钮一所触发,那会执行按钮一的点击事件,所以会弹出1;
那么它是怎么来阻止浏览器的默认行为的呢?举个栗子:
window.onload = function(){
var oImg = document.getElementById("img1");
var oText = document.getElementById("text"); oImg.onmousedown = function(e){
oImg.setCapture();
}
oText.onmousedown = function(e){
oText.setCapture();
} }
我们都知道这个在标准浏览器上是不行的,我们暂时不管,只看IE的,你会发现,在IE上,一下子就老实了,再也不到处跑了,这是为什么呢?用上面的解释就是,因为此时图片和文字都设了全局鼠标捕获,不管页面上有什么事件发生,都会转移到它们身上,我们又
没有给它们写move事件,所以就很乖乖的在那里不动了,明白了吗?
那我们给图片加个自定义的move事件,看看会怎样?(此时这里的图片是绝对定位的,样式我就不写了)
window.onload = function(){
var oImg = document.getElementById("img1");
oImg.onmousedown = function(ev){
var ev = ev || event;
var disX = ev.clientX - this.offsetLeft;
var disY = ev.clientY - this.offsetTop;
if(oImg.setCapture){
oImg.setCapture();
}
document.onmousemove = function(ev){
var ev = ev || event;
oImg.style.left = ev.clientX - disX + 'px';
oImg.style.top = ev.clientY - disY + 'px';
};
document.onmouseup = function(ev){
document.onmousemove = document.onmouseup = null;
if(oImg.releaseCapture){ //取消全局捕获
oImg.releaseCapture();
}
}; return false;
} }
运行一下,感觉整个世界都平静了,再也没有纷争了,所以浏览器都表现一致,这就是一个简易的拖拽效果,这就是我给我解决方案,不知道你们是否满意呢!嘻嘻~~
当然,需要特别注意的是(多啰嗦一句):
1、如果是需要阻止所有的默认事件,那么我们用return false 和 obj.setCapture() 方法一起用;
2、如果我们仅仅只是想阻止浏览器的默认行为,可以用event.preventDefault() 与 obj.setCapture()方法一起用,这里是考虑到冒泡;
好了,基本上就这些了,阻止冒泡方法我也试了一下,还是挺兼容的,代码我也贴一下,换算优惠大赠送吧!
if ( e.stopPropagation ){ //标准浏览器
e.stopPropagation();
}else{
//兼容IE的方式来取消事件冒泡
window.event.cancelBubble = true;
}
以上方法只是个人意见,如有什么理解的不对的,或者是有错误的地方,欢迎批评指正,也欢迎大家跟我交流技术方面的知识,谢谢大家!
ps:如果你看过我写的pc拖拽效果,请看的时候参考一下本文,哪里的阻止默认事件写错了,记得修改!
javascript小实例,阻止浏览器默认行为,真的能阻止吗?支持IE和标准浏览器的阻止默认行为的方法的更多相关文章
- JavaScript 小实例 - 表单输入内容检测,对页面的增删改
JavaScript 小实例 - 表单输入内容检测,对页面的增删改 效果体验地址:https://xpwi.github.io/js/JavaScript01/jsForm.html 功能: 1.向页 ...
- JavaScript小实例:拖拽应用(二)
经常在网站别人的网站的注册页中看到一个拖拽验证的效果,就是它的验证码刚开始不出来,而是有一个拖拽的条,你必须将这个拖拽条拖到底,验证码才出来,说了感觉跟没说一样,你还是不理解,好吧,我给个图你看看: ...
- javascript小实例,拖拽应用(一)
前面我们将了一下拖拽的基本思想,理论是有了,那实践呢,可以运用到什么地方呢?下面就给大家带来一个用拖拽思想写的一个小实例,供大家参考,大致效果看下图: 就是这样一个简单的一个拖拽条,你可以把它理解为滚 ...
- javascript小实例,PC网页里的拖拽
几年前,我参与设计开发一个房产网的项目,我负责前端工作,由于项目经理要求比较高,参考了很多房产类网站比较优秀的功能,想把别人比较优秀的设计和想法集合到一起,那时的设计稿和功能实现,简直就是改了又改,今 ...
- javascript小实例,实现99乘法表及隔行变色
人生短暂,废话不多说,直奔主题! 这个小实例的要求: 实现在页面中输出99乘法表.(要求:以每三行为一组,实现隔行变色(颜色为白,红,黄(也可自己定义)),鼠标滑过每一行,行背景颜色变为蓝色,鼠标离开 ...
- javascript小实例,编写一个方法,实现从n-m个数中随机选出一个整数
别怪我是一个闷葫芦,没那么多花哨的语言,废话不多说,先说说小实例的要求: 编写一个方法,实现从n-m个数中随机选出一个整数,要求:传递的参数不足两个或者不是有效数字,返回[0-1]之间的随机数,需要解 ...
- javascript小实例,PC网页里的拖拽(转)
这是现在的效果,可能改了一些,原来的效果是,里面的这张图是可以上下左右拖动的,然后房子上面的显示的楼栋号,也跟着图片一起移动,当时js能力还不行,未能实现项目经理的要求,不过后来项目经理又把这个效果推 ...
- javascript小实例,多种方法实现数组去重问题
废话不多说,直接拿干货! 先说说这个实例的要求:写一个方法实现数组的去重.(要求:执行方法,传递一个数组,返回去重后的新数组,原数组不变,实现过程中只能用一层循环,双层嵌套循环也可写,只做参考): 先 ...
- javascript小实例,移动端页面中的拖拽
上文说到,想将移动端的拖拽说一说,那现在趁有时间,就将这个福利文带来了,哈哈! 在我还不知道怎么做移动端的手势操作的时候,我觉得这TM实在是太难了,这是多么高深的学问啊,手势操作耶,上滑下滑左滑右滑的 ...
随机推荐
- js方法实现--上传文件功能
function createUploadForm(fileElementId, data, curFileList) { var id = new Date().getTime(); var for ...
- CSS content换行实现字符点点点loading效果
CSS代码如下: dot { display: inline-block; height: 1em; line-height: 1; text-align: left; vertical-align: ...
- Git 常用命令整理(转)
初始化配置 #配置使用git仓库的人员姓名 git config --global user.name "Your Name Comes Here" #配置使用git仓库的人员em ...
- RCNN论文细节
写在前面: 本系列笔记主要记录本人在阅读过程中的收获,尽量详细到实现层次,水平有限,欢迎留言指出问题~ 这篇文章被认为是深度学习应用于目标检测的开山之作,自然是要好好读一下的,由于文章是前些日子读的, ...
- 如何理解opencv, python-opencv 和 libopencv?
转: OpenCV is a computer vision library written using highly optimized C/C++ code. It makes use of ...
- 轮播效果/cursor
cursor属性:改变鼠标中的属性 例如: cursor:pointer(鼠标移动上去变小手) <!doctype html> <html> <head> < ...
- ubuntu16.04开机时的.local问题
开机时显示:您的当前网络有.local域,我们不建议这样做而且这与AVAHI网络服务探测不兼容,该服务已被禁用 解决方法: 在终端输入:sudo gedit /etc/default/avahi-da ...
- LeetCode编程训练 - 回溯(Backtracking)
回溯基础 先看一个使用回溯方法求集合子集的例子(78. Subsets),以下代码基本说明了回溯使用的基本框架: //78. Subsets class Solution { private: voi ...
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- [Swift]LeetCode697. 数组的度 | Degree of an Array
Given a non-empty array of non-negative integers nums, the degreeof this array is defined as the max ...