环境:JSF 1.2 RI,RichFaces 3.3.2
我们利用jQuery来改变项目获得或失去焦点时的CSS类。这非常简单,但是当我们的部分渲染完成时,我们没有看到这些焦点和模糊事件绑定到新渲染的表单元素。这是可以预料的,因为这些事件在文档就绪时不在DOM上,但是我们已经尝试使用了几个插件(Listen和LiveQuery),因为.live()无法正常运行模糊和焦点事件在1.3.2中,也不在RichFaces提供的版本中。这些插件中的每一个都应该处理放置在文档上的新创建的项目。在实践中,虽然这些都没有像预期的那样表现。
我们将输入/选择/ textareas包装在div或span中,以便在我们的Ajax请求上更新各个部分的呈现。这是由于RichFaces中的限制,其中在部分重新渲染时不检查项目的渲染。除了这一小块之外,没有什么太令人兴奋的了。
我已经使用$('ol')。(txtForNewListItem)添加了项目,并确认livequery正确地为这些项目工作,而不是针对JSF新呈现的项目。
任何人都有类似的结果并找到了合适的解决方法?我看到的一种方法是覆盖document.createElement,但我们真的希望不惜一切代价避免这条路径。
答案 0 :(得分: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)答案 1 :(得分:1)
RichFaces将此内置为rich:jQuery组件。将selector属性设置为在jQuery语句中使用的内容。将查询设置为您要调用的函数。如果您正在重新绑定在加载时设置的元素,那么您还需要命名该组件,因为它们不会经历完整的重新渲染生命周期,并且不会更新。
rich:jQuery id="focusEventBinder" selector="#arbitraryId" query="focus(function () { jQuery(this).addClass('onfocus');});" name="focusEventBinder"
要解决此问题,只需让您的组件对您要调用的rich:jQuery组件的名称具有oncomplete属性。所以在上面的例子中,我们需要将它添加到我们的组件中:
oncomplete="focusEventBinder();"