2014-09-22 138 views
-1

我用我的网页下面的jQuery代码:jQuery的window.load功能和Ajax调用

jQuery(window).load(function(){ 

    jQuery('#narrow-by-list dd > ol.filter_list').each(function(){ 
     var FormHeight = jQuery(this).outerHeight(); 
     if(FormHeight > 70){ 
      jQuery(this).next('.layer_nav_more').css("display", "inline-block"); 
      jQuery(this).height(70).css("display", "block"); 
     }else{ 
      jQuery(this).height(70).css("display", "block"); 
     } 
    }); 
    jQuery(".layer_nav_more").click(function(){ 
     jQuery(this).prev('.filter_list').animate({ height:205 }, 500, function() { 
      jQuery(this).addClass("scrollable"); 
     }); 
    }); 

}); 

该页还使用Ajax调用来更新它的内容,所以以后的内容被刷新了jQuery代码忽略。我不认为发布处理Ajax的完整js文件可以帮助你。我想以下几行应该对你了解正在发生的事情是相当好的:

requestUrl = document.location.href 
if (requestUrl.indexOf('#') >= 0) { 
    var requestUrl = requestUrl.substring(0,requestUrl.indexOf('#')); 
} 

if (requestUrl.indexOf('?') >= 0) { 
    requestUrl = requestUrl.replace('?', '?no_cache=true&'); 
} else { 
    requestUrl = requestUrl + '?no_cache=true'; 
} 

requestUrl = this.replaceToolbarParams(requestUrl); 

this.showLoading(); 
new Ajax.Request(requestUrl, { 
    method : 'post', 
    parameters : parameters, 
    onSuccess: this.onSuccessSend.bindAsEventListener(this), 
    onFailure: this.onFailureSend.bindAsEventListener(this) 
}); 

我该怎么做才能解决这个问题?


编辑: 我改变了基于大卫的建议

jQuery(window).load(function(){ 

    function adjust_list_height(){ 
     jQuery('#narrow-by-list dd > ol.filter_list').each(function(){ 
      var FormHeight = jQuery(this).outerHeight(); 
      if(FormHeight > 70){ 
       jQuery(this).next('.layer_nav_more').css("display", "inline-block"); 
       jQuery(this).height(70).css("display", "block"); 
      }else{ 
       jQuery(this).height(70).css("display", "block"); 
      } 
     }); 
    } 

    adjust_list_height(); 

    jQuery(document).on('click', '.layer_nav_more', function(){ 
     jQuery(this).prev('.filter_list').animate({ height:205 }, 500, function() { 
      jQuery(this).addClass("scrollable"); 
     }); 
    }); 

}); 
+1

问题是什么? – ysrb 2014-09-22 14:16:02

+0

@ysrb问题在于使用ajax重新加载页面内容后,each()函数不再有效。 – zekia 2014-09-23 07:24:13

回答

1

内容被刷新jQuery代码被忽略

没有打完这不是代码。它不会被自动重新调用,但为什么它应该是?您发布的处理程序是针对窗口的加载事件。除非你再次加载窗口,否则我不希望代码再次执行。

听起来像问题在于,在将click处理程序添加到现有元素后,即会向页面添加新元素。请记住,handlers are attached to elements, not to selectors。因此,如果执行此代码时某个特定元素不存在,则不会获得点击处理程序。

标准方法是将处理点击事件推迟到父元素。任何常见的父元素都可以,只要它在页面的生命期间不会被移除/替换。 document通常用于此目的,但任何父母div或类似的东西都可以。事情是这样的:

jQuery(document).on('click', '.layer_nav_more', function(){ 
    //... 
}); 

这样做是重视实际的点击处理程序document而不是向匹配.layer_nav_more元素。当任何元素调用点击时,该事件将向上传播通过父元素并调用其上的任何点击处理程序。当它到达document上的这个处理程序时,jQuery将使用第二个选择器筛选源元素。所以这将有效地处理来自.layer_nav_more元素的任何点击。

任何其他当您在逻辑上需要时,需要重新调用页面内容更改时需要调用的功能(除了可委派事件处理程序之外的功能)。例如,像您正在执行的一系列元素一样执行.each()。没有办法“推迟”那个,所以你想要把它封装在自己的函数中,并且只要你需要重新调用那个逻辑就简单地执行那个函数。

+0

谢谢你的解释。请看看问题更新。我应该在onSuccessSend函数内调用adjust_list_height()吗? – zekia 2014-09-23 07:21:11

+0

它似乎没有工作。我尝试添加jQuery('。layer_nav_more').css(“display”,“inline-block”);在onSuccessSend()函数的ned,但它没有工作。我相信这是我应该添加jQuery效果的功能,对吧? – zekia 2014-09-23 08:00:12

+0

我设法解决它最终。感谢您的帮助! – zekia 2014-09-23 08:10:40