Ajax 侦听器事件 valueChange 似乎触发 onClick 而不是 onChange

2023-12-25

我有一个想要显示的嵌套问题列表。最初,我显示 1 级问题,然后根据用户对其父问题的回答显示子问题。所有问题都有一个单选按钮,有些问题有一个输入框,用于在用户选择“是”时显示附加信息

这是我的带有嵌套数据表的 JSF 代码。请注意,我已经取消了这些问题的格式,以便简化论坛上的问题,因此如果您将此代码复制到您自己的环境中并运行代码,这些问题可能看起来“不漂亮”:

<h:dataTable id="questionTable" var="q" value="#{generalQuestionBean2.questions.questions}">
<h:column><h:panelGroup id="questionGrp">
#{q.question} <h:selectOneRadio value="#{q.answer}">
<f:selectItem itemValue="1" itemLabel="Yes"/>
<f:selectItem itemValue="0" itemLabel="No"/>
<f:ajax event="valueChange" execute="@form"
    render="questionGrp"
    listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio> <h:inputText value="#{q.addnInfo}"
rendered="#{q.answer eq '1' and q.field ne 'otherCov'}"></h:inputText>

<h:panelGroup id="questionGrpSubs" rendered="#{q.addnQuestions ne null and q.answer eq '1'}">
<h:dataTable id="subQuestionTable" var="subq" value="#{q.addnQuestions}">
<h:column><h:panelGroup id="subQuestionGrp">
->#{subq.question} <h:selectOneRadio id="answer" value="#{subq.answer}"> 
 <f:selectItem itemValue="1" itemLabel="Yes"/>
 <f:selectItem itemValue="0" itemLabel="No"/>
 <f:ajax event="valueChange" execute="@form"
    render="subQuestionGrp"
    listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio><h:inputText value="#{subq.addnInfo}"
rendered="#{subq.answer eq '1' and subq.field ne 'voluntaryComp' and subq.field ne 'uslh'}"></h:inputText>

<h:panelGroup id="questionGrpSubs2" rendered="#{subq.addnQuestions ne null and subq.answer eq '1'}">
<h:dataTable id="sub2QuestionTable" var="sub2q" value="#{subq.addnQuestions}">
<h:column><h:panelGroup id="sub2QuestionGrp">
-->#{sub2q.question} <h:selectOneRadio id="answer" value="#{sub2q.answer}"> 
 <f:selectItem itemValue="1" itemLabel="Yes"/>
 <f:selectItem itemValue="0" itemLabel="No"/>
 <f:ajax event="valueChange" execute="@form"
    render="sub2QuestionGrp"
    listener="#{generalQuestionBean2.reset}"/>
</h:selectOneRadio><h:inputText value="#{sub2q.addnInfo}"
rendered="#{sub2q.answer eq '1'}"></h:inputText>

</h:panelGroup></h:column>
</h:dataTable></h:panelGroup>
</h:panelGroup></h:column>
</h:dataTable></h:panelGroup>
</h:panelGroup></h:column>
</h:dataTable>

以下是支持 bean 上的重置函数的代码:

private void reset(AjaxBehaviorEvent event) {
    FacesContext context = FacesContext.getCurrentInstance();
    String id = event.getComponent().getClientId(context);
    String[] tokens = id.split("[:]+");
    int qId = -1;
    int subqId = -1;
    int sub2qId = -1;
    for (int i = 0; i < tokens.length; i++) {
        if(tokens[i].equals("questionTable")) 
            qId = Integer.parseInt(tokens[i+1]);
        if(tokens[i].equals("subQuestionTable"))
            subqId = Integer.parseInt(tokens[i+1]);
        if(tokens[i].equals("sub2QuestionTable"))
            sub2qId = Integer.parseInt(tokens[i+1]);

    }
    Question q = questions.getQuestion(qId);
    Question processQ = q;
    String defaultSubAnswer = getDefaultSubAnswer(q.getField());
    Question subq;
    Question subq2;
    if(subqId > -1) {
        subq = q.getAddnQuestions().get(subqId);
        processQ = subq;
        if(sub2qId > -1) {
            subq2 = subq.getAddnQuestions().get(sub2qId);
            processQ = subq2;
        }
    }
    resetValue(processQ, defaultSubAnswer);
}


private void resetValue(Question q, String defaultSubAnswer) {
    q.setAddnInfo("");
    if(q.getAddnQuestions() != null) {
        for (int i = 0; i < q.getAddnQuestions().size(); i++) {
            Question subq = q.getAddnQuestions().get(i);
            subq.setAnswer(defaultSubAnswer);
            resetValue(subq, defaultSubAnswer);
        }
    }
}

问题是这样的:

ajax 事件应默认为“valueChange”。如果我单击“是”,然后再次单击“是”,则 ajax 调用不应发生,对吗?但事实确实如此,因为附加信息框正在根据重置功能清除。

我最初尝试向重置函数添加一个条件来检查单击的按钮的值,并且仅在答案为“0”(否)时重置 addnInfo 值和子问题。但这会导致渲染问题,因为 ajax 调用会将输入框和子问题渲染为隐藏,并且该值将保留在前端,即使它们在支持 bean 上重置也是如此。当它们重新渲染到前面时,会显示保留的值,而不是支持 bean 中的值。

另一种尝试是使用 ValueChangeListener 来重置值。但这仍然存在与重新渲染时保留的值相同的问题。

我尝试了 3 种不同的方法(上面列出),但都失败了。我愿意听取其中任何一个的解决方案或可能的另一个解决方案。请记住,用户的格式限制使我可以使用的选项较少。


Ajax 侦听器事件 valueChange 似乎触发 onClick 而不是 onChange

这确实是默认的valueChange由各个 JSF 组件生成的单选按钮和复选框使用的事件。检查生成的 HTML 源代码,您会发现它已连接到onclick。 JSF 默认情况下这样做的原因对于复选框来说是明确的,但对于单选按钮乍一看并不完全清楚,因为它们无论如何都无法取消选中。真正的原因是这样做是为了确保 IE6/7 兼容性onchange在该浏览器中第一次单击时不会被触发。

如果您不关心 IE6/7 用户(但其分布最近急剧下降),则将其更改为event="change"反而。

<f:ajax event="change" ... />

这样 JSF 将生成事件处理程序onchange反而。


Update: 你可以用jQuery http://jquery.com's .on('change')函数绑定器将修复 IE6/7 上的错误行为change事件。将以下内容包含在<h:head>如果您还没有使用 jQuery:

<script src="http://code.jquery.com/jquery-latest.min.js"></script>

并在加载时执行此函数:

$(function() {
    $(':radio').each(function() {
        var handler = this.onclick;
        this.onclick = null;
        $(this).on('change', handler);
    });
});

这基本上将为每个单选按钮移动 JSF 生成的onclick归因于change由 jQuery 管理的事件处理程序,以便它在所有浏览器中保持一致,包括 IE 6/7。

我们当然也可以使用纯 JS 来完成,但这需要大量的样板文件和跨浏览器敏感代码。

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

Ajax 侦听器事件 valueChange 似乎触发 onClick 而不是 onChange 的相关文章

  • 同一页面上具有不同ajax源的多个DataTable

    我在一个页面上有几个表格 使用数据表 http datatables net 每个都需要有自己的 sAjaxSource 我似乎无法确切地弄清楚如何做到这一点 这是我拥有的最少代码 var oTable datatable dataTabl
  • 使用 jquery fullCalendar 时,为什么我在切换月份后看到重复的事件?

    I am 使用 jquery fullCalendar 插件 http arshaw com fullcalendar 我遇到了一个奇怪的问题 当我加载第一个月 在本例中为 2013 年 12 月 时 它工作正常 我调用我的 ajax 事件
  • json_encode 创建格式错误的 JSON 数据?

    我有一个 codeigniter 应用程序将一些数据从数据库返回到视图 我正在尝试将其作为 json 数据发送回来 问题是返回的数据格式错误 它看起来像这样 2 5 Admin1 2 10 Admin2 当我在 jsonlint com 上
  • AJAX 表单正在向自身提交?

    我不知道今晚发生了什么 但我似乎无法让 AJAX 工作 提交表单后 它会使用 URL 中的值刷新页面 我正在使用具有提交处理程序的验证插件 但它仍然会刷新 我以前用过这个方法 没有出现任何问题 看看这里的页面 让我知道您的想法 div cl
  • 在 FacesConverter 中使用 ManagedBean

    我想用ManagedBean in my Converter The ManagedBean负责从数据库获取数据 在Converter我想将字符串转换为必须从数据库获取的对象 这是我的转换器 FacesConverter forClass
  • 如何将 STRUCT - OR - JSON 传递给 Coldfusion CFC 方法

    我有一个现有的 CFC 在将结构传递到方法中时可以正常工作 问题是 我们现在还需要通过 JSON 将数据传递到同一函数中 这是 CFC 片段
  • java.lang.IllegalStateException - 提交响应后无法创建会话

    我在我的项目中使用 JSF PrimeFaces 我为此准备了一个Maven项目 当我编译项目并加载主页后 我收到以下异常 java lang IllegalStateException Cannot create a session af
  • 如何在 HTML / Javascript 页面中插入 PHP 下拉列表

    好吧 这是我的第二篇文章 请接受我是一个完全的新手 愿意学习 花了很多时间在各个网站上寻找答案 而且我几乎已经到达了我需要到达的地方 至少在这一点上 我有一个网页 其中有许多 javascript 函数 这些函数一起使用 google 地图
  • CckEditor - 从 AJAX 加载的模板

    我正在使用 CkEditor 并且想要定义一个自定义模板 该模板使用 AJAX 函数来加载 HTML 字符串 我已经能够定义自定义模板 但如果我对模板对象的 html 属性使用函数 则该函数永远不会执行 是否可以使用 AJAX 和默认模板插
  • JSF 命名 Bean,Eager 应用程序范围(又名 @ManagedBean(eager=true) )

    有没有办法初始化带有注释的命名Beanjavax inject Named javax enterprise context ApplicationScoped like ManagedBean eager true from javax
  • 回到使用 ajax 的 PushState 条目

    我对以下情况有疑问 用户访问网站 用户点击使用history pushState的链接来更新url 通过ajax加载部分页面内容 使用jQuery 用户单击加载新页面的常规链接 用户点击返回返回到pushState条目 该页面现在仅显示通过
  • 将 JSON 发布到 Python CGI

    我已经安装了 Apache2 并且 Python 可以工作 但我有一个问题 我有两页 一个是 Python 页面 另一个是带有 JQuery 的 Html 页面 有人可以告诉我如何让我的 ajax 帖子正常工作吗
  • 使用 AJAX 和 JQuery 按设定的时间间隔刷新 Rails 部分

    I have a page in my rails application that looks like 现在 我有另一个用 python 编码的人工智能应用程序 它处理视频 显示在 Rails 应用程序页面的左侧 并使用捕获的车辆及其相
  • Primefaces 对话框渲染两次

    我创建了一个 ui component 来像弹出窗口一样使用 因此我可以使用此模板的标准创建很多弹出窗口 该组件只是一个带有两个按钮 取消和提交 的弹出窗口和一个可以覆盖的内容 如下所示
  • 在网页上的文本框中键入内容时删除所有空格

    我如何在用户打字时即时删除输入到文本框中的空格 function var txt myTextbox var func function txt val txt val replace s g txt keyup func blur fun
  • 如何处理 ASP.net MVC Ajax 加载页面上的 jQuery 事件?

    我有一个问题 我是 jQuery Mobile 领域的新手 对于 ASP Net MVC 部分我有点迷失 这是我的问题 在我的移动网站中 我想更改导航栏 我使用的更像是应用程序栏 按钮 而我位于编辑页面或主页等 因此 这些页面 编辑 显示
  • 如何在 JSF 中实现登录过滤器?

    即使用户知道某些页面的网址 我也想阻止某些页面的访问 例如 localhost 8080 user home xhtml 需要先登录 如果没有登录则重定向到 index xhtml 在 JSF 中如何做到这一点 我在谷歌上看到需要一个过滤器
  • 如何使用 jquery ajax 将锚点的值发送到 php

    我正在尝试使用 jquery 将几个锚点的值发送到 php 文件 但我没有从 php 脚本中得到回调 div class result div a href value class star Star 5 a a href value cl
  • 如何在文档加载时立即进行 AJAX 调用

    我想在加载文档后立即执行 ajax 调用 我正在做的是加载一个字符串 其中包含我将用于自动完成功能的数据 这就是我所做的 但它没有调用servlet 我删除了对各种 JS 脚本的调用 以使其更清晰 我在代码中做了几个类似的 AJAX 调用
  • AJAX:检查字符串是否为 JSON?

    我的 JavaScript 有时会在这一行崩溃 var json eval this responseText 当争论时会导致崩溃eval 不是 JSON 在进行此调用之前有什么方法可以检查字符串是否为 JSON 我不想使用框架 有什么方法

随机推荐

  • ms-transform 与 webkit-transform?

    我是 CSS 变换和动画的新手 我只是想知道这两者之间有什么区别 I under webkit transform特定于 chrome 和 moz tranform是 Mozilla Firefox 我找不到 webkit 和 ms 之间的
  • JavaFX 使用线程和 GUI

    我在使用 JavaFX 和线程时遇到问题 基本上我有两个选择 与Tasks or Platform runLater 我认为Platform runLater应用于简单 短期任务 并且Task对于较长的 但是 我无法使用其中任何一个 当我打
  • 如何使用 SQL 从字符串中提取数字

    我有一个字符串 string TEST RESULTS TEST 1 RESULT 1 除了数字之外 字符串 文本保持不变 需要 TEST 中的 1 需要结果中的 1 用于如下查询 SET sql SELECT FROM TABLE WHE
  • Windows(XP、7 等)中的数据包过滤

    如何在 Windows 中过滤 允许 拒绝等 传出数据包 我想搜索 TCP 或 UDP 数据包类型以在数据段中查找 例如 387602304fd236e048125453b1fa10c980e9dad4fa7f3f5dd2497c2e8b2
  • 自定义 WP 图像编辑小部件

    在编辑包含图像的帖子时 WP 会在图像上附加一个属性检查器图标 以允许编辑基本属性 例如大小 对齐方式 链接等 我想知道侵入此对话框屏幕并向链接区域添加一些自定义编程有多困难 我想在那里添加一个弹出菜单 只需单击一个按钮 位于现有的 链接到
  • 如何更改 Android 中 Spinner 控件的下拉箭头箭头?

    我正在编写一个 Android 应用程序 其中使用 Spinner Control 我通过创建自己的列表来自定义微调器控件 我想更改微调器控件旁边的下拉箭头 谁能帮助我如何更改微调控件的下拉箭头 我想用自己的箭头图像替换该箭头 您必须创建一
  • Assembly.GetTypes() 抛出异常

    装配有什么作用GetTypes 做幕后 假设程序集已加载到AppDomain还需要从物理DLL中读取吗 大会清单有什么作用 像这样迭代整个程序集 AppDomain CurrentDomain GetAssemblies SelectMan
  • 在 GNU Make 中创建逗号分隔列表

    我有一个带有一组布尔值的 Makefile 必须使用它们来控制外部应用程序的标志 问题是该标志必须作为逗号分隔的字符串传递 像这样的东西 非工作伪代码 WITH LIST WITHOUT LIST ifeq BOOL A y Append
  • 简单的引用计数:智能指针

    我想使用智能指针实现简单的引用计数 变量pointer表示指向存储对象的指针 reference count表示对象的副本总数 如果我们使用 NULL 初始化一个对象 reference count 1 else reference cou
  • NGINX try_files 不传递给 PHP

    我有一个非常简单的 PHP 网站 about php index php project project one php project two php projects php 以及以下 nginx 配置 仅显示相关部分 location
  • 如何调试 POST 请求上的 net::err_failed/415 Unsupported Media Type 错误?

    我们有一个 API 由我们团队的后端开发人员制作 我正在尝试在 Vue 应用程序中使用它 之前我已经成功做了一些GET通过以下方式向 API 发出请求axiosHTTP客户端 https github com axios axios 所以我
  • 为什么允许指向不完整类型的指针而不是不完整类型的变量?

    为什么以下内容是合法的 typedef struct a aType struct a int x aType b 以及以下违法行为 void main typedef struct a aType aType someVariable s
  • 如何更改 CTabCtrl 选项卡颜色?

    你好 新年快乐 周四之前说是可以接受的 我正在尝试更改选项卡的颜色CTabCtrl班级 我正在尝试创建自己的 ReskinCTablCtrl 以便我可以在单独的类中调用它并在整个程序中轻松使用它 目前我可以更改背景颜色CTabCtrl但我无
  • MATLAB 库与现有库冲突 - CMake 崩溃

    我正在 Ubuntu 16 04 64 位机器上处理 C 代码 作为代码的一部分 我必须调用 Matlab 我使用 libmat 和 libmx 库来实现 当向 CMake 提供这些库的路径时 我收到 CMake 的警告 指出现有库可能会发
  • 如何正确pickle一个namedtuple实例

    我正在学习如何使用泡菜 我创建了一个命名元组对象 将其附加到一个列表中 并尝试腌制该列表 但是 我收到以下错误 pickle PicklingError Can t pickle
  • log4j:ERROR 转换日期时发生错误

    我在日志中发现了这个异常 log4j ERROR 转换日期时发生错误 java lang NullPointerException 在 java lang System arraycopy 本机方法 在 java lang Abstract
  • 在前端翻译我的 magento 自定义模块

    我已经做了一个 magento 自定义模块 我想为其进行翻译 我怎样才能做到这一点 而不创建另一个翻译模块 多谢 您可以使用内置的翻译方法并在模板中定义所有字符串 如下所示 如果您需要在类或块中使用字符串 您可以从辅助类中获取上下文 如下所
  • 连接两个表后访问所有数据并使用 linq 将它们分组

    我有两张桌子 TableA aId aValue TableB bId aId bValue 我想通过以下方式加入这两个表aId 然后从那里将它们分组bValue var result from a in db TableA join b
  • 添加一个新列并用 Oracle SQL 中另一列的一部分填充它

    我想在表中添加一个新列 并用另一列的最后 3 个字符填充它 两者都是 varchar 源列应保持不变 我想避免创建临时列 而是想了解如何在单个查询中执行此操作 谢谢 最好使用虚拟列 https oracle base com article
  • Ajax 侦听器事件 valueChange 似乎触发 onClick 而不是 onChange

    我有一个想要显示的嵌套问题列表 最初 我显示 1 级问题 然后根据用户对其父问题的回答显示子问题 所有问题都有一个单选按钮 有些问题有一个输入框 用于在用户选择 是 时显示附加信息 这是我的带有嵌套数据表的 JSF 代码 请注意 我已经取消