使用jQuery生成PrimeFaces按钮,但点击事件会一遍又一遍地调用

这是我试图完成的。 我有一个带有两个JSF inputText和一个按钮的隐藏表单。 无论我在div容器内部单击,我都会尝试计算相对于容器的xy坐标。 然后使用jQuery将xy的值设置为两个JSF inputText的值并提交表单。 JSF页面后面的托管bean将尝试捕获x和y提交的值。

以下是我的代码。 请让我知道我做错了什么,因为托管bean myBean方法createNewInput没有被正确调用。

EDIT2

  
Click an Element

jQuery("#noteCol").click(function(e){ var offset = jQuery(this).offset(); e.stopPropagation(); jQuery("#result").text(this.id + "Offset: (" + offset.left + ", " + offset.top + "), " + "Relative Coordinate: (" + (e.pageX - offset.left) + ", " + (e.pageY - offset.top) + ")"); jQuery("#coordX").val(e.pageX - offset.left); jQuery("#coordY").val(e.pageY - offset.top); jQuery("#button").click(); });

在服务器端,当调用托管bean myBean的方法createNewInput()时,我打印出这对坐标。 很高兴,我看到两个坐标的正确结果。 但是, 它会一遍又一遍地打印这对坐标,但在第一次正确打印后,这对坐标的值为NaN 但是,我解决这个问题?

我不确定你为什么得到NaN 。 你在哪里看到它? 另外,如果你计算e.pageX - offset.left而不是e.pageX - offset.left ,那对我来说更有意义。 此外,在jQuery中设置input元素的值应该由jQuery.val()函数完成。

此外,JSF将使用表单ID预先生成生成的HTML输入元素ID,这将导致jQuery('#coordX')返回任何内容。 jQuery采用HTML元素ID,而不是JSF组件ID。 您希望将prependId="false"添加到以禁用它。 但是你应该确保相同的输入组件在输出中不会出现一次,并且输入组件上没有任何其他父UINamingContainer组件,这些组件也会在它们之前添加ID,为了validation这一点,你需要检查是否当你试图通过jQuery选择时,生成的HTML 确实有id="coordX"

最后, jQuery.submit()仅适用于HTML

元素,而不适用于按钮。 为此你宁愿使用jQuery.click()代替。

所以,总结一下这应该在理论上适合你:

 

这是我的问题的解决方案。 问题是点击事件搞砸了。 所以为了阻止这一点

 jQuery("#noteCol").click(function(e){ var offset = jQuery(this).offset(); e.stopPropagation(); jQuery("#result").text(this.id + "Offset: (" + offset.left + ", " + offset.top + "), " + "Relative Coordinate: (" + (e.pageX - offset.left) + ", " + (e.pageY - offset.top) + ")"); jQuery("#coordX").val(e.pageX - offset.left); jQuery("#coordY").val(e.pageY - offset.top); jQuery("#button").click(); }); jQuery("#button").click(function(e){ e.stopPropagation(); });