zoukankan      html  css  js  c++  java
  • settimeout 传递参数

    参见:http://blog.csdn.net/yousuf007/article/details/6185224


    window.settimeout()方法要调用带参数的函数有两种方法:

    1.

    function init(){
        var url = "<%=basePath%>fetchwater.do?method=searchRealWater&xzqh=" + "<%=xzqh%>" + "&rand="+Math.random();
        //alert(url);
        window.setTimeout(function(){searchJDWater(url);},100);
    }

    2.

    function init(){
        var url = "<%=basePath%>fetchwater.do?method=searchRealWater&xzqh=" + "<%=xzqh%>" + "&rand="+Math.random();
        //alert(url);
        window.setTimeout(“searchJDWater(”+url+“)”,100);
    }

    注意:带参数方法使用setTimeout要注意,setTimeout("函数名("+参数+")",毫秒数),这里的参数只能是字符串形式的,而不能传递一个对象

    ---------------------------

    以下的方法是错误的,而且浏览器状态栏会提示参数无效:

    function init(){
        var url = "<%=basePath%>fetchwater.do?method=searchRealWater&xzqh=" + "<%=xzqh%>" + "&rand="+Math.random();
        //alert(url);
        window.setTimeout(searchJDWater(url),100);
    }

    --------------------------------------------------------------

    settimeout()函数扩展:

    网上很多朋友也在问此类问题,我在此说明下,以下我举几个个简单的例子:
    网上查找下“带参数 setTimeout”,很多朋友写了很多方法来实现使用setTimeout带对象的方法循环,例如:

    <script language="javascript">
      var __sto = setTimeout;
      window.setTimeout = function(callback,timeout,param){
      var args = Array.prototype.slice.call(arguments,2);
      var _cb = function(){
      callback.apply(null,args);
      }
      __sto(_cb,timeout);
      }
      //测试代码
      function aaaa(a){
      alert(a);
      }
      function aaaaa(a,b,c){
      alert(a + b + c);
      }
      var a = new Object();
      window.setTimeout(aaaa,1000,a);
      window.setTimeout(aaaaa,2000,a,6,7);
    </script>
      此例中,setTimeout用法,setTimeout(回调函数,时间,参数1,...,参数n)。
      又例如:
      2:
    <script type="text/javascript">
      var _st = window.setTimeout;
      window.setTimeout = function(fRef, mDelay) {
      if(typeof fRef == 'function'){
      var argu = Array.prototype.slice.call(arguments,2);
      var f = (function(){ fRef.apply(null, argu); });
      return _st(f, mDelay);
      }
      return _st(fRef,mDelay);
      }
      function test(x){
      alert(x);
      }
      window.setTimeout(test,1000,'fason');
    </script> 
      此例中,重载了一下window.setTimeout,用apply去回调前面的function。
      例1:
    <script language="javascript">
      function test(obj)
      {
      alert(obj);
      setTimeout("test("+ obj +")",1000);
      }
    </script>
    <input id="testButton" type="button" onclick="test(1)">
      当鼠标按下此按钮时调用test(),将"1"传递进去,屏幕上每隔1000毫秒(1秒)弹出一次对话框,显示1,没问题。
      例2:
    <script language="javascript">
      function test(obj)
      {
      alert(obj);
      setTimeout("test("+ obj +")",1000);
      }
    </script>
    <input id="btnTest" type="button" onclick="test(this)">
      这里的this可以当做document.getElementById("btnTest")来理解,当鼠标按下此按钮时向test函数传递的是一个对象,屏幕显示[object],
      1000毫秒之后不再显示第二次。问题来了,浏览器左下报脚本错误,详细信息里显示object未定义。
      例3: 
    <script language="javascript">
      function test(obj)
      {
      alert(obj);
      setTimeout("test()",1000);
      }
    </script>
    <input id="testButton" type="button" onclick="test(this)">
      setTimeout里的test()没带参数,第一次显示[object],1000毫秒之后显示undefined,变量尚未赋值,也就是说用此方式可以实现带参数的方
      法循环,但是参数被销毁。
      其实这很简单就可以实现,不必写那么长的代码来实现。
      例4: 
    <script language="javascript">
      function test(obj)
      {
      alert(obj);
      setTimeout("test('"+ obj +"')",1000);
      }
    </script>
    <input id="testButton" type="button" onclick="test(this)">
      注意,setTimeout里的test中的参数obj前后的引号,在双引号内有一对单引号,这样:setTimeout("test(单引号双引号+obj+双引号单引
      号)"),行了吧~每隔1000毫秒屏幕显示一次[object],传递对象成功。
      ———————————————————————————————————————
      疑义:第4条 最终传走的是“对象”的字符串“object” 而不是初始的对象obj。只是obj的类型而已。并没有达到传递对象的作用。
      可以测试一下代码: 弹出传来对象的id 
    <body>
      <div id="sssss"></div>
    </body>
    <script language="javascript">
      obj=document.getElementById('sssss');
      function test(obj)
      {
      alert(obj.id);
      setTimeout("test('"+ obj +"')",1000);
      }
      test(obj)
    </script>


  • 相关阅读:
    牛客练习赛51 D题
    Educational Codeforces Round 72 (Rated for Div. 2) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) C题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises) A题
    Educational Codeforces Round 72 (Rated for Div. 2) B题
    Educational Codeforces Round 72 (Rated for Div. 2) A题
    《DSP using MATLAB》Problem 7.2
    《DSP using MATLAB》Problem 7.1
    《DSP using MATLAB》Problem 6.24
  • 原文地址:https://www.cnblogs.com/hdchangchang/p/3965380.html
Copyright © 2011-2022 走看看