argments.callee.caler.argments[0]取得イベントについての質問

5758 ワード

まず簡単な例から言いますと、簡単なバグコントロールは以下の通りです.
<> input  タイプ ='button  name ='mybtn  id. ='mybtn  onclick ='myFun()' />
 
その後、イベントを登録します.このような場合、javascriptでイベントをどうやって取得しますか?特にfirefoxの場合.見てください:
<> スクリプト  タイプ ='text/javascript > 
機能  myFun(){
    var  ev  =  window.イベント  ||  argments.calee.caler.argments[ 0 ]
       ,セット = ev.srcelement|ev.target;
   alert(et.tagName)   }
意外なことがなければ、ie/ffでは、上記の例はINPUT、つまりclickイベントノードをトリガするタグ名であり、ieのeventはここではなく、ffの場合について重点的に説明します.
ここのargments.calee.caler.argments[0]は長又の怪人に見えますが、なぜfirefoxの場合、これがイベントですか?
まず、argments.calerはどんな属性ですか?
argments.calleeは関数体そのもので、argments.callerは関数体の呼び出し関数体です.
簡単な例は以下の通りです
 
<> スクリプト タイプ = ' text/javascript ' > 
機能  a(){
    b()
)
機能  b(){
    alert(b  ===  argments.callee)
    alert(b.caller)  ===  a)
    alert(argments.calee.caller)  ===  a)
)
a()
<> / スクリプト>
 
上記の例は3つのtrueを出力します.a()が呼び出された時、関数bと関数aの関係を表します.
 
はい、argments.calerとargmentsをはっきりさせました.また元の例を改めます.
<> スクリプト タイプ = ' text/javascript ' > 
機能  myFun(){
   alert(argments.calee.toString()
    var  ev  =  window.イベント  ||  argments.calee.caler.argments[ 0 ]
       ,セット  =  ev.srcele ment  ||  ev.target
)
<> / スクリプト>
 
私たちはargment.calee.callerの関数を出力します.ieとffの下で何の違いがあるかを見てみます.
ieの下の出力が見えます.
機能  anonymous(){
  myFun()
)
ffで出力は
機能  onclick{イベント}
   myFun();
)
これにより、htmlコントロールに直接登録するイベントが見られます. ie/ffでの表現の違い、 ieには匿名関数が定義されています.内部ではユーザーがカスタマイズした関数(myFun)が実行されます.
これに対して、まずffでノードイベントと同名の関数を定義しました.ここではonclickイベントですので、function onclickです.そして、イベントはパラメータとして入ってきます.内部ではmyFunを実行します.
したがって、イベントがトリガされると、myFunncでは、argment.callerはfunction onclickを指しています.もちろん、argment.caller.argments[0]はeventです.
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />  
<title></title>  
</head>  
<body>  
  
<input type='button' name='mybtn' id='mybtn' />  
  
<script type='text/javascript'>  
function myFunc(){  
    alert(arguments.callee.caller.toString())  
   var ev = window.event || arguments.callee.caller.arguments[0] ,et = ev.srcElement || ev.target;  
}  
  
  
function myFunc2( e ){  
    alert(e);  
    alert(arguments[0]);  
}  
  
function a(){  
     b();  
}  
  
function b(){  
     alert(b === arguments.callee)  
     alert(b.caller === a)  
     alert(arguments.callee.caller === a)  
}  
  
  
function addEventHandler(oTarget, sEventType, fnHandler) {  
    if (oTarget.addEventListener) {  
        oTarget.addEventListener(sEventType, fnHandler, false);  
    } else if (oTarget.attachEvent) {  
        oTarget.attachEvent("on" + sEventType, fnHandler);  
    } else {  
        oTarget["on" + sEventType] = fnHandler;  
    }  
};  
  
  
var BindAsEventListener_t = function(object, fun) {  
    var args = Array.prototype.slice.call(arguments).slice(2);  
    return function() {  
        return fun.apply(object, [arguments[0] || window.event].concat(args));  
    }  
}  
  
addEventHandler( document.getElementByIdx_x("mybtn") , "click" , myFunc );  //1  
  
//addEventHandler( document.getElementByIdx_x("mybtn") , "click" , myFunc2);  //2  
//myFunc2();  
</script>  
</body>  
</html>  
 発見します.firebugは「argments.calee.caller is null」を提示します. ” .
転載:http://www.cnblogs.com/funlake/archive/2009/04/07/1431238.html