几个兼容相关的重要函数

几个兼容相关的重要函数

1. 创建XMLHttpRequest对象

 1 function createXHR() {
 2     if (typeof XMLHttpRequest != "undefined") {
 3         return new XMLHttpRequest(); //IE7+和其他浏览器支持的
 4     }else if (typeof ActiveXObject != "undefined") { //IE7-支持的
 5             if (typeof arguments.callee.activeXString != "string") {
 6                 var versions = ["MSXML2.XMLHttp.6.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp"],
 7                 i, len;
 8                 for (i = 0, len = versions.length; i < len; i++) {
 9                 try {
10                         new ActiveXObject(versions[i]);
11                         arguments.callee.activeXString = versions[i];
12                         break;
13                 } catch (e) {
14                     //跳过
15                 }
16             }
17         }
18         return new ActiveXObject(arguments.callee.activeXString); //返回ActiveXObject对象
19     } else { //全部不支持,抛出错误
20     throw new Error("don‘t support XMLHttpRequest");
21     }
22 }
23
24 var xhr = createXHR();//在所有浏览器中创建XHR对象

2. 原生js实现跨浏览器的事件对象和事件处理程序

2.1 获取事件对象

1 var event=event || window.event;

2.2 获取事件源

event.srcElement是[IE8-]唯一的方式,IE9+未知,其它浏览器都支持标准的event.target方式

2.3 阻止事件默认行为

event.preventDefault()是标准方法,但[IE8-]不支持,IE自己的方式是event.returnValue = false;

2.4 阻止事件冒泡

event.stopPropagation()是标准方法,IE:event.cancelBubble = true;

小结一下:

  1. DOM中的事件对象
    (1) type:获取事件类型
    (2) target:事件目标
    (3) stopPropagation() 阻止事件冒泡
    (4) preventDefault() 阻止事件的默认行为
  2. IE中的事件对象
    (1) type:获取事件类型
    (2) srcElement:事件目标
    (3) cancelBubble=true阻止事件冒泡
    (4) returnValue=false阻止事件的默认行为

2.5 事件处理程序的添加和移除

DOM0级方式

1 ele.onclick = handler;//事件的绑定
2 ele.onclick=null;//事件的移除

注意:
1)要使用javascript指定事件处理程序,首先必须取得一个要操作的对象的引用;

2)程序中的this引用当前元素;(这一点与IE不同,要格外注意)
优点: 简单,全浏览器兼容
缺点:同一事件只能绑定/解绑一个事件处理程序

DOM2级方式

1 ele.add/removeEventListener(eventType, handler, catch);

接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。布尔值为true,表示在捕获阶段调用事件处理程序;false表示在冒泡阶段调用事件处理程序(一般在冒泡阶段)。

IE

1 ele.attach/detachEvent(‘on‘+eventType, handler);

接受2个参数:事件处理程序名称和事件处理程序函数。(与DOM2级相比,少一个布尔值,IE不支持事件捕获,所以也就没有第三个参数了)

注意:
1)通过addEventListener()添加的事件处理程序只能使用removeEventListener()来移除;
2)IE添加事件名称是“onclick”,而非DOM的“click”;
优点: 支持绑定/解绑多个事件处理程序
缺点:需要做兼容性判断。

格外留意!!在IE中使用attachEvent()与使用DOM0级方法的主要区别在于事件处理程序的作用域在使用DOM0级方法的情况下,事件处理程序会在其所属元素的作用域内运行;在使用attachEvent()方法的情况下,事件处理程序会在全局作用域中运行,因此this会等于window。(JavaScript高级程序设计352页)

1 var btn = document.getElementById("mybtn");
2 btn.attachEvevt("onclick",function(){
3     alert(this == window);//true
4 })

2.6 跨浏览器的事件处理

//elem事件目标元素, type事件类型, handler事件处理程序
var EventUtil = {
  addHandler : function(elem, type, handler){
    if(elem.addEventListener){  //DOM2级事件处理程序,添加多个同一类型的handler时,按顺序触发
      elem.addEventListener(type, handler, false);
    }
    else if(elem.attachEvent){  //IE
      elem.attachEvent("on" + type, handler);//添加多个同一类型的handler时,IE方式的规则是最后添加的最先触发
    }
    else{
        elem["on" + type] = handler;//DOM0级
      }
    },

  getEvent : function(event){
    return event ? event : window.event;
  },

  getTarget : function(event){
    return event.target || event.srcElement;
  },

  preventDefault : function(event){
    if(event.preventDefault){
      event.preventDefault();
    }
    else{
      event.returnValue = false;
    }
  },

removeHandler : function(elem, type, handler){
    if(elem.removeEventListener){
      elem.removeEventListener(type, handler, false);
    }
    else if(elem.detachEvent){
      elem.detachEvent("on" + type, handler);
    }
    else{
      elem["on" + type] = null;
    }
  },

  stopPropagation : function(event){
    if(event.stopPropagation){
      event.stopPropagation();
    }
    else{
      event.cancelBubble = true;
    }
  }

};


乱入几个面试中问到的问题:

1.解释一下事件冒泡和事件捕获。

待续。。。。。。。

时间: 2024-08-26 15:44:17

几个兼容相关的重要函数的相关文章

(笔记)Linux内核中内存相关的操作函数

linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) 内核空间申请指定大小的内存区域,返回内核空间虚拟地址.在函数实现中,如果申请的内存空间较大的话,会从buddy系统申请若干内存页面,如果申请的内存空间大小较小的话,会从slab系统中申请内存空间.有关buddy和slab,请参见<linux内核之内存管理.doc> gfp_t flags 的选项

《javascript dom编程艺术》笔记(一)——优雅降级、向后兼容、多个函数绑定onload函数

刚刚开始自学前端,如果不对请指正:欢迎各位技术大牛指点. 开始学习<javascript dom编程艺术>,整理一下学习到的知识.今天刚刚看到第六章,记下get到的几个知识点. 优雅降级 看到版本翻译为预留退路,刚刚看到个名词,我觉得很奇怪,以前没有听说过啊.不过看到英文注释就知道了Graceful degradation不就是优雅降级么,听说过! 书中举了个例子,点击一个链接,弹出一个窗口的方法. function popUp(WinURL){ window.open(WinURL,&quo

类的相关内置函数及反射

类变量的内存位置相关练习 1.1 class StarkConfig(object): list_display = [] def get_list_display(self): self.list_display.insert(0,33) return self.list_display class RoleConfig(StarkConfig): list_display = [11,22] s1 = StarkConfig() result1 = s1.get_list_display()

IE6 的兼容相关问题

因为在实习公司要求兼容IE6+,所以将IE6相关的样式兼容问题列出,及解决方案. 1.让页面变丑的透明背景图片问题: HTML都为以下代码: <div class="img-png"></div> 一般情况下使用png格式图片作为背景图片CSS部分: 1.img-png{ 2 width:64px; 3 height:64px; 4 background: url("imgsss/day.png") no-repeat; 5} 效果图: ch

日期相关的小函数汇总

在写日历组件和旅行相关频道开发的过程中,很多需要地方需要和日期对象打交道.拿京东旅游首页来说, 左上角的搜索框就包含了许多日期相关的交互逻辑,它包含了机票,酒店,度假等,这些都含有出发日期,到达日期等. 里面还包含了一个日期组件,在用户选择完出发日期后,会自动把到达日期定位在出发日期的下一天. 又如机票低价日历 还有度假的这种特殊日历 以下是经常需要用到日期相关小函数 一. 判断闰年这个函数在日历组件是必须要的,闰年的2月是29天,非闰年是28天 /* * 判断闰年 * @param {Numb

PHP文件相关的操作函数——目录操作

1.有关文件类型的函数 PHP是以UNIX的文件系统为模型的,因此在Windows系统中我们只能获得“file”.“dir”或者“unknown”三种文件类型.而在UNIX系统中,我们可以获得“block”.“char”.“dir”.“fifo”.“file”.“link”和“unknown”7种类型. 1.1 filetype() 作用:获取文件的上传类型 语法:filetype(filename) 参数:该函数接受一个文件名作为参数,如果文件不存在将返回FALSE. 代码示例: echo f

XE3随笔20:几个和当前路径相关的新函数

偶然从 SysUtils 里发现了几个路径相关的函数, 以前没见过, 可能是 Delphi XE3 新增的: GetLocaleDirectory(); GetLocaleFile(); LocaleDirectoryExists(); LocaleFileExists(); 应用测试: uses IOUtils; procedure TForm1.FormCreate(Sender: TObject); var   p,f: string;   b: Boolean; begin   {设置与

Oracle Function:当页面端有屏蔽相关字段数据函数,只有指定用户才能查看;而当前用户无法获取到相关数据插到其他表中,这时需要获取后台用户替换当前用户,执行完相关语句后再还原为当前用户。

1.该函数的作用:入库单提交/审核通过时,将相关数据插到/更新'出入库历史记录表':delivery_entering_record 由于页面端屏蔽了单价,指定的用户才能看到,故 与单价有关的数据插不进"出入库历史记录表"delivery_entering_record中,所以要用后台的用户替换当前用户,执行完相关语句后,在还原为当前用户(如代码:178~184和第208行所示):否则,插进去的数据全为0. 1 create or replace function delivery_e

Python 基础之集合相关操作与函数和字典相关函数

一:集合相关操作与相关函数 1.集合相关操作(交 差 并 补 )#intersection() 交集set1 = {"one","two","three"}set2 = {"four","five","one"}res = set1.intersection(set2)print(res)res = set1 & set2print(res) #difference() 差集se