Struts2表单经JavaScript提交时隐藏参数duplicateurl为空的问题求助
问题排查与解决方案
我来帮你一步步拆解并解决这两个问题——alert不弹出和duplicateurl为空的情况,这俩其实是关联在一起的:
1. 为什么alert没弹出?
首先你的提交按钮是type="Submit",它会触发表单的原生提交事件,这大概率导致JS函数还没执行完,页面就已经开始跳转了,所以alert根本没机会弹出来。另外还有两个关键坑:
document.URLUnencoded不是标准浏览器属性!标准获取当前页面URL应该用document.URL或者window.location.href,这个非标准属性可能直接导致JS报错,中断后续所有代码(包括alert和赋值操作)。- 如果你的JS代码放在表单之前,浏览器解析到按钮的
onclick="submitLogon()"时,函数还没定义,会直接报错,导致函数完全不执行。
2. 一站式解决两个问题
按照下面的步骤修改,就能搞定:
步骤1:阻止按钮的默认提交行为
把按钮的type改成button(避免原生提交抢先执行),确保JS函数能完整跑完再手动提交表单:
<s:form action="SubmitLogon" onfocus="username" id="logonForm"> <s:hidden name="lastsession" value="N"/> <s:hidden name="duplicateurl" /> <table> <tr> <td colspan="2" align="right"> <button type="button" value="Login" style="WIDTH: 98px; HEIGHT: 39px; background:Transparent; border:None" onclick="submitLogon()"> <img src='/images/btn_login.jpg' /> </button> </td> </tr> </table> </s:form>
步骤2:修正JS代码的错误点
替换非标准的URL属性,同时用更稳妥的方式获取表单元素:
<script type="text/javascript"> function submitLogon(){ // 用标准属性获取当前URL var currentUrl = window.location.href; // 通过ID获取表单,避免name属性不匹配的问题 var form = document.getElementById("logonForm"); // 给隐藏域赋值 form.duplicateurl.value = currentUrl; // 现在alert应该能正常弹出了 alert("dupURL------------"+currentUrl); // 手动提交表单 form.submit(); } </script>
步骤3:确保JS代码的位置正确
把你的<script>标签放在表单之后,或者用DOMContentLoaded事件包裹,确保DOM加载完成后再定义函数:
<script type="text/javascript"> document.addEventListener('DOMContentLoaded', function() { window.submitLogon = function(){ var currentUrl = window.location.href; var form = document.getElementById("logonForm"); form.duplicateurl.value = currentUrl; alert("dupURL------------"+currentUrl); form.submit(); }; }); </script>
额外验证小技巧
- 按下F12打开浏览器开发者工具,切换到「Console」标签,点击提交按钮看看有没有JS报错,这能快速定位问题根源。
- 查看页面生成的HTML源码,确认
<s:hidden name="duplicateurl" />的name属性确实是duplicateurl,和Action类里的属性名完全一致。
按上面的方法修改后,alert应该能正常弹出,duplicateurl的值也能正确传递到你的Struts Action里了。
内容的提问来源于stack exchange,提问作者learning knowledge
相关产品推荐
相关产品推荐

