返回顶部
首页 > 资讯 > 前端开发 > node.js >Javascript事件机制兼容性解决方法是什么
  • 466
分享到

Javascript事件机制兼容性解决方法是什么

2024-04-02 19:04:59 466人浏览 泡泡鱼
摘要

本篇内容主要讲解“javascript事件机制兼容性解决方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript事件机制兼容性解决方法是什么

本篇内容主要讲解“javascript事件机制兼容性解决方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript事件机制兼容性解决方法是什么”吧!

本文的解决方案可以用于Javascript native对象和宿主对象(dom元素),通过以下的方式来绑定和触发事件:

Javascript事件机制兼容性解决方法是什么

或者

var input = document.getElementsByTagName('input')[0];  var fORM = document.getElementsByTagName('form')[0];  Evt.on(input, 'click', function(evt){      console.log('input click1');      console.log(evt.target === input);      console.log(evt.modified);      //evt.stopPropagation();      console.log(evt.modified);  });  var handle2 = Evt.on(input, 'click', function(evt){      console.log('input click2');      console.log(evt.target === input);      console.log(evt.modified);  });  Evt.on(form, 'click', function(evt){      console.log('form click');      console.log(evt.currentTarget === input);      console.log(evt.target === input);      console.log(evt.currentTarget === form);      console.log(evt.modified);  });  Evt.emit(input, 'click');  Evt.emit(input, 'click', {bubbles: true});  handle2.remove();  Evt.emit(input, 'click');

After函数

为native对象添加事件的过程主要在after函数中完成,这个函数主要做了以下几件事:

  1. 如果obj中已有响应函数,将其替换成dispatcher函数

  2. 使用链式结构,保证多次绑定事件函数的顺序执行

  3. 返回一个handle对象,调用remove方法可以去除本次事件绑定

下图为after函数调用前后onlog函数的引用

Javascript事件机制兼容性解决方法是什么

(调用前)

Javascript事件机制兼容性解决方法是什么

(调用后)

详细解释请看注释,希望读者能够跟着运行一遍

var after = function(target, method, cb, originalArgs){      var existing = target[method];      var dispatcher = existing;      if (!existing || existing.target !== target) {          //如果target中没有method方法,则为他添加一个方法method方法          //如果target已经拥有method方法,但target[method]中target不符合要求则将method方法他替换          dispatcher = target[method] = function(){              //由于js是此法作用域:通过阅读包括变量定义在内的数行源码就能知道变量的作用域。              //局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的              //所以在这个函数中可以访问到dispatcher变量              var results = null;              var args = arguments;              if (dispatcher.around) {//如果原先拥有method方法,先调用原始method方法                  //此时this关键字指向target所以不用target                  results = dispatcher.around.advice.apply(this, args);              }                            if (dispatcher.after) {//如果存在after链则依次访问其中的advice方法                  var _after = dispatcher.after;                  while(_after && _after.advice) {                      //如果需要原始参数则传入arguments否则使用上次执行结果作为参数                      args = _after.originalArgs ? arguments : results;                      results = _after.advice.apply(this, args);                      _after = _after.next;                  }              }          }                    if (existing) {          //函数也是对象,也可以拥有属性跟方法          //这里将原有的method方法放到dispatcher中              dispatcher.around = {                  advice: function(){                      return existing.apply(target, arguments);                  }              }          }          dispatcher.target = target;      }                  var signal = {          originalArgs: originalArgs,//对于每个cb的参数是否使用最初的arguments          advice: cb,          remove: function() {              if (!signal.advice) {                  return;              }              //remove的本质是将cb从函数链中移除,删除所有指向他的链接              var previous = signal.previous;              var next = signal.next;              if (!previous && !next) {                  dispatcher.after = signal.advice = null;                  dispatcher.target = null;                  delete dispatcher.after;              } else if (!next){                  signal.advice = null;                  previous.next = null;                  signal.previous = null;              } else if (!previous){                  signal.advice = null;                  dispatcher.after = next;                  next.previous = null;                  signal.next = null;              } else {                  signal.advice = null;                  previous.next = next;                  next.previous = previous;                  signal.previous = null;                  signal.next = null;              }          }      }                  var previous = dispatcher.after;      if (previous) {//将signal加入到链式结构中,处理指针关系          while(previous && previous.next && (previous = previous.next)){};          previous.next = signal;          signal.previous = previous;      } else {//如果是***次使用调用after方法,则dispatcher的after属性指向signal          dispatcher.after = signal;      }            cb = null;//防止内存泄露      return signal;  }

解决兼容性

IE浏览器从IE9开始已经支持DOM2事件处理程序,但是对于老版本的ie浏览器,任然使用attachEvent方式来为dom元素添加事件。值得庆幸的是微软已宣布2016年将不再对ie8进行维护,对于广大前端开发者无疑是一个福音。然而在曙光来临之前,仍然需要对那些不支持DOM2级事件处理程序的浏览器进行兼容性处理,通常需要处理以下几点:

  1. 多次绑定一个事件,事件处理函数的调用顺序问题

  2. 事件处理函数中的this关键字指向问题

  3. 标准化event事件对象,支持常用的事件属性

由于使用attachEvent方法添加事件处理函数无法保证事件处理函数的调用顺序,所以我们弃用attachEvent,转而用上文中的after生成的正序链式结构来解决这个问题。

//1、统一事件触发顺序      function fixAttach(target, type, listener) {      debugger;          var listener = fixListener(listener);          var method = 'on' + type;          return after(target, method, listener, true);      };

对于事件处理函数中的this关键字指向,通过闭包即可解决(出处),如:

Javascript事件机制兼容性解决方法是什么

本文也是通过这种方式解决此问题

//1、统一事件触发顺序      function fixAttach(target, type, listener) {      debugger;          var listener = fixListener(listener);          var method = 'on' + type;          return after(target, method, listener, true);      };            function fixListener(listener) {          return function(evt){              //每次调用listenser之前都会调用fixEvent              debugger;              var e = _fixEvent(evt, this);//this作为currentTarget              if (e && e.cancelBubble && (e.currentTarget !== e.target)){                  return;              }              var results =  listener.call(this, e);               if (e && e.modified) {                  // 在整个函数链执行完成后将lastEvent回归到原始状态,                  //利用异步队列,在主程序执行完后再执行事件队列中的程序代码                  //常规的做法是在emit中判断lastEvent并设为null                  //这充分体现了js异步编程的优势,把变量赋值跟清除代码放在一起,避免逻辑分散,缺点是不符合程序员正常思维方式                  if(!lastEvent){                      setTimeout(function(){                          lastEvent = null;                      });                  }                  lastEvent = e;              }              return results;          }      }

对于事件对象的标准化,我们需要将ie提供给我们的现有属性转化为标准的事件属性。

function _fixEvent(evt, sender){          if (!evt) {              evt = window.event;          }          if (!evt) { // emit没有传递事件参数,或者通过input.onclick方式调用              return evt;          }          if(lastEvent && lastEvent.type && evt.type == lastEvent.type){          //使用一个全局对象来保证在冒泡过程中访问的是同一个event对象          //chrome中整个事件处理过程event是***的              evt = lastEvent;          }          var fixEvent = evt;          // bubbles 和cancelable根据每次emit时手动传入参数设置          fixEvent.bubbles = typeof evt.bubbles !== 'undefined' ? evt.bubbles : false;          fixEvent.cancelable = typeof evt.cancelable !== 'undefined' ? evt.cancelable : true;          fixEvent.currentTarget = sender;          if (!fixEvent.target){ // 多次绑定统一事件,只fix一次              fixEvent.target = fixEvent.srcElement || sender;                            fixEvent.eventPhase = fixEvent.target === sender ? 2 : 3;              if (!fixEvent.preventDefault) {                  fixEvent.preventDefault = _preventDefault;                  fixEvent.stopPropagation = _stopPropagation;                  fixEvent.stopImmediatePropagation = _stopImmediatePropagation;              }              //参考:Http://www.nowamagic.net/javascript/js_EventMechanismInDetail.PHP              if( fixEvent.pageX == null && fixEvent.clientX != null ) {                  var doc = document.documentElement, body = document.body;                  fixEvent.pageX = fixEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);                  fixEvent.pageY = fixEvent.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);              }              if (!fixEvent.relatedTarget && fixEvent.fromEvent) {                  fixEvent.relatedTarget = fixEvent.fromEvent === fixEvent.target ? fixEvent.toElement : fixEvent.fromElement;              }              // 参考: http://www.cnblogs.com/hsapphire/arcHive/2009/12/18/1627047.html              if (!fixEvent.which && fixEvent.keyCode) {                  fixEvent.which = fixEvent.keyCode;              }          }                    return fixEvent;      }            function _preventDefault(){          this.defaultPrevented = true;          this.returnValue = false;           this.modified = true;      }            function _stopPropagation(){          this.cancelBubble = true;           this.modified = true;      }            function _stopImmediatePropagation(){          this.isStopImmediatePropagation = true;          this.modified = true;      }

在_preventDefault、_stopPropagation、_stopImmediatePropagation三个函数中我们,如果被调用则listener执行完后使用一个变量保存event对象(见fixListener),以便后序事件处理程序根据event对象属性进行下一步处理。stopImmediatePropagation函数,对于这个函数的模拟,我们同样通过闭包来解决。

Javascript事件机制兼容性解决方法是什么

Javascript事件机制兼容性解决方法是什么

注意这里不能直接写成这种形式,上文中fixListener也是同样道理。

Javascript事件机制兼容性解决方法是什么

需要注意一点,我们将event标准化目的还有一点,可以在emit方法中设置参数来控制事件过程,比如:

Evt.emit(input, 'click');//不冒泡  Evt.emit(input, 'click', {bubbles: true});//冒泡

根据我的测试使用fireEvent方式触发事件,无法设置{bubbles:false}来阻止冒泡,所以这里我们用Javascript来模拟冒泡过程。同时在这个过程中也要保证event对象的***性。

// 模拟冒泡事件      var sythenticBubble = function(target, type, evt){          var method = 'on' + type;          var args = Array.prototype.slice.call(arguments, 2);          // 保证使用emit触发dom事件时,event的有效性          if ('parentnode' in target) {              var newEvent = args[0] = {};              for (var p in evt) {                  newEvent[p] = evt[p];              }                            newEvent.preventDefault = _preventDefault;              newEvent.stopPropagation = _stopPropagation;              newEvent.stopImmediatePropagation = _stopImmediatePropagation;              newEvent.target = target;              newEvent.type = type;          }                    do{              if (target && target[method]) {                  target[method].apply(target, args);              }          }while(target && (target = target.parentNode) && target[method] && newEvent && newEvent.bubbles);      }            var emit = function(target, type, evt){          if (target.dispatchEvent && document.createEvent){              var newEvent = document.createEvent('HTMLEvents');              newEvent.initEvent(type, evt && !!evt.bubbles, evt && !!evt.cancelable);              if (evt) {                  for (var p in evt){                      if (!(p in newEvent)){                          newEvent[p] = evt[p];                      }                  }              }                            target.dispatchEvent(newEvent);          } else {              return sythenticBubble.apply(on, arguments);          }      }

附上完整代码:

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/> <meta http-equiv="window-target" content="_top"> <title>Writing to Same Doc</title> <script language="JavaScript"> var after = function(target, method, cb, originalArgs){      var existing = target[method];      var dispatcher = existing;      if (!existing || existing.target !== target) {          //如果target中没有method方法,则为他添加一个方法method方法          //如果target已经拥有method方法,但target[method]中target不符合要求则将method方法他替换          dispatcher = target[method] = function(){              //由于js是此法作用域:通过阅读包括变量定义在内的数行源码就能知道变量的作用域。              //局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的              //所以在这个函数中可以访问到dispatcher变量              var results = null;              var args = arguments;              if (dispatcher.around) {//如果原先拥有method方法,先调用原始method方法                  //此时this关键字指向target所以不用target                  results = dispatcher.around.advice.apply(this, args);              }                            if (dispatcher.after) {//如果存在after链则依次访问其中的advice方法                  var _after = dispatcher.after;                  while(_after && _after.advice) {                      //如果需要原始参数则传入arguments否则使用上次执行结果作为参数                      args = _after.originalArgs ? arguments : results;                      results = _after.advice.apply(this, args);                      _after_after = _after.next;                  }              }          }                    if (existing) {          //函数也是对象,也可以拥有属性跟方法          //这里将原有的method方法放到dispatcher中              dispatcher.around = {                  advice: function(){                      return existing.apply(target, arguments);                  }              }          }          dispatcher.target = target;      }                  var signal = {          originalArgs: originalArgs,//对于每个cb的参数是否使用最初的arguments          advice: cb,          remove: function() {              if (!signal.advice) {                  return;              }              //remove的本质是将cb从函数链中移除,删除所有指向他的链接              var previous = signal.previous;              var next = signal.next;              if (!previous && !next) {                  dispatcher.after = signal.advice = null;                  dispatcher.target = null;                  delete dispatcher.after;              } else if (!next){                  signal.advice = null;                  previous.next = null;                  signal.previous = null;              } else if (!previous){                  signal.advice = null;                  dispatcher.after = next;                  next.previous = null;                  signal.next = null;              } else {                  signal.advice = null;                  previous.next = next;                  next.previous = previous;                  signal.previous = null;                  signal.next = null;              }          }      }                  var previous = dispatcher.after;      if (previous) {//将signal加入到链式结构中,处理指针关系          while(previous && previous.next && (previousprevious = previous.next)){};          previous.next = signal;          signal.previous = previous;      } else {//如果是***次使用调用after方法,则dispatcher的after属性指向signal          dispatcher.after = signal;      }            cb = null;//防止内存泄露      return signal;  }   //1、统一事件触发顺序  //2、标准化事件对象  //3、模拟冒泡 emit时保持冒泡行为,注意input.onclick这种方式是不冒泡的  //4、保持冒泡过程中event的***性   window.Evt = (function(){      var on = function(target, type, listener){      debugger;          if (!listener){              return;          }          // 处理stopImmediatePropagation,通过包装listener来支持stopImmediatePropagation          if (!(window.Event && window.Event.prototype && window.Event.prototype.stopImmediatePropagation)) {              listener = _addStopImmediate(listener);          }                if (target.addEventListener) {              target.addEventListener(type, listener, false);                            return {                  remove: function(){                      target.removeEventListener(type, listener);                  }              }          } else {              return fixAttach(target, type, listener);          }      };      var lastEvent; // 使用全局变量来保证一个元素的多个listenser中事件对象的一致性,冒泡过程中事件对象的一致性;在chrome这些过程中使用的是同一个event      //1、统一事件触发顺序      function fixAttach(target, type, listener) {      debugger;          var listener = fixListener(listener);          var method = 'on' + type;          return after(target, method, listener, true);      };            function fixListener(listener) {          return function(evt){              //每次调用listenser之前都会调用fixEvent              debugger;              var e = _fixEvent(evt, this);//this作为currentTarget              if (e && e.cancelBubble && (e.currentTarget !== e.target)){                  return;              }              var results =  listener.call(this, e);               if (e && e.modified) {                  // 在整个函数链执行完成后将lastEvent回归到原始状态,                  //利用异步队列,在主程序执行完后再执行事件队列中的程序代码                  //常规的做法是在emit中判断lastEvent并设为null                  //这充分体现了js异步编程的优势,把变量赋值跟清除代码放在一起,避免逻辑分散,缺点是不符合程序员正常思维方式                  if(!lastEvent){                      setTimeout(function(){                          lastEvent = null;                      });                  }                  lastEvent = e;              }              return results;          }      }            function _fixEvent(evt, sender){          if (!evt) {              evt = window.event;          }          if (!evt) { // emit没有传递事件参数,或者通过input.onclick方式调用              return evt;          }          if(lastEvent && lastEvent.type && evt.type == lastEvent.type){          //使用一个全局对象来保证在冒泡过程中访问的是同一个event对象          //chrome中整个事件处理过程event是***的              evt = lastEvent;          }          var fixEvent = evt;          // bubbles 和cancelable根据每次emit时手动传入参数设置          fixEvent.bubbles = typeof evt.bubbles !== 'undefined' ? evt.bubbles : false;          fixEvent.cancelable = typeof evt.cancelable !== 'undefined' ? evt.cancelable : true;          fixEvent.currentTarget = sender;          if (!fixEvent.target){ // 多次绑定统一事件,只fix一次              fixEventfixEvent.target = fixEvent.srcElement || sender;                            fixEventfixEvent.eventPhase = fixEvent.target === sender ? 2 : 3;              if (!fixEvent.preventDefault) {                  fixEvent.preventDefault = _preventDefault;                  fixEvent.stopPropagation = _stopPropagation;                  fixEvent.stopImmediatePropagation = _stopImmediatePropagation;              }              //参考:http://www.nowamagic.net/javascript/js_EventMechanismInDetail.php              if( fixEvent.pageX == null && fixEvent.clientX != null ) {                  var doc = document.documentElement, body = document.body;                  fixEventfixEvent.pageX = fixEvent.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);                  fixEventfixEvent.pageY = fixEvent.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);              }              if (!fixEvent.relatedTarget && fixEvent.fromEvent) {                  fixEventfixEvent.relatedTarget = fixEvent.fromEvent === fixEvent.target ? fixEvent.toElement : fixEvent.fromElement;              }              // 参考: http://www.cnblogs.com/hsapphire/archive/2009/12/18/1627047.html              if (!fixEvent.which && fixEvent.keyCode) {                  fixEventfixEvent.which = fixEvent.keyCode;              }          }                    return fixEvent;      }            function _preventDefault(){          this.defaultPrevented = true;          this.returnValue = false;           this.modified = true;      }            function _stopPropagation(){          this.cancelBubble = true;           this.modified = true;      }            function _stopImmediatePropagation(){          this.isStopImmediatePropagation = true;          this.modified = true;      }            function _addStopImmediate(listener) {          return function(evt) { // 除了包装listener外,还要保证所有的事件函数共用一个evt对象              if (!evt.isStopImmediatePropagation) {                  //evt.stopImmediatePropagation = _stopImmediateProgation;                  return listener.apply(this, arguments);              }          }      }            // 模拟冒泡事件      var sythenticBubble = function(target, type, evt){          var method = 'on' + type;          var args = Array.prototype.slice.call(arguments, 2);          // 保证使用emit触发dom事件时,event的有效性          if ('parentNode' in target) {              var newEvent = args[0] = {};              for (var p in evt) {                  newEvent[p] = evt[p];              }                            newEvent.preventDefault = _preventDefault;              newEvent.stopPropagation = _stopPropagation;              newEvent.stopImmediatePropagation = _stopImmediatePropagation;              newEvent.target = target;              newEvent.type = type;          }                    do{              if (target && target[method]) {                  target[method].apply(target, args);              }          }while(target && (targettarget = target.parentNode) && target[method] && newEvent && newEvent.bubbles);      }            var emit = function(target, type, evt){          if (target.dispatchEvent && document.createEvent){              var newEvent = document.createEvent('HTMLEvents');              newEvent.initEvent(type, evt && !!evt.bubbles, evt && !!evt.cancelable);              if (evt) {                  for (var p in evt){                      if (!(p in newEvent)){                          newEvent[p] = evt[p];                      }                  }              }                            target.dispatchEvent(newEvent);          } else {              return sythenticBubble.apply(on, arguments);          }      }            return {          on: on,          emit: emit      };  })()  </script> <style type="text/CSS"></style> </head> <body>   <form>     <input type="button" value="Replace Content" >   </form> </body> </html>

到此,相信大家对“Javascript事件机制兼容性解决方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Javascript事件机制兼容性解决方法是什么

本文链接: https://lsjlt.com/news/86351.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Javascript事件机制兼容性解决方法是什么
    本篇内容主要讲解“Javascript事件机制兼容性解决方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Javascript事件机制兼容性解决方法是什么...
    99+
    2024-04-02
  • IE8兼容性问题的快速解决方法是什么
    IE8兼容性问题的快速解决方法是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。为了实现IE8兼容基于其它网页标准开发的网站,IE8还专门提...
    99+
    2024-04-02
  • javascript的事件驱动机制是什么
    这篇文章主要介绍“javascript的事件驱动机制是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“javascript的事件驱动机制是什么”文章能帮助大家解决...
    99+
    2024-04-02
  • 解决浏览器兼容性的技巧是什么
    本篇内容主要讲解“解决浏览器兼容性的技巧是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“解决浏览器兼容性的技巧是什么”吧!   一、chrome下会让小于...
    99+
    2024-04-02
  • win10兼容性视图设置的方法是什么
    在Windows 10中设置兼容性视图的方法如下:1. 打开控制面板:可以通过在开始菜单中搜索"控制面板"来找到。2. 在控制面板中...
    99+
    2023-10-08
    win10
  • JS脚本兼容性问题的解决方法
    这篇文章给大家介绍JS脚本兼容性问题的解决方法,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。这里和大家分享一下解决JS脚本兼容的几个小技巧,关于JS脚本兼...
    99+
    2024-04-02
  • 什么是Flex事件机制
    这篇文章主要为大家展示了“什么是Flex事件机制”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“什么是Flex事件机制”这篇文章吧。Flex事件机制介绍1.什么是Flex事件机制Flex事件可以看...
    99+
    2023-06-17
  • JavaScript Babel 揭秘:兼容性难题的优雅解决方案
    Babel 的工作原理 Babel 的工作原理如下: 源代码解析:Babel 首先将源代码解析成抽象语法树 (AST)。AST 是代码结构的树状表示,它保留了代码的含义和语法。 转换:Babel 将 AST 转换为目标代码。此转换阶段涉...
    99+
    2024-04-02
  • javascript绑定事件的方法是什么
    本篇内容介绍了“javascript绑定事件的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!绑定...
    99+
    2024-04-02
  • 快速解决IE8兼容性问题的两大办法分别是什么
    快速解决IE8兼容性问题的两大办法分别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。你对IE8兼容性问题的解决方法是否了解,这里和大家简...
    99+
    2024-04-02
  • HTML5新标签兼容的方法是什么
    本篇内容介绍了“HTML5新标签兼容的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!&nbs...
    99+
    2024-04-02
  • IE、Firefox等浏览器不兼容原因及解决方法是什么
    这篇文章给大家介绍IE、Firefox等浏览器不兼容原因及解决方法是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。你对,IE、Firefox等浏览器不兼容原因及解决方法是否了解,这...
    99+
    2024-04-02
  • Vue兼容IE9全功能正常使用的解决方法是什么
    本篇内容介绍了“Vue兼容IE9全功能正常使用的解决方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成...
    99+
    2024-04-02
  • JS在IE和Firefox兼容性问题及解决方法是怎样的
    JS在IE和Firefox兼容性问题及解决方法是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。你对JS在IE和Firef...
    99+
    2024-04-02
  • 事件冒泡是什么?深入解析事件冒泡机制
    事件冒泡是什么?深入解析事件冒泡机制 事件冒泡是Web开发中一个重要的概念,它定义了页面上事件传递的方式。当一个元素上的事件被触发时,事件将会从最内层的元素开始传递,逐级向外传递,直到...
    99+
    2024-02-22
    事件机制 深入解析 事件冒泡 点击事件
  • JavaGUI事件监听机制是什么
    今天小编给大家分享一下JavaGUI事件监听机制是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一个事件模型中有上对象:...
    99+
    2023-07-05
  • android事件处理机制是什么
    Android事件处理机制指的是Android系统中对用户输入事件以及其他系统事件的处理方式。Android系统中的事件处理机制主要包括以下几个部分:1. 事件触发:Android系统通过底层硬件驱动来获取用户输入事件,包括触摸事件、按...
    99+
    2023-08-11
    android
  • Node事件循环机制是什么
    这篇文章主要介绍“Node事件循环机制是什么”,在日常操作中,相信很多人在Node事件循环机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Node事件循环机制是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • win8运行程序不兼容的建议性解决方法
    win8系统是微软现在主打的系统,为了给win8铺路不惜在2014年停止XP系统的一切更新和服务。我们不得不承认的是,win8确实很优秀,但是在程序兼容性方面相比,和XP差的还很远。那么。当我们的程序在wi...
    99+
    2022-06-04
    解决方法 不兼容 建议
  • 解决IE6兼容性问题的常见方法有哪些
    今天就跟大家聊聊有关解决IE6兼容性问题的常见方法有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。解决IE6兼容性问题常见方法1、使用声明你必须...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作