【问题标题】:JSF custom component losing input focus on ajax updateJSF 自定义组件失去对 ajax 更新的输入焦点
【发布时间】:2011-11-01 11:32:10
【问题描述】:

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

<mycc:autocomplete id="myauto" searchMethod="#{bean.doSearch}"/>

这会像这样呈现 html:

<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>

com.myco.ajaxRequest() javascript 函数(keyup)这样做:

jsf.ajax.request(comp, null, {
                 execute: 'myauto',
                 render: 'myauto'
                 });

所以因为我想重建并重新呈现带有建议的列表框 列表,我正在重新渲染自定义组件“myauto”。通过指定执行: 'myauto' decode() 方法执行,我可以得到输入值。经过 指定 render: 'myauto' 执行 encode...() 方法以重新生成 html。

这一切都很好,但是因为我正在渲染 myauto_input 的父级 每次触发 keyup 事件时,我都会失去输入焦点。

如果我指定类似 render: 'myauto_listbox' 的内容(我只是真的想 毕竟重新渲染列表框)问题是编码...()方法 不要执行,因为它们是针对整个自定义组件的,而不仅仅是 列表框。它将在我重建的一种编码...()方法中 包含建议的列表框。

组件扩展了 UIInput,我在单独的渲染器中生成标记 (componentFamily = "javax.faces.Input") 在 encodeEnd() 方法中(所以这个 总是在任何提供的转换器之后运行 - 尚未实现)。我想 从 javascript 强制焦点是一种可怕的 hack,应该避免。

我有点不确定该去哪里,但我怀疑我所看到的 表明我以某种错误的方式处理这个问题。如果有人 足以为我指明正确的方向,我将不胜感激 它。

【问题讨论】:

    标签: javascript ajax jsf custom-component


    【解决方案1】:

    我已经花了一些时间来研究这个问题以及之后失去焦点的一般问题 ajax 更新相当普遍,在 Jim Driscoll 的 blog 中有描述(参见 '保持专注')。

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

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

    (注意:IE8 需要 .focus().focus().click(),只有 .focus() 适用于 chrome...)

    所以看起来可怕的黑客已经挽救了一天。我确实想知道是否会有 如果我使用 jQuery ajax 例程而不是 jsf ajax 库有什么不同,但是 我认为这不会有什么不同。

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 1970-01-01
      • 2017-09-17
      • 1970-01-01
      • 2019-11-27
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      相关资源
      最近更新 更多