2012-03-29 20 views
0

document.onkeydown.toString()はonkeydown関数を返しますが、この関数の名前を取得したいだけです。javascriptでdocument.onkeydown関数の名前を取得するには?

可能ですか?

var exHandler; 
function getCurrentHandler(){ 
    currentHandler = document.onkeydownhandler.toString() - i want to get name of this to call setPreviousHandler with exHandler 

document.onkeydown = newFunction; 

setPreviousHandler(exHandler); 
} 

function setPreviousHandler(targetHandler){ 
    document.onkeydown = targetHandler; 
} 
+0

あなたは何をしようとしていますか? – Thilo

+0

document.onkeydown =現在の機能(私は名前を知らない) document.onkeydown = my function 私は以前に変更した現在の関数にdocument.onkeydownを設定したいと思います。 –

+0

それを擬似コードで書き留めてもいいですか? – Niko

答えて

1

機能の割り当て方法によって異なります。これを見てください :

function test() { alert('test'); } 
window.onkeydown = test; 
window.onkeydown.toString(); 

出力はfunction test() { alert('test'); }であり、あなたは文字列としてその名を取得するには、この文字列を解析することができます

var fnsting = window.onkeydown.toString(); 
// use regexp to extract name 
var name = fnsting.match(/function\s*(.*?)\s*\(/)[1]; // name is 'test' 

あなたがこれをASSINGとき(それはオールウェイズ(関数定義から名前を返します他の変数.toString()への関数は常に同じ文字列)を返します

が、次の例:

window.onkeydown = function() { alert('test'); }; 
window.onkeydown.toString(); 

function() { alert('test'); }を出力します。この関数は匿名であるため、名前を取得できないためです。

はまた、あなたがこのように関数を作成する場合:

var test = function() { alert('test'); }; 
window.onkeydown = test; 
window.onkeydown.toString(); 

と出力ために作成機能に名前を持っていなかった(それが変数に割り当てられた関数式だった)ので、あなたにもそれが名前だ抽出することはできませんfunction() { alert('test'); }になります。

しかし、あなたは、単純な比較です作ることができます。

function foo() { alert('foo'); } 
var bar = function() { alert('bar'); }; 

window.onkeydown = foo; 

// try to find function 
if (window.onkeydown === foo) { 
    alert('this is foo'); 
} else if (window.onkeydown === bar) { 
    alert('this is bar'); 
} 

// or like this: 
var handler = window.onkeydown; 
if (handler === foo) { 
    alert('this is foo'); 
} else if (handler === bar) { 
    alert('this is bar'); 
} 

をしかし、あなたはこのように無名関数を割り当てるとするので、これで発行もあります:あなたは、他の参照を持っていない

window.onkeydown = function() { alert('test'); }; 

は、 (他の変数には割り当てられていません)ので、他の関数と比較することはできません(compareは常にfalseを返します)。

1

いいえ、それはできません。関数名はjavascriptでは区別されません。例:

function john() { 
    // ... do something ... 
} 

var jim = john; 

ここで、その機能の名前はどう思いますか? "john"または "jim"? - 彼らはまったく同じことを指していて、何でも違いはありません。別の例では、次のことを明確にすることができます。

var john = function() { /* ... */ }; 
var jim = john; 
関連する問題