开发者

Transform any JavaScript function into a page event

I need to be able to achieve the following (one way or another):

function Sho开发者_Go百科wContent() {}

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

What I'm trying to do is to add a kind of listener to me Advertisement code on the page that will auto refresh the ad slot when a specific function is called. Instead of having that function "ShowContent()" directly refresh the ad code, I want the ad code to refresh if it detects that "ShowContent()" has been called.

Thanks.


Modern javascript libraries make this easy. You can do it "by hand" of course, but here's a quick example with jQuery

First, the listener

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

Then the trigger

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

You could even go this route if you want

function ShowContent()
{
  $(document).trigger( 'ShowContent' );
}


Here is a quick sample i threw together

 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");
 });

If you cannot manually alter the method in question to trigger the event, then you can 'wrap' it.

 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");
 };

But note that this will not work if methodIHaveNoControlOver uses this to reference anything; so that will require more work.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜