如何"范围"事件听众?

时间:2015-10-18 15:04:33

标签: javascript javascript-events

这是我的代码:

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

据我所知,触发事件(deviceready)时,会运行本地(到myFunction)回调。

然而,事件侦听器是全局的,因此一旦事件被触发,也可以调用具有相同全局范围的另一个函数。

如何不仅使回调,而且将侦听器本身作为一个函数进行局部作用(我知道如何为DOM元素做这个但是那个不同)?

2 个答案:

答案 0 :(得分:1)

元素本身是全局范围的。只要你附上一些东西,它们就是这样的。请考虑以下::

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

现在随处可以访问。

我知道你想要得到什么,所以你可以尝试几件事。这是你可以尝试的东西。这将检查元素是否已存在,并且不允许您添加其他事件。



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




用法:

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

这会将事件侦听器设置为存储在单独的对象中,并在添加新事件时检查它是否已存在,并且还允许使用off函数关闭它们。

您可以在Javascript跟踪事件部分的个人资料中找到我网站上的完整说明。

答案 1 :(得分:0)

您的代码应该是这样的:

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