开发者

.live() or .livequery()

I have a site that is Ajaxed, content that is Ajax is from other pages, such as about.html, contact.html. The ajax is getting the content from a div called #main-content. But after the ajax call, rest of my scripts break. Such as the tinyscrollbar() plugin and some other custom functions.

I searched for about 4 days and found out that my problem was the AJAX request changing the DOM, and since scripts being loaded before that, it doesn't run after the ajax call.

If i'm right, what would I need to fix this? .live() or the .livequery() plugin?

All the JS I am using is in this:

var $dd = $('.projects dl').find('dd'), $defBox = $('#def-box');

  $defBox.hide();
  $('.projects').hover(function(){
    $defBox.stop(true, true)
      .fadeToggle(1000)
      .html('<p>Hover The links to see a description</p>');
  });

  $dd.hide();
  $('.projects dl dt').hover(function(){
    var $data = $(this).next('dd').html();
    $defBox.html($data);
    }); 

  // Ajax Stuff 
  // Check for hash value in URL  
  var hash = window.location.hash.substr(1);

  //  Check to ensure that a link with href == hash is on the page  
  if ($('a[href="' + has开发者_StackOverflow中文版h + '"]').length) {
    //  Load the page.
    var toLoad = hash + '.php #main-content';
    $('#main-content').load(toLoad);
  }

  $("nav ul li a").click(function(){
    var goingTo = $(this).attr('href');
    goingTo = goingTo.substring(goingTo.lastIndexOf('/') + 1);
    if (window.location.hash.substring(1) === goingTo) return false;

    var toLoad = $(this).attr('href')+' #main-content',
    $content = $('#main-content'), $loadimg = $('#load');

    $content.fadeOut('fast',loadContent);  
      $loadimg.remove();  
      $content.append('<span id="load"></span>');  
      $loadimg.fadeIn('slow');  
    window.location.hash = goingTo;

    function loadContent() {  
        $content.load(toLoad,'',showNewContent)  
    }  
    function showNewContent() {  
        $content.fadeIn('fast',hideLoader);  
    }  
    function hideLoader() {  
        $loadimg.fadeOut('fast');  
    }  
    return false;  

  });


For plugins, neither really. You can simply re-init your plugins within $.load's complete callback:

$('#main-content').load(toLoad, function() {
    $("#foo").tinyscrollbar();
    $("#bar").facebox();
    // etc
});

For event handlers, you can rebind them within the callback as in the above example, or use .live or .delegate (which you already seem to be using) to ensure that the binding persists for future (ajax-replaced) elements, e.g.:

$('.projects dl').delegate("dt", "hover", function() {
   ...
}, function() {
    ...
});

or:

$('.projects dl dt').live("hover", function() {
   ...
}, function() {
    ...
});
0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜