我正在使用jQuery为HTML中的change
每个事件注册一个事件侦听器,input
如下所示:
<h:head>
<script type="text/javascript">
//<![CDATA[
$(document).ready(function(){
$(':input').each(function() {
$(this).change(function() {
console.log('From docReady: ' + this.id);
});
});
});
function changeHandler() {
console.log("from changeHandler");
}
//]]>
</script>
</h:head>
<h:body>
<h:form id="topForm">
<p:commandButton id="myButton" value="update"
action="#{testBean.submit}"
partialSubmit="true" process=":myForm:panel"
update=":myForm:panel" />
</h:form>
<h:form id="myForm">
<p:panel id="panel">
<p:inputTextarea id="myTextarea"
value="#{testBean.val}"
onchange="changeHandler();"/>
</p:panel>
</h:form>
</h:body>
change
如果用户更改的内容,则会触发这两个事件myTextarea
。但是,在按下update按钮(部分更新)之后myTextarea
,只有changeHandler之后才触发。绑定的事件$(document).ready()
不再触发。
这是PrimeFaces相关和/或预期的行为吗?如果是,那么我如何确保触发第二个事件而无需再次运行文档就绪脚本。
至于问题的原因,ajax请求将使用ajax响应中的新HTML元素更新HTML
DOM树。这些新的HTML元素确实(显然)没有附加jQuery事件处理程序功能。但是,$(document).ready()
不会在ajax请求上重新执行。您需要手动重新执行它。
这可以通过多种方式来实现。最简单的方法是使用$(document).on(event, selector, function)
而不是$(selector).on(event, function)
。这与文档绑定,并且在匹配给定元素的元素上触发给定时functionRef
,总是调用给eventName
定selector
。因此,您无需再通过JSF方式显式重新执行该功能。
$(document).on("change", ":input", function() {
console.log("From change event on any input: " + this.id);
});
另一种方法是在ajax请求完成后自己显式重新执行该函数。当您真正有兴趣在ready
/
load
事件期间立即执行该功能时,这是唯一的方法(例如,直接应用某些插件特定的行为/外观,例如日期选择器)。首先,您需要将$(document).ready()
作业重构为可重用的函数,如下所示:
$(document).ready(function(){
applyChangeHandler();
});
function applyChangeHandler() {
$(":input").on("change", function() {
console.log("From applyChangeHandler: " + this.id);
});
}
(请注意,我删除并简化了您完全不必要的$.each()
方法)
然后,选择以下方式之一以在ajax请求完成时重新执行它:
使用oncomplete
PrimeFaces命令按钮的属性:
oncomplete="applyChangeHandler()"
使用<h:outputScript target="body">
代替$(document).ready()
,
<h:outputScript id="applyChangeHandler" target="body">
applyChangeHandler();
所以,我要做的是在一个按钮上添加一个事件监听器,当按下该按钮时,它将接受一个状态的值,并将其记录在控制台中。但即使在多次调用setState之后,记录的值也不会更新。 然后是触发它的按钮 当我单击滑块时,该值会发生变化,但当我按下带有id=“process”的按钮并与之相关联的事件侦听器时,即使在更新状态后,它也只打印20。
问题内容: 在JavaScript中,删除使用bind()添加为事件侦听器的函数的最佳方法是什么? 例 我能想到的唯一方法是跟踪添加了bind的每个侦听器。 上面的示例使用此方法: 有没有更好的方法可以做到这一点? 问题答案: 尽管@machineghost所说的是正确的,但事件的添加和删除方式相同,但等式中缺少的部分是: 调用后会创建一个新的函数引用! 因此,要添加或删除它,请将引用分配给变量:
在我的应用程序中,我有一个PF布局,在西部有一个树节点,在中部有一个内容部分,我想在其中使用ajax技术动态加载不同的页面 为了获得它,这个内容部分包含一个ui:include
我的代码使用jQuery。我有一个密码输入框,我想要得到输入的密码任何时候。 下面是我的代码: 我确信这是一个正确的代码,因为当我在浏览器的控制台中输入它时,它可以工作,但当我重新加载页面时,它就不工作了 我能做什么?
从元素中移除事件侦听器。 使用 EventTarget.removeEventListener() 从元素中删除一个事件监听器。 省略第四个参数 opts ,则默认使用 false 或者根据添加事件监听器时使用的选项来指定它。 const off = (el, evt, fn, opts = false) => el.removeEventListener(evt, fn, opts); con
我试图在更新整数值时激发事件,但失败了。下面是我使用的代码: 我是不是漏掉了什么?