我有一个非常旧的应用程序要维护,它的背后是Struts和常规的Java(没有Spring的东西)。 当我引入一个新页面时,我注意到由Java脚本运行的动作执行不正确,是指以下脚本:
<script language="javascript">
function addButtonClick(button) {
var $suaName = $(button).closest("tr").find(".suaName").text();
var $suaMobileNo = $(button).closest("tr").find(".suaMobileNo").text();
$.post('viewSmsAccessCode!add.action', {name: $suaName, mobileNo: $suaMobileNo});
window.location.href=createSmsAccessCode.action;
}
</script>
首先执行最后一行(重定向到另一个操作),然后执行“ viewSmsAccessCode!add.action”。
通过这种方式,我的页面失去了同步,新页面始终显示以前选择的记录。上面的脚本是通过单击按钮执行的(每行在DataTable中都有其按钮。
<button class="formButton" onclick="addButtonClick(this)">Add</button>
即使我将最后一行移到一个单独的脚本中并这样称呼它们,也会发生这种情况:
<button class="formButton" onclick="addButtonClick(this);redirect('createSmsAccessCode.action')">Add</button>
Actions扩展了ActionSupport类并实现了一个或多个此接口:SessionAware,ServletRequestAware,Preparable
我真的不明白,那怎么可能?什么可能导致这种行为?
或者我如何以同步方式将我的javascript检索的参数传递给新操作?
答案 0 :(得分:-1)
因为实际上没有答案,所以我决定自己回答,以防其他人遇到类似的问题。
由于其异步特性,对此类事情使用javascript或JQuery并不是一个好主意。更好的办法是坚持高举行动,并采取行动。最初,我决定使用javascript,因为我不知道如何确定要单击哪个按钮(表行)。但是根本没有必要。与其呈现整个表格内部的表格,不如为每一行生成单独的表格,这样就不再需要查找被单击的行,就像这样:
<tbody>
<s:iterator value="accessList" status="status" var="row">
<tr>
<s:form action="viewSmsAccessCode">
<td class="suaName"><s:property value="suaName"/><s:hidden name="suaName" value="%{suaName}"/></td>
<td class="suaMobileNo"><s:property value="suaMobileNo"/><s:hidden name="suaMobileNo" value="%{suaMobileNo}"/></td>
<td><s:property value="suaActionList"/></td>
<td style="width: fit-content">
<span>
<s:submit action="createSmsAccessCode" class="formButton" value="Add"/>
<s:submit action="deleteSmsAccessCode" class="formButton" value="Delete"/>
</span>
</td>
</s:form>
</tr>
</s:iterator>
</tbody>
现在获取详细信息页面的参数不需要任何进一步的步骤,父操作只需要声明两个变量,就不需要使用任何JavaScript。
这就是我一直在问的“替代方式”。