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です.
転載:http://www.cnblogs.com/funlake/archive/2009/04/07/1431238.html
<> 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