如何在javascript中获取document.onkeydown函数的名称?

时间:2012-03-29 08:27:38

标签: javascript function dom javascript-events

document.onkeydown.toString()返回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;
}

2 个答案:

答案 0 :(得分:1)

不,那是不可能的。函数名在javascript中没有区别。例如:

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

var jim = john;

您现在会考虑该功能的名称? “约翰”或“吉姆​​”? - 他们都指向完全相同的东西,并没有任何不同。另一个例子可以澄清:

var john = function() { /* ... */ };
var jim = john;

答案 1 :(得分: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'

(它会从函数定义返回名称(当你将此函数赋值给其他变量时.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'); };

您没有对此函数的任何其他引用(它未分配给其他变量),因此您无法将其与其他函数进行比较(比较始终返回false)。