2015-10-18 244 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部分找到完整的解釋。