通过 Ajax 更新 JSF 组件后,JavaScript/jQuery 事件侦听器不起作用

2023-11-23

我正在执行以下 jQuery 函数<p:dataTable>过滤器(其id是id),允许用户在过滤器组件中仅输入数字。

$(document).ready(function() {
    $("#form\\:dataTable\\:id\\:filter").keydown(function(event) {
        //Allow: tab, escape, and enter
        if(event.keyCode===9||event.keyCode===27||event.keyCode===13||
            //Allow: Ctrl+A, Ctrl+C
            (event.keyCode===65&&event.ctrlKey===true)||(event.keyCode===67&&event.ctrlKey===true)||
            //Allow: home, end, left, right
            (event.keyCode>=35&&event.keyCode<=39)){
            //let it happen, don't do anything
            event.preventCapture();
            return;
        }//backspace, delete
        else if(event.keyCode===46||event.keyCode===8)
        {
            return;
        }
        else{//Ensure that it is a number and stop the keypress
            if (event.shiftKey||(event.keyCode<48||event.keyCode>57)&&(event.keyCode< 96||event.keyCode>105)){
                //event.preventDefault();
                event.preventCapture();
            }
        }
    });
});

该函数位于context/resources/default/js/digit_only_textfield.js。因此,它可以用在 XHTML 页面上,例如:

<h:outputScript library="default" name="js/digit_only_textfield.js"/>

XHTML 页面如下所示。

<h:outputScript library="default" name="js/digit_only_textfield.js"/>

<h:form id="form" prependId="true">

    <!--PrimeFaces extension <pe:blockUI>-->         

    <p:remoteCommand name="updateTable" update="dataTable"/>

    <p:panel id="panel">
        <h:panelGrid id="panelGrid" columns="3" cellpadding="5">

            <!--Some UIInput components-->

            <p:commandButton id="btnSubmit" 
                             update="panel" 
                             onstart="PF('blockUIWidget').block();" 
                             oncomplete="if(!args.validationFailed) {updateTable();}PF('blockUIWidget').unblock();" 
                             actionListener="#{bean.insert}" 
                             value="Save"/>
        </h:panelGrid>
    </p:panel>

    <p:dataTable id="dataTable" 
                 var="row" 
                 value="#{bean}"
                 filterEvent="keydown"

                 ...
                 ...  >

                 ...
                 ...
    <p:dataTable>
<h:form>

这个 jQuery 对于 id 为的过滤器工作得很好is但是当这个<p:dataTable>通过按给定更新<p:commandButton>,它停止运行。

之后如何让这个功能发挥作用<p:dataTable>是通过AJAX更新的吗?


引入了一个新的问题域:

ThisPrimeFaces 社区论坛上的问题和相应回复仍然无法为以下问题领域提供解决方法/解决方案。

如果按了错误的键(即非数字键,退格键除外,请删除 等)然后,数据表被不必要地更新,导致一些 对数据库发起昂贵的查询,这完全是 不必要并且必须防止数据表被更新.


流程如下:

  • 浏览器检索 HTML 输出。
  • 浏览器根据 HTML 标记填充 HTML DOM 树。
  • 完成后,浏览器触发 HTML DOMready event.
  • jQuery 的$(document).ready()函数处理程序都被调用。
  • 你通过 ID 在 DOM 中找到一个元素并附加一个keydown聆听它。
  • 在用户交互期间,会触发 ajax 请求,并使用 ajax 响应传递的新 HTML 元素更新 HTML DOM 树。
  • 其中,正是该元素具有keydown侦听器从 HTML DOM 树中删除,并替换为一个没有任何内容的全新元素keydown听众。该文件ready在 ajax 请求期间不会触发事件。您的就绪处理程序永远不会被重新调用。这keydown监听器永远不会重新连接。对于最终用户来说,它确实看起来“停止运行”。

解决方案在这个特殊情况现在应该很明显了:明确地重新附加keydownajax 调用完成时的侦听器。最直接的方法是提取附加的工作keydown侦听器进入可重用函数并按如下方式触发它:

function applyKeydownOnTableFilter() { 
    // ...
}

$(document).ready(applyKeydownOnTableFilter);

这样你就可以做:

<p:commandButton ... oncomplete="applyKeydownOnTableFilter()" />

但对每个 ajax 命令/侦听器重复执行此操作非常乏味,而且维护起来不太友好。更好的方法是采用不同的方法:使用 jQuery$.on()反而。代替

$(document).ready(function() {
    $("#form\\:dataTable\\:id\\:filter").keydown(function(event) {
        // ...
    });
});

by

$(document).on("keydown", "#form\\:dataTable\\:id\\:filter", function(event) {
    // ...
});

这样一来keydown侦听器实际上并不附加到感兴趣的元素。相反,由于 JavaScript 的事件冒泡特性,keydown 事件最终会到达$(document)— 在 JSF ajax 请求期间始终存在且通常不会更改。一旦达到,$(document).on()被触发,然后将确定事件源并检查它是否与给定的选择器匹配,如果是,则调用该函数。这一切都无需附加keydown监听物理元素,因此对元素是否在 HTML DOM 树中被删除/替换不敏感。

也可以看看:

  • JSF/PrimeFaces ajax 更新破坏了 jQuery 事件侦听器函数绑定

顺便问一下,您是否也看到 HTML DOM 树和 JSF 组件树之间有多少相似之处?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 Ajax 更新 JSF 组件后,JavaScript/jQuery 事件侦听器不起作用 的相关文章

随机推荐

  • 为什么 Guava 的 TypeToken.getRawType() 返回 Class<?超级 T> 而不是 Class

    来自 Effective Java Second Edition 第 28 条 不要使用通配符类型作为返回类型 这不会为用户提供额外的灵活性 而是会迫使他们在客户端代码中使用通配符类型 public final Class
  • 使用 Nashorn (JSR 223) 和预编译进行 Java 脚本编写

    我通过 JSR 223 使用 Nashorn 来执行用户输入脚本的小片段 public Invocable buildInvocable String script throws ScriptException ScriptEngine e
  • AWS Lambda 和 SNS:跨区域调用 Lambda

    我有一个部署到多个区域的 Lambda 函数 我想向 SNS 发布一条消息来调用这些函数 我使用 aws cli 创建了主题 授予 Lambda 与 SNS 通信的权限 并创建订阅 订阅似乎已成功创建 我可以在 AWS 控制台中看到它 但是
  • 为什么对域名后的第一个斜杠进行 url 编码会破坏 url?

    萨尔维特 我发现某种 url 编码方式会破坏链接 作为记录 2f代表正斜杠字符 现在 考虑一下 原文链接 http dottech org 95285 this is the pacific barreleye a fish with a
  • 方法名称为空,这实际上是做什么的?

    我目前正在自学 Objective C 和 iOS 编程 发现自己由于这个微妙的错误而陷入了无法工作的代码一个小时 考虑以下代码 property strong nonatomic NSString name NSString name r
  • Bootstrap-Datetimepicker 不适用于 jQuery 3

    Bootstrap datetimepicker 不适用于 jQuery 3 1 1 我需要使用相同的 jQuery 库来运行所有其他依赖函数 我遇到同样的错误 input size is not a function TypeError
  • 递归数组类型打字稿

    说我有类型type Atom string boolean number 我想定义一种数组类型 例如 NestedArray Atom a 0 a 1 a n 其中每个a i is an Atom or a NestedArray 这可以在
  • 1093 MySQL 表被指定两次时出错

    我正在尝试更新一些行 我只想更新 ID 0 的行 我收到的错误消息是 1093 表 ch 15 posts 被指定两次 既作为 UPDATE 的目标又作为单独的数据源 这是我正在使用的代码 欢迎大家提出意见 UPDATE ch 15 pos
  • 从基类创建子类的克隆副本

    考虑这种情况 public class Base public int i public class Sub Base public void foo do stuff 然后我想 举个例子Base获取一个克隆实例Sub 在本例中 i 17
  • 这是什么?????!运算符在C中做什么?

    我看到一行C 看起来像这样 ErrorHasOccured HandleError 它编译正确并且似乎运行正常 看起来它正在检查是否发生了错误 如果发生了 它就会处理它 但我不太确定它实际上在做什么或它是如何做的 看起来程序员确实正在尝试表
  • 如何在 Yii2 Active Record 中使用 JOIN 建立关系模型?

    我有 2 张表 分别称为 书籍 和 评论 Books 表与 Reviews 具有一对多关系 我想搜索书籍并按评论对它们进行排序 例如 如果有 10 本书可用 并且书籍在评论中有评论 那么我想使用 WHERE 子句查找所有书籍并计算评论数量
  • 开发人员应该首先考虑可读性还是性能? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 开发人员常常面临着在解决问
  • 如果在pluginManagement下定义插件,maven目标将无法正确执行

    我有 maven jaxb2 plugin 我生成 jaxb 对象并在项目的其他类中引用它 我已将 jaxb 插件和编译器插件放在pluginManagement 标记下 Maven 首先执行编译阶段而不是生成阶段 就好像我删除了plugi
  • 从源字符串中查找多个索引

    基本上我需要执行 String IndexOf 并且需要从源字符串中获取索引数组 有没有简单的方法来获取索引数组 在问这个问题之前 我已经用谷歌搜索了很多 但没有找到解决这个简单问题的简单解决方案 这个扩展方法怎么样 public stat
  • 创建一个带有直角三角形/指针的按钮

    Looking to create this 实现这一目标的最佳方法是什么 IT MUST 我绝对希望将文本保留为文本 因此不使用图像 另外 我希望它可以重复使用 以便我可以在其中放入不同的文本 理想情况下 箭头部分应与文本一样高 很高兴有
  • 使 JButton 不可见但可点击?

    如何在java中制作一个不可见但可点击的JButton button setVisible false 使按钮不可见 但不可点击 是否有任何方法使其不可见 但可点击 我尝试这样做 button setVisible false button
  • Eclipse:编辑源代码并继续调试

    我正在使用 Eclipse IDE Helios 版本 在Eclipse中调试时 是否可以编辑源代码并继续调试 例如我有这个文件 在调试时 当我尝试在调试期间修改 a4 值时 它没有反映 public class Tes public st
  • 在 SSE2/SSSE3 上转置 8 个 16 位元素寄存器

    我是 SSE asm 的新手 如果这是显而易见的或多余的 我深表歉意 有没有比执行 24 个 unpck lh ps 和 8 16 混洗以及使用 8 个额外寄存器更好的方法来转置包含 16 位值的 8 个 SSE 寄存器 注意最多使用 SS
  • 为什么 setdefault 在设置 key 时评估默认值?

    为了说明这个问题 我创建了一个简单的例子 usr bin env python class Person def init self self cache def get person age self def get age print
  • 通过 Ajax 更新 JSF 组件后,JavaScript/jQuery 事件侦听器不起作用

    我正在执行以下 jQuery 函数