views:

134

answers:

2

I'd like to set up a drag'n'drop list inside a modal window. The window's content is loaded via an AJAX call, so I believe I need to use jQuery's .live() method.

Here is my current code:

$('#cboxLoadedContent').live('load', function() {
    // Event for sortable page lists
    $('ul#pageList').sortable();
});

How can I set up bindings when the modal window loads? The modal window comes from the colorbox plugin.

Note: I'm guessing that 'load' is not the right event to use, because if I throw a simple alert() in there, it doesn't even show up when the window loads.

A: 

It depend in which modal window are you using.

If you are using the jquey UI dialog, you can use the opendialog event.

So you can bind a function to that event that is triggered when the dialog open.

$( ".selector" ).bind( "dialogopen", function(event, ui) {
  ...
});

If you are not using the jqueryUI you have to go to the code and look if some event is triggered when the popup opens.

This doesn't work, unfortunately. I had to add the binding to the `onComplete` attribute of my Colorbox.
thinkswan
+1  A: 

In your case, just call .sortable() on the elements when you're loading them via ajax, like this:

$.ajax({
   url: 'page.html',
   //stuff...
   success: function(data) {
     //Put stuff in DOM
     $('ul#pageList').sortable();
   }
});

For the why part: .live() doesn't work this way, it doesn't wait for new elements and do things...it listens for events from elements that bubble up the DOM then executes event handlers if it has a selector that matches.

Nick Craver
Ah, I had to add the .sortable() binding to the `onComplete:` attribute of the Colorbox. Thank you for the explanation of why `.live()` did not do the job as well. That clears up a lot!
thinkswan