zoukankan      html  css  js  c++  java
  • 解决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]来获取了..

  • 相关阅读:
    [LeetCode] Add Two Numbers
    [LeetCode] Two Sum
    解决 wget 使用 https 下载报错的问题
    VMware Player 使用笔记
    使用 linux 作为桌面系统会遇到的一些小问题和解决方案
    CUDA 6.5 + Visual Studio 2013 Express 环境配置
    康威生命游戏(Conway's Game of Life)的一种实现
    微软校招编程题"Beautiful String"的状态机解法
    利用html5的本地存储写的一个购物车
    微信开发asp.net
  • 原文地址:https://www.cnblogs.com/chyu/p/5061676.html
Copyright © 2011-2022 走看看