Javascript JSF自定义组件在ajax更新中失去输入焦点

Javascript JSF自定义组件在ajax更新中失去输入焦点,javascript,ajax,jsf,custom-component,Javascript,Ajax,Jsf,Custom Component,我正在编写一个自动完成自定义组件,作为使用JSF的学习练习 2.1.3. 这个想法(可能很熟悉)是在 和输入组件,并显示具有匹配值的列表框。这个想法是 在调用jsf.ajax.request()的输入上有一个keyup javascript事件 以更新组件。到目前为止,我有一个组件,我可以包括像 这: 所以,因为我想用建议重新构建并重新命名列表框 列表中,我正在呈现自定义组件“myauto”。通过指定执行: “myauto”decode()方法执行,我可以获得输入值。通过 指定render:'m

我正在编写一个自动完成自定义组件,作为使用JSF的学习练习 2.1.3. 这个想法(可能很熟悉)是在 和输入组件,并显示具有匹配值的列表框。这个想法是 在调用jsf.ajax.request()的输入上有一个keyup javascript事件 以更新组件。到目前为止,我有一个组件,我可以包括像 这:

所以,因为我想用建议重新构建并重新命名列表框 列表中,我正在呈现自定义组件“myauto”。通过指定执行: “myauto”decode()方法执行,我可以获得输入值。通过 指定render:'myauto'encode…()方法执行以重新生成 html

这很好,但因为我正在渲染myauto_输入的父对象 每次触发keyup事件时,组件I都会丢失输入焦点

如果我指定类似render的内容:“myauto_listbox”(我只想 问题是encode…()方法 不要执行,因为它们是针对整个自定义组件的,而不仅仅是 列表框。它将出现在我重建的一个encode…()方法中 包含建议的列表框

该组件扩展UIInput,我在单独的渲染器中生成标记 (componentFamily=“javax.faces.Input”)在encodeEnd()方法中(因此 始终在任何提供的转换器之后运行(尚未实现)。我想 从javascript强制集中注意力是一种可怕的攻击,必须避免

我有点不确定该怎么办,但我怀疑我看到的 表示我以错误的方式处理此问题。如果有人 如果你能给我指出正确的方向,我将不胜感激
它。

我花了一些时间来研究这一点,以及之后失去焦点的一般问题 ajax更新相当常见,在Jim Driscoll的文章中有描述(参见 “保持专注”)

在我的自定义组件的情况下,我(认为我…)必须更新自定义组件 它本身是输入的父对象,所以我会因为 ajax更新,这就是它的方式。因此,我已经考虑了需要做什么 这样做是为了恢复焦点,似乎在我的渲染器编码,我只是要 强制将焦点恢复到输入,但仅在响应jsf.ajax.request从onkeyup事件发送的POST时。我使用jQuery,只是调用。focus()不是 足够了,因为您还必须将光标位置移到任何现有对象的末尾 输入。下面的代码似乎正常工作:

<script>
  jQuery(function($){var cid='#myauto_input';$(cid).focus().focus().click();$(cid).val($(cid).val());});
</script>

jQuery(函数($){var cid='#myauto_input';$(cid).focus().focus().click();$(cid).val($(cid.val());});
(注意:.focus().focus().click()是IE8所必需的,只是.focus()适用于chrome…)

看来恐怖的黑客拯救了这一天。我不知道会不会有 如果我使用jQuery ajax例程而不是jsf ajax库,有什么区别吗 我想这不会有什么不同

<span id="myauto">
  <input type="text" id="myauto_input" name="myauto_input"
    onkeyup="com.myco.ajaxRequest(this, event)"/>
  <select id="myauto_listbox" name="myauto_listbox">
    <option value="1st">First</option>
    <option value="2nd">Second</option>
  </select>
</span>
jsf.ajax.request(comp, null, {
                 execute: 'myauto',
                 render: 'myauto'
                 });
<script>
  jQuery(function($){var cid='#myauto_input';$(cid).focus().focus().click();$(cid).val($(cid).val());});
</script>