user1260827
user1260827

Reputation: 1520

callback for .trigger function

I have the following code:

 $("#scheduleLink").trigger("click");
 alert("text")

This is the click handler:

$("#scheduleLink").bind("click", (function () {
            loadScheduleEvent();
            $(".wrap_tabs").find("a").removeClass("active"); 
            $(this).addClass("active");
        }));

and loadScheduleEvent function:

function loadScheduleEvent() {
        var eventId = $(".movie").attr("eventId");
        var type = $(".movie").attr("type");
        $("#publicationBlockContent").load("/Publication/EventSchedule?eventId=" + eventId + "&type=" + type);
    }  

I suppose that this code work async. I want that alert("text") calls only when loadScheduleEvent is finished. How can I do this?

Thanks.

UPDATE: In fact, instead of alert("text") there is some code. And, I can't move this code to callback of $.load function.

Upvotes: 0

Views: 5151

Answers (4)

tim-montague
tim-montague

Reputation: 17412

Looks like there are 3 solutions:

1 - Create a function, and invoke it from a callback on .load

function loadComplete() {
    alert("text");
}

$("#scheduleLink")
.on("click", function () {

    $("#publicationBlockContent")
    .load("/my-url", function () {
        loadComplete();
    });

})
.trigger("click");

2 - Bind a custom event to $("#scheduleLink") called "loadComplete", and trigger it from a callback on .load

$("#scheduleLink")
.on("loadComplete", function () {
    alert("text");
})
.on("click", function () {

    $("#publicationBlockContent")
    .load("/my-url", function () {
        $("#scheduleLink").trigger("loadComplete");
    });

})
.trigger("click");

3 - If you don't need a .load, you can use the promise object supported by $.ajax, $.get and $.post

$("#scheduleLink")
.on("click", function () {

    return $.get("/my-url", function () {
        $("#scheduleLink").trigger("loadComplete");
    });

})
.trigger("click");

var promise = $("#scheduleLink").triggerHandler("click");
promise && promise.done(function () {
    alert("click");
});

Upvotes: 0

Dhrumil Bhankhar
Dhrumil Bhankhar

Reputation: 1321

If you don't want move that code replaced by alert alternatively all you can do is fire one event which triggers your behavior replaced by alert.

$("#scheduleLink").bind("click", (function () {
        loadScheduleEvent();
        $(".wrap_tabs").find("a").removeClass("active"); 
        $(this).addClass("active");
    }));



$(window).bind("scheduleComplete", (function (event,params) {
      alert(params);
    }));

Now in loadScheduleEvent you have to trigger it.

 function loadScheduleEvent() {
    var eventId = $(".movie").attr("eventId");
    var type = $(".movie").attr("type");
    $("#publicationBlockContent").load("/Publication/EventSchedule?eventId=" + eventId + "&type=" + type,function(){$(window).trigger("scheduleComplete");});
}

And at last when you what this sequence execute you have to trigger only click event

$("#scheduleLink").trigger("click");

Also if you dont want scheduleComplete event to be exposed for window you can bind it with your scheduleLink also and get that behavior scoped and specific!!!...

Upvotes: 1

worenga
worenga

Reputation: 5856

Use the .load Callback

$("#publicationBlockContent")
    .load("/Publication/EventSchedule?eventId=" + eventId + "&type=" + type,
          function(){alert("text");}
    );

rtm http://api.jquery.com/load/ for additional callback parameters etc.

Upvotes: 2

TRR
TRR

Reputation: 1643

$("#publicationBlockContent").load"/Publication/EventSchedule?eventId=" + eventId + "&type=" + type,    
function (responseText, textStatus, XMLHttpRequest) {     
if (textStatus == "success") {          
alert("success")
}
 if (textStatus == "error") {
      alert("failed")
 }
} 

Upvotes: 0

Related Questions