【问题标题】:JSF + jQuery : AJAX Rendering forces a re-binding to client side (jQuery) eventsJSF + jQuery:AJAX 渲染强制重新绑定到客户端 (jQuery) 事件
【发布时间】:2011-12-21 03:45:32
【问题描述】:

这对我来说是一个重复的问题,我有一个解决方案,但它有点混乱,我想知道是否有更好的解决方案或以某种方式完全避免这个问题。

当我从 jQuery 绑定到 DOM 组件,然后使用 JSF/AJAX 重新渲染该组件时,会出现此问题。

例如:

<h:commandButton>
  <f:ajax render="rerenderedObject" />
</h:commandButton>

<h:panelGroup id="rerenderedObject">
  ...
</h:panelGroup>

在 jQuery 方面:

var componentBound = false;
function bindToClick() {
   if (componentBound === false) {
      componentBound = true;
      $('#rerenderedObject').click(function() { 
        // DO SOMETHING 
      });
   }

}

每当rerenderedObject 重新渲染(按下按钮)时,与click 的绑定就会丢失

我已经通过使用这段代码绑定到 JSF 来克服这个问题:

$(window).load(function () {
    jsf.ajax.addOnEvent(function(data){
        if (data.status === "success") {
            bindToClick();
        }
    });
});

然而存在多个事件绑定的问题(因为不是每个 ajax 事件都会重新渲染 rerenderedObject),因此存在 componentBound` 变量。

这是我的解决方案,我想知道是否有人必须处理这个问题以及您的解决方案是什么。

谢谢!

【问题讨论】:

    标签: jquery ajax jsf-2


    【解决方案1】:

    请改用jQuery.live()。它会在新添加的元素上放置一个监视器并重新应用相同的事件处理程序。

    $('#rerenderedObject').live('click', function() { 
        // DO SOMETHING 
    });
    

    【讨论】:

    • 哇! Tnx,没想到会这么简单 :-) 所以我应该在jQuery.ready() 上重新绑定它?
    • 另外,刚刚看到:从 jQuery 1.7 开始,.live() 方法已被弃用。使用 .on() 附加事件处理程序。旧版本 jQuery 的用户应该使用 .delegate() 而不是 .live()。
    • 哦,谢谢你的弃用通知,我已经一年多没有用过jQuery了。
    猜你喜欢
    • 2018-06-09
    • 2018-01-05
    • 1970-01-01
    • 2015-02-15
    • 2011-02-06
    • 2014-04-20
    • 2017-05-08
    • 2014-07-27
    • 2016-07-23
    相关资源
    最近更新 更多