Превратите любую функцию JavaScript в событие страницы - PullRequest
0 голосов
/ 07 мая 2010

Мне нужно, чтобы я мог добиться следующего (так или иначе):

function ShowContent() {}

document.onShowContent = function ()
{
     // anything I want to happen....
}

Что я пытаюсь сделать, это добавить своего рода слушатель рекламного кода на странице, который будет автоматически обновлять рекламное место при вызове определенной функции. Вместо того, чтобы эта функция «ShowContent ()» непосредственно обновляла рекламный код, я хочу, чтобы рекламный код обновлялся, если обнаружит, что «ShowContent ()» был вызван.

Спасибо.

Ответы [ 2 ]

4 голосов
/ 07 мая 2010

Современные библиотеки javascript делают это легко. Конечно, вы можете сделать это «вручную», но вот быстрый пример с jQuery

Сначала слушатель

$(document).bind( 'ShowContent', function()
{
  // anything you want
});

Тогда триггер

$(document).trigger( 'ShowContent' );

Вы могли бы даже пойти этим путем, если хотите

function ShowContent()
{
  $(document).trigger( 'ShowContent' );
}
1 голос
/ 08 мая 2010

Вот быстрый пример, который я бросил вместе

 var ev = (function(){
     var events = {};
     return {
         on: function(name, handler){
             var listeners = (name in events) ? events[name] : (events[name] = []);
             listeners.push(handler);
         },
         raise: function(name){
             var listeners = events[name];
             if (listeners) {
                 var i = listeners.length;
                 while (i--) {
                     listeners[i]();
                 }
             }
         }
     };
 })();

 // add a listener
 ev.on("foo", function(){
     alert("bar");
 });

Если вы не можете вручную изменить рассматриваемый метод, чтобы вызвать событие, то вы можете «обернуть» его.

 function methodIHaveNoControlOver(){
     ....
 }

 // intercept the call
 var originalFn = methodIHaveNoControlOver;
 // here we replace the FunctionDeclaration with a FunctionExpression containing a reference to the original FunctionDeclaration
 methodIHaveNoControlOver = function(){
     originalFn();
     ev.raise("foo");
 };

Но учтите, что это не будет работать, если methodIHaveNoControlOver использует this для ссылки на что-либо; так что это потребует больше работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...