2015-10-18 179 views
0

这是我的代码:如何“范围”事件侦听器?

var myFunction(){ 
    document.addEventListener("deviceready", self.onDeviceReady, false); // scoped event listener 
    function onDeviceReady() { 
     // ... 
    } 
} 

至于我看到在事件(deviceready)被触发时,当地(给myFunction)回调运行。

但事件监听器是全局的,所以一旦触发事件,也可以调用与全局作用域相同的另一个函数。

如何使不仅回调,但侦听器本身作用于一个函数(我知道如何做一个DOM元素,但这是不同的)?

+3

'self.onDeviceReady'不正确 - 它应该只是'onDeviceReady'。这不是事件处理程序绑定的工作方式;它与函数的名称无关,而是与函数的值作为对象。 – Pointy

回答

0

您的代码应该是这样的:

function myFunction() { 
    document.addEventListener("deviceready", function() { 
     //... 
    }, false); // scoped event listener 
} 
+0

使用声明的函数作为事件处理程序没有任何问题。 – Pointy

+1

@Pointy阅读第一篇文章。 'var myFunction(){' –

+0

是的,这个代码有很多错误:)我不能确定OP是什么担心的。 – Pointy

1

元素本身是全局范围。只要你附加一些东西给他们,他们的范围就是这样。考虑以下内容::

function myfunc(){ 
    document.getElementById('someId').something = 'test'; 
} 

现在无处不在。

我明白你想得到什么,所以你可以尝试几件事情。这是你可以尝试的东西。这将检查一个元素是否已经存在,并且不允许添加另一个元素。

var Marvel = { 
 
    
 
\t on : function(element, action, callback){ 
 
\t \t Marvel.listeners = Marvel.listeners || {}; 
 
\t \t Marvel.listeners[action] = Marvel.listeners[action] || []; 
 
\t \t for(var index in Marvel.listeners[action]){ 
 
\t \t \t if(Marvel.listeners[action][index].element == element){ 
 
\t \t \t \t return console.error("A '"+action+"' event is already established for:", element, Marvel.listeners[action][index]), false 
 
\t \t \t } 
 
\t \t } 
 
\t \t element.addEventListener(action,callback); 
 
\t \t Marvel.listeners[action].push({ element: element, callback: callback }); 
 
\t }, 
 
    
 
\t off: function(element, action){ 
 
\t \t if(!Marvel.listeners || !Marvel.listeners[action]) 
 
\t \t \t return console.error("off: No '"+action+"' listener has been created. Listeners: ", Marvel.listeners || 'none'), false; 
 
\t \t for(var index in Marvel.listeners[action]){ 
 
\t \t \t if(Marvel.listeners[action][index].element == element){ 
 
\t \t \t \t element.removeEventListener(action, Marvel.listeners[action][index].callback); 
 
\t \t \t \t Marvel.listeners[action].splice(index, 1); 
 
\t \t \t \t return true 
 
\t \t \t } 
 
\t \t } 
 
\t \t return console.error("A '"+action+"' event has not yet been established for:", element, Marvel.listeners[action]), false; 
 
\t } 
 
    
 
}

用法:

Marvel.on(document, click, function(e){ 
    console.log(e.target); 
}); 
Marvel.off(document, click); 

这设定一个事件监听器将被存储在一个单独的对象,并检查,看它是否添加新的时已经存在,并且还允许能够使用off函数关闭它们。

你可以在我的网站上的我的个人资料中的Javascript Tracking Events部分找到完整的解释。