提交(发布或获取)不可靠?

时间:2018-04-10 10:48:18

标签: javascript jsp

我有一个选择下拉列表,触发一个函数

<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;并停止在其他功能上运行的刷新计时器,但这没有任何区别。

我错过了什么?

此致 拉尔夫

1 个答案:

答案 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);
}