Xpages按钮onclick事件在文档加载时触发的异常问题咨询
页面加载时按钮服务器端onclick代码自动执行的原因及解决方法
当复制粘贴URL到浏览器地址栏加载页面时,log.nsf中会自动添加“button 2 pressed”日志,点击按钮时该日志也会生成——这是因为按钮的onclick属性直接使用了服务器端JavaScript表达式(#{javascript:...}),这种写法属于值绑定,会在XPages组件渲染阶段就执行,而非仅在按钮被点击时触发。
你的代码中,按钮的type="submit"搭配直接绑定的服务器端onclick表达式,导致页面首次加载时组件渲染就运行了print语句;而点击按钮触发表单提交时,该代码会再次执行。
解决方法
要让代码仅在按钮点击时执行,需要使用XPages的事件处理器(xp:eventHandler)来绑定服务器端逻辑,而非直接在onclick属性中写值绑定表达式。
修改后的代码示例:
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom"> <xp:this.data> <xp:dominoDocument formName="fParent" var="document1" /> </xp:this.data> <xp:button value="Click me" id="button2" type="submit" refreshMode="complete"> <xp:eventHandler event="onclick" submit="true" refreshMode="complete"> <xp:this.action><![CDATA[#{javascript:print("button 2 pressed");}]]></xp:this.action> </xp:eventHandler> </xp:button> </xp:view>
原理说明
- XPages中,
#{javascript:...}作为组件属性值时是值绑定,会在组件初始化渲染阶段求值执行,不管事件是否触发。 xp:eventHandler是专门的事件绑定标签,它会将服务器端代码关联到指定的客户端事件(如onclick),仅当事件实际触发(比如用户点击按钮)时,才会提交请求并执行服务器端代码。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

