在 JavaScript 中设置超时

IT技术 javascript
2021-01-31 10:21:46

Firefox 总是加载动态图片,但 IE 只显示图片,没有任何动态操作。我需要做什么改变?

JavaScript 代码来自 IE 查看源代码:

<script type=”text/javascript”
    <!--/*--><![CDATA[/*><!--*/ 
    if (document.getElementById("safeForm1d3").submitted.value == "false") { 
      document.getElementById("safeForm1d3").submitted.value = "true"; 
      setTimeout('document.getElementById("safeForm1d3").submit()', 100); 
    }else{ 
    document.getElementById("toHide").style.display="none"; 
    }/*-->]]>*/
</script>

我使用的是 Wicket 框架,所以真正的 Java 代码是:

 static private class SafeSubmitBehaviour extends AbstractBehavior{
    public void onRendered( Component component ) {
      super.onRendered( component );      
      StringBuffer buffer = new StringBuffer(200);
      buffer.append("<script type=\"text/javascript\" ><!--/*--><![CDATA[/*><!--*/\n");
      buffer.append("if (document.getElementById(\"").append(component.getMarkupId()).append("\").submitted.value == \"false\") {\n");
      buffer.append("document.getElementById(\"").append(component.getMarkupId()).append("\").submitted.value = \"true\";\n");
      buffer.append("setTimeout('document.getElementById(\"").append(component.getMarkupId()).append("\").submit()', 100);\n}else{\n");
      buffer.append("document.getElementById(\"toHide\").style.display=\"none\";\n}/*-->]]>*/</script>");      
      component.getResponse().write(buffer);
    }  
  } 

加载我的动态图像的 html 页面是:

<div id="toHide" class="pb-text-align-center">
        <img style="display: inline" src="img/load.gif" />
            <form wicket:id="safeForm" class="clearfix">
            <input type="hidden" wicket:id="submitted" value="false" />
        </form>
</div>
6个回答

因为setTimeout()要求您的函数作为字符串或匿名函数传递:

setTimeout(function() { document.getElementById("safeFormec").submit(); }, 100);
@Anon 不应该是必需的,但会编辑它以获得正确的样式:)
2021-03-22 10:21:46
我不确定,但;submit().
2021-04-04 10:21:46

从你的行动中拿走引号:

setTimeout(function() {
    document.getElementById("safeForm4d").submit();
}, 3000);

您是否尝试从这一行的末尾删除函数调用括号?

document.getElementById("safeForm9c").submit()

即改为这样做:

setTimeout(document.getElementById("safeForm9c").submit, 100)

您告诉 IEsubmit()在 100 毫秒内调用结果,而不是调用提交。

@大卫:嗯!我没有意识到这一点。(仍然有兴趣查看 OP 是否从此代码中收到不同的错误消息。)
2021-03-17 10:21:46
@user755323:对不起,我的错,我错过了一个括号——我的意思是 setTimeout(document.getElementById("safeForm9c").submit, 100)
2021-03-28 10:21:46
@user755323:你能澄清一下你想让我澄清的吗?:) 我的建议是使用setTimeoutdocument.getElementById("safeForm9c").submit, 100)而不是setTimeoutdocument.getElementById("safeForm9c").submit(), 100). 我不确定这是否真的导致了您遇到的问题,但看起来可能是这样。
2021-04-04 10:21:46
我很确定,如果您将提交方法从表单的上下文中分离出来(就像您将它传递给另一个函数一样),那么它在执行时将无法工作,因为它取决于它将成为什么样this的表单操作(这就是工作的原因document.createElement('form').submit.call(form_with_a_control_named_submit)
2021-04-10 10:21:46

尝试将它们包装在一个函数中:

setTimeout(function(){ document.getElementById("safeForm4d").submit(); }, 100);
+1:如果您需要提供参数值,setTimeout 应该只引用一个函数或一个带有函数调用的字符串。
2021-03-15 10:21:46
当我执行此动画或动态页面加载时,即加载请稍候在 IE 中没有发生。
2021-03-28 10:21:46

尝试这样的事情

setTimeout(function(){document.getElementById("safeForm9c").submit();}, 100);

在过去, setTimeout 完整函数采用字符串格式,但现在我们以这种方式使用它。这种方式也可以在超时完成时做更多的事情。

“一般”?不,现在传递字符串并不正常。传递函数是正常的。使用字符串意味着它会被评估,这很慢,难以调试,并且会破坏范围。
2021-03-25 10:21:46
@Joose:90% 的东西都是垃圾,包括“文档”。
2021-03-26 10:21:46
确实如此,但是在您找到的所有文档中,您仍然会看到使用字符串的方式。这些天当然不正常。
2021-03-27 10:21:46
您找到的几乎所有文档:p
2021-04-04 10:21:46
不是在我总是首先查看的文档中,它确实提到了使用字符串,但它们排在第二位。
2021-04-09 10:21:46