我有一个选择下拉列表,触发一个函数
<form action="visualise.jsp" name="myform" id="myform" method="get">
<select name="assettypeid" id="assettypeid" onchange="typechanged();">
<sql:query var="queryresults" dataSource="jdbc/database">
SELECT id, name FROM assettype order by name
</sql:query>
<option value="1">-- All Asset Types--</option>
<c:forEach var="row" items="${queryresults.rows}">
<option value="<c:out value="${row.id}"/>"
<c:if test="${row.id == param.assettypeid}">
<c:out value="selected"/>
</c:if>
><c:out value="${row.name}" />
</option>
</c:forEach>
</select>
</form>
function typechanged()
{
// Clear the timers to allow the submit to complete
var noofTimeOuts = setTimeout('');
for (var i = 0 ; i < noofTimeOuts ; i++) clearTimeout(i);
typechosen = document.getElementById("assettypeid").value;
alert(typechosen);
myform.submit();
// Delay to prevent resend messages from the browser
setTimeout(window.location.reload(), 1000);
}
警告始终触发,但提交不会偶尔发送assettypeid,无论我是使用帖子还是获取或在表单中输入任何操作。
我甚至允许提交的延迟发生在&#39;并停止在其他功能上运行的刷新计时器,但这没有任何区别。
我错过了什么?
此致 拉尔夫
答案 0 :(得分:0)
您的代码有点令人困惑。 visualise.jsp
做了什么?是不是返回页面的HTML?
如果是,您只需将代码更改为:
function typechanged() {
document.getElementById('myform').submit();
}
设置/ clearTimeout的代码在几个方面是错误的:
// This will call window.location.reload IMMEDIATELY
anyFunction(window.location.reload(), ...more arguments)
您需要在代码周围包含function() { ... }
:
setTimeout(function() { window.location.reload() }, 1000);
如果用户再次更改<select>
,我认为您还想取消挂起的重新加载?如果是这样,您需要保存setTimeout
的返回值并在clearTimeout
中使用...尝试这样的事情:
function typechanged() {
if (typechanged.timeout) {
// Clear the timer to allow the submit to complete
clearTimeout(typechanged.timeout);
typechanged.timeout = null;
}
var typechosen = document.getElementById('assettypeid').value;
alert(typechosen);
myform.submit();
// Delay to prevent resend messages from the browser
typechanged.timeout = setTimeout(function() {
window.location.reload();
}, 1000);
}