在JavaScript中设置超时

时间:2011-04-13 15:23:21

标签: javascript

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

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

<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>

23 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

尝试这样的事情

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

在过去,setTimeout完成函数是字符串格式,但是现在我们以这种方式使用它。此外,这种方式可以在超时完成时执行更多操作。

答案 3 :(得分:3)

从你的行动中删除引号:

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

答案 4 :(得分:3)

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

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

即。这样做:

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

你告诉IE在100毫秒的时间内调用submit()的结果,而不是调用提交。

答案 5 :(得分:1)

解决了我的问题。可能对其他人有用:

  

答案:

HTML源代码:

<SCRIPT type="text/javascript"> 
    var $ = jQuery.noConflict(); 
    document.getElementById('toHide').style.display ="";
    $('#toHide').doTimeout(1000, function() { 
        $('#toHide').find('#safeForm34').submit(); 
        document.getElementById('myAnimatedImage').src = "../../img/load.gif"; 
        });
</SCRIPT>

HTML:

  <div id="toHide" class="pb-text-align-center">
    <img src="img/load.gif" id='myAnimatedImage' style="margin-left: auto; margin-right: auto;"/>
    <form wicket:id="safeForm" class="clearfix" />
</div>

答案 6 :(得分:1)

将其包含在头部

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>

并且

 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\" >\n");
      buffer.append("var input = $(\"input[name='submitted']\");\n");
      buffer.append("if (input.val() == \"false\") {\n"); 
      buffer.append("  input.val(\"true\");\n"); 
      buffer.append("  setTimeout(function(){ $(\"#").append(component.getMarkupId()).append("\").submit()}, 100);\n"); 
      buffer.append("}\n");
      buffer.append("else {\n $(\"#toHide\").hide();\n}"); 
      component.getResponse().write(buffer);
    }  
  } 

应该呈现

var input = $("input[name='submitted']");
if (input.val() == "false") { 
  input.val("true"); 
  setTimeout(function(){ $("#safeForm1d3").submit()}, 100); 
}else{ 
  $("#toHide").hide(); 
}

你会在哪里做$("#toHide").show();

答案 7 :(得分:1)

function setsubmit()
{
   document.getElementById("safeFormec").submit();
}

setTimeout('setsubmit()',100);

答案 8 :(得分:1)

你能尝试做像

这样的事吗?
setTimeout('document.getElementById("safeForm9c").submit()', 100);

可能setTimeout接受你想要作为字符串调用的东西,这样它就可以在超时后执行eval并运行脚本中的字符串。

答案 9 :(得分:1)

更改此

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

为...

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

答案 10 :(得分:0)

格式化你的初始帖子后,我想也许我找到了问题的一些来源。

  • 超时中的函数是一个字符串。
  • 您应该尝试提交表单,而不是实际按钮。

试试这个:

if (!document.getElementById("safeForm4d").submitted.value) {
    document.getElementById("safeForm4d").submitted.value = "true";
    setTimeout(function() {
        document.forms[0].submit(); // Alt: document.forms['MyFormName'].submit()
    }, 3000);
} else {
    document.getElementById("toHide").style.display="none";
}

答案 11 :(得分:0)

最后解决了我的问题,可能对其他人有用:

  

答案:

HTML源代码:

<SCRIPT type="text/javascript"> 
    var $ = jQuery.noConflict(); 
    document.getElementById('toHide').style.display ="";
    $('#toHide').doTimeout(1000, function() { 
        $('#toHide').find('#safeForm34').submit(); 
        document.getElementById('myAnimatedImage').src = "../../img/load.gif"; 
        });
</SCRIPT>

HTML:

  <div id="toHide" class="pb-text-align-center">
    <img src="img/load.gif" id='myAnimatedImage' style="margin-left: auto; margin-right: auto;"/>
    <form wicket:id="safeForm" class="clearfix" />
</div>

答案 12 :(得分:0)

试试这个:

<script type="text/javascript">
    if (document.getElementById("safeForm4d").submitted.value == "false") {
        document.getElementById("safeForm4d").submitted.value = "true";
        setTimeout('document.getElementById("safeForm4d").submit()', 100);
    } else {
        document.getElementById("toHide").style.display="none";
    }
</script>

答案 13 :(得分:0)

你在setTimeout事件中有引号:

setTimeout('document.getElementById("safeForm4d").submit()', 100);

按如下方式更改脚本:

<script type="text/javascript">
    if (document.getElementById("safeForm4d").submitted.value == "false") {
        document.getElementById("safeForm4d").submitted.value = "true";
         if(Wicket.Browser.isIE()) {
             setTimeout(document.getElementById("safeForm4d").submit(), 100);
         } else { 
             setTimeout(document.getElementById("safeForm4d").submit(), 100);
         }
    } else {
        document.getElementById("toHide").style.display="none";
    }
</script>

答案 14 :(得分:0)

由于从一个页面更改为另一个页面,这将永远不会给您带来理想的效果 - 这将导致新页面开始加载后消息消失。这取决于许多因素,例如服务器响应的时间,用户计算机重新呈现新页面的速度。

如果你真的希望这种效果起作用,你应该使用ajax使用.serialize()发送表单数据,用应该隐藏动画的响应覆盖当前页面。


更新

要创建所需的效果,您必须使用ajax发布表单,然后将新HTML推送到DOM。

var $form = $('#formId');

$.ajax({
   url: $form.attr('action'),
   type: $form.attr('method'),
   data: $form.serialize(),
   success: function(response) {
    $('#loading').fadeOut(function() {
            // Get only text from the body of the result
        $('body').html($(response).find('body'));
    });
  }
});

这真的很酷,我觉得写得很脏。认真。您应该确保返回的响应不会转到:

  • 重新加载CSS样式,脚本等
  • 与该页面和搜索相关的任何特定标题,脚本,样式等都不会显示或更改。

您很可能只想将结果返回到查询,即提交的表单的搜索结果。在这种情况下,只需将结果包装在容器中.find('#container')而不是.find('body')

答案 15 :(得分:0)

您可以尝试:

img style="display: inline" src="img/load.gif?salt=xxxx"

xxx :表示 - 整数的随机数。

也许,浏览器会缓存图像,因此不会重新绘制。或者您必须使用循环设置GIF图像。

答案 16 :(得分:0)

问题是时间100,即1/10秒。 IE将仅使用动态操作加载图像100毫秒,即1/10秒并停止。时间增加到3000,现在工作正常。

  

的setTimeout(函数(){ '的document.getElementById( “safeForm4d”)。提交()'},   100);

FF或其他浏览器没有问题。

答案 17 :(得分:0)

setTimeout函数抛出无效参数,因为无论调用什么

document.getElementById("safeFormec").submit()

返回(可能是某些错误消息)不是setTimeout的有效参数,即它不能 被解析为函数或表达式。

.submit()的调用失败,因为没有为表单指定操作属性(<form action="somePage.php">)。

您的意图可能不是在setTimeout调用中进行提交,而是将提交函数作为值参数发送到setTimeout,以便在一段时间后执行。像这样:

setTimeout(document.getElementById("safeFormec").submit, 100);

请注意缺少的paranthesises。

答案 18 :(得分:0)

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

检查JSFIDDLE处的工作示例。

注意 ::警告可能会令人恼火。

答案 19 :(得分:0)

两件事:

  1. setTiemout()的正确用法是:

    setTimeout(function(){
        document.getElementById("safeForm4d").submit();
    }, 100);
    
  2. 您使用的检票口。 wicket:id不是DOM知道的。你必须分配一个ID,并像使用表单一样使用它。

  3. 希望有所帮助。

答案 20 :(得分:0)

此:

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

不正确。你传递给“.setTimeout()”的函数什么都不做。而不是那样,尝试:

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

不同之处在于不应该引用函数的实际内容。在那种状态下,你得到的是一个带有单个语句的函数,该语句是一个简单的字符串值表达式。它会运行,但没有效果。

答案 21 :(得分:0)

var safeForm4d = document.getElementById("safeForm4d");
if ( safeForm4d.submitted.value == "false" ){
   safeForm4d.submitted.value = "true";
   setTimeout(function(){ safeForm4d.submit(); }, 100);
}else{
   document.getElementById("toHide").style.display="none";
}

答案 22 :(得分:0)

我尝试过添加函数调用,现在图像正在加载和动态,但它永远不会进入下一页或从不清除超时。

代码:

buffer.append("setTimeout(function(){'document.getElementById(\"").append(component.getMarkupId()).append("\").submit()'}, 100);\n}else{\n");