当前位置: 代码迷 >> JavaScript >> javascript 跨浏览器的一些小技能
  详细解决方案

javascript 跨浏览器的一些小技能

热度:169   发布时间:2012-11-05 09:35:12.0
javascript 跨浏览器的一些小技巧

??? 用网页调整格式实在是太复杂了,凑合看看吧。。。。。

  1. ? 事件处理分为两种,一种为冒泡型事件,另一种为捕获型事件
    ?
    冒泡型事件:是从特定目标到最不特定的目标
    ?
    捕获型事件:是从最不特定的对象开始触发,一直到最精确的对象。
    ?
    ?DOM
    标准同时支持两种事件,并且捕获型事件先发生。
    ?window-->document-->body-->div-->div-->body-->document-->window
    ?
    ?
    比较特殊的,在DOM事件模型中,文本节点也会触发事件,而IE中是不会的。
    ?window-->document-->body-->div-->text-->text-->div-->body-->document-->window
    ?
    ?
  2. IEDOM在事件及事件处理中有很多不一样的。
  • ?对于加载监听和移除监听的语法
    ?
    IE中使用
    ??[Object].attachEvent("name_of_event_handler", fnHandler);
    ??[Object].detachEvent("name_of_event_handler", fnHandler);
    ?
    两个参数:要分配的事件处理函数的名字 事件处理函数
    ??[Object].attachEvent("onclick", fnHandler);
    ??
    [Object].onclick = fnHandler;的作用是一样的。
    ??
    ?
    DOM中使用
    ??[Obejct].addEventListener("name_of_event", fnHandler, bCapture);
    ??[Obejct].removeEventListener("name_of_event", fnHandler, bCapture);
    ?
    三个参数:1:事件名称。 2:事件处理函数。 3:用于冒泡阶段(false)或者用于捕获阶段(true)。
    ??[Obejct].addEventListener("click", fnHandler, false);
    ??
    [Obejct].onclick = fnHandler;的作用是一样的。
    ??
    ?
  • 对于获取目标的方法
    ?
    IE
    ??var oTarget = oEvent.srcElement;
    ?
    DOM
    ??var oTarget = oEvent.target;
    ??
    ??
  • 对于获取字符代码

????在IE

????? 如果按键代表一个字符(非ShiftCtrlAlt等),则keyCode将返回字符的代码,即Unicode值。

DOM
????? ??????
获得字符代码用charCode?

var iCharCode = oEvent.charCode;
????? ??????
获得字符使用??

?var sChar = String.fromCharCode(oEvent.charCode);
????????????
如果不确定按键是否包含字符,则使用isChar来判断
???if(oEvent.isChar){
????var iCharCode = oEvent.charCode;
???}
?
?

  • 阻止事件的默认行为(比如阻止鼠标右键等)
    ?
    IE
    ??oEvent.returnValue = false;
    ?
    DOM
    ??oEvent.preventDefault();
    ?
    ?
  • 停止事件冒泡
    ?
    IE
    ??oEvent.cancelBubble = true;
    ?
    DOM
    ??oEvent.stopPropagation();

    IEDOM在事件及事件处理中有很多不一样的。

IEEvent事件统一成DOM的形式,创建formatEvent方法。建立EventUtil
?
?

EventUtil.formatEvent = function (oEvent){
  if(isIE){
   oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
   oEvent.eventPhase = 2; //代表冒泡阶段,IE仅支持冒泡阶段
   oEvent.isChar = (oEvent.charCode > 0);
   oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
   oEvent.pageY = oEvent.clientY + document.body.scrollTop;
   oEvent.preventDefault = function (){
    this.returnvalue = false;
   }
   if(oEvent.type == "mouseout"){
    oEvent.relatedTarget = oEvent.toElement;
   }else if(oEvent.type == "mouseover"){
    oEvent.relatedTarget = oEvent.fromElement;
   }
   oEvent.stopPropagation = function (){
    this.cancelBubble = true;
   }
   oEvent.target = oEvent.srcElement;
   oEvent.time = (new Date).getTime();
  }
  return oEvent;
 }

?
?IE

DOMevent获取方法也不大一样。特别说明的是函数的caller属性。每个函数都有caller属性,指向调用它的方法的引用。即,funcA()调用funcB(),funcB.caller就等于funcA
?

EventUtil.getEvent = function(){
  if(window.event){
   return this.formatEvent(window.event);
  }else{
   return EventUtil.getEvent.caller.arguments[0];//event对象总是事件处理函数的第一个参数。
  }
 }

?

?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?

?

?

  相关解决方案