2010-01-05 108 views
4

环境:JSF 1.2 RI,RichFaces 3.3.2jQuery事件绑定

我们利用jQuery来在项目获得或失去焦点时更改CSS类。这是非常直接的,但是当我们的部分渲染完成时,我们没有看到这些焦点和模糊事件绑定到新呈现的表单元素。这是可以预料的,因为这些事件不在文档准备就绪的DOM上,但是我们试图利用一些插件(Listen和LiveQuery),因为.live()对模糊和焦点事件不起作用在1.3.2中,也不在RichFaces提供的版本中。这些插件中的每一个都应该处理放置在文档上的新创建的项目。实际上,虽然这些都不如预期的那样。

我们将输入/选择/ textareas包装在div或跨度中,以便在我们的Ajax请求上更新各个部分的呈现。这是由于RichFaces中的限制,其中在部分重新呈现时未检查项目的呈现。除此之外,没有什么太刺激的事情发生。

我添加了使用$('ol')。后的项目(txtForNewListItem)并确认livequery正确地为这些项目工作,而不是针对已由JSF新鲜呈现的项目。

任何人都有类似的结果,并找到一个合适的解决方法?我所看到的一种方法是重写document.createElement,但我们真的希望不惜一切代价避免这种路径。

回答

1

RichFaces将此内置为rich:jQuery组件。将选择器属性设置为您在jQuery语句中使用的内容。将查询设置为您希望调用的函数。如果您重新绑定了在载入时设置的元素,那么您还需要命名组件,因为它们不会经历完整的重新渲染生命周期,并且不会有更新。

 rich:jQuery id="focusEventBinder" selector="#arbitraryId" 
      query="focus(function() { jQuery(this).addClass('onfocus');});" 
      name="focusEventBinder" 

要解决此只是有你的组件有一个属性的onComplete对富人的名字:jQuery的组件,你想打电话。因此,在上面的示例中,我们需要将此添加到我们的组件中:

 
oncomplete="focusEventBinder();" 
+0

有趣的,解决您自己的问题。 – Nix 2010-05-18 14:32:38

2

如果我理解你是正确的,那么在文档准备好之后,使用$('ol').after(txtForNewListItem)添加HTML内容。

所以你需要重建你的列表。我做类似的事情。这里是“伪”代码:

ol.append(
    jQuery("<li/>") 
    .attr("id", "someID") 
    .append(jQuery("<span/>") 
     .addClass("btnRemoveItem") 
     .attr("title", "Remove item from list") 
     .attr("id", data[i].id) 
     .click(function() { alert('hello') }) 
    ) 
    .append("txtForNewListItem") 
    ); 

你需要在这段代码上工作一下,但希望它能让你知道你需要做什么。

啊...发现我的线程在哪里我得到了答案。看看这里:Not able to bind click event to newly created span items (jQuery)

+0

项目未通过jQuery添加到DOM。通过声明我已经通过append方法将元素添加到了DOM中,我的意思只是暗示我这样做是为了测试我的livequery方法的实现 - 哪些工作可行。问题在于,当使用JSF生命周期第一次渲染项目时,livequery/listen事件没有正确绑定。 – Scott 2010-01-05 21:36:07

+0

如果$('ol')。(txtForNewListItem)'工作后,那么所有其他jQuery触发器也应该工作。我不知道JSF。 – Steven 2010-01-05 22:40:42