• 解决webkit浏览器中js方法中使用window.event提示未定义的问题


    这实际上是一个浏览器兼容性问题,根源百度中一大堆,简要说就是ie中event对象是全局变量,所以哪里都能使用到,但是webkit内核的浏览器中却不存在这个全局变量event,而是以一个隐式的局部变量的形式传入(后文会详说).

    function myfunc(param){
        alert(window.event);
    }    
    
    //ie中
    <input type="button" onclick="myfunc('testie')" >    //一切正常
    
    //webkit浏览器,如chrome,firefox之类的
    <input type="button" onclick="myfunc('testwebkit')" >   //会提示undefined

    然后这里解释一下webkit内核的浏览器是如何隐式传入的event对象.

    还是上面那个例子,在webkit浏览器中,onclick="myfunc('testwebkit')" 这句实际上相当于这样的:

    onclick(event){
       myfunc('testwebkit');
    }

    换句话说onclick方法的0号参数实际上就是那个隐式传进来的event对象.

    然后我们再来看一下js方法中的一种调用:arguments.callee.caller,其中arguments为方法的参数集合,callee为当前参数所在的方法,caller就为调用此方法的方法(或者说调用者).

    然后就有如下的对应关系:

    function myfunc(param){
        alert(arguments.callee);   //myfunc()
        alert(arguments.callee.caller);  //onclick()
        alert(arguments.callee.caller.arguments[0]);  //event
    }    
    
    //webkit浏览器,如chrome,firefox之类的
    <input type="button" onclick="myfunc('testwebkit')" >   

    这里特别说一句,arguments.callee.caller是可以继续往上追寻调用者的,比如arguments.callee.caller.arguments.callee.caller就是又向上追寻了一级.为何会特别说这个,因为有些时候会遇到自定义标签之类的情况,这种情况中如果有封装和js相关的方法,可能会存在如下这种情况:

    onclick(event){
      tagCommand(){     //某些情况下的多层嵌套
          myfunc('testwebkit');
      }
    }

    此时如果还想在myfunc方法中获取到event对象,就需要连往上追寻2级,使用arguments.callee.caller.arguments.callee.caller.arguments[0]来获取了..

  • 相关阅读:
    [chrome]click事件会触发mouseleave
    鼠标的指针状态 以及 事件禁用
    CSS3 线性渐变(linear-gradient)
    css 的函数 calc() 、linear-gradient()、、、
    1.闰年的计算方法。 2.某一月的周数
    moment.js 使用方法总结
    Echarts 版本查看
    如何使用 onscroll / scrollTo() / scrollBy()
    水平居中、垂直居中
    【LeetCode】22. Generate Parentheses (I thought I know Python...)
  • 原文地址:https://www.cnblogs.com/chyu/p/5061676.html
Copyright © 2020-2023  润新知