settimeout的参数不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了settimeout的参数不起作用相关的知识,希望对你有一定的参考价值。

response.write"……………………………………"
response.write"<script>setTimeout(location.href='index.asp',30000000);</script>"

我虽然把后面的参数(毫秒)调到了3000万,但是还是一秒不到的时间就转向index.asp了,这是怎么回事??

因为seTimeout第一个参数要求一个函数,而不是一个字符串,所以要写入下面程序:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script type="text/javascript">
var cir_str="沙国之春归宿";
var i_cir_str_length=cir_str.length;
var str_in_html="";
function circle_text()

for(var i=0;i<i_cir_str_length;i++)
str_in_html=str_in_html+"<div id=\'cir_text_div"+i+"\'style=\'width:3;font-family: Courier

New;font-weight:bold;position:absolute;top:40;left:50;z-index:0\'>"+cir_str.charAt(i)

+"</div>";

document.write(str_in_html);
text_round();


var alpha=5;
var i_alpha=0.05;
var Timer;
function text_round()
alert(str_in_html);
alpha=alpha-i_alpha;alert(alpha);
for(var i=0;i<i_cir_str_length;i++)
var alpha1=alpha+0.5*i;
var v_cos=Math.cos(alpha1);
var div_id="cir_text_div"+i;
var obj=document.getElementById(div_id);
obj.style.left=100+100*Math.sin(alpha1)+50;
obj.style.zIndex=20*v_cos;
obj.style.fontSize=40+25*v_cos;
obj.style.color="rgb("+ (27+v_cos*80+50) + ","+ (127+v_cos*80+50) + ",0)";

if(true)alert("ssss");

Timer=setTimeout(text_round(),1000);//移到外边来

</script>
</head>

<body onload="circle_text()">
</body>
</html>

还有,别用document.write吧,你可以改成下面这样:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>无标题文档</title>
<script type="text/javascript">
var cir_str="沙国之春归宿";
var i_cir_str_length=cir_str.length;
var str_in_html="";
function circle_text()
for(var i=0;i<i_cir_str_length;i++)
str_in_html=str_in_html+"<div id=\'cir_text_div"+i+"\'style=\'width:3;font-family: Courier New;font-weight:bold;position:absolute;top:40;left:50;z-index:0\'>"+cir_str.charAt(i)+"</div>";

document.getElementById("divTest").innerHTML = str_in_html;
text_round();


var alpha=5;
var i_alpha=0.05;
var Timer;
function text_round()
alpha=alpha-i_alpha;
for(var i=0;i<i_cir_str_length;i++)
var alpha1=alpha+0.5*i;
var v_cos=Math.cos(alpha1);
var div_id="cir_text_div"+i;
var obj=document.getElementById(div_id);
obj.style.left=100+100*Math.sin(alpha1)+50;
obj.style.zIndex=20*v_cos;
obj.style.fontSize=40+25*v_cos;
obj.style.color="rgb("+ (27+v_cos*80+50) + ","+ (127+v_cos*80+50) + ",0)";

setTimeout("text_round();", 1500);

</script>
</head>

<body onload="circle_text()">
<div id="divTest"></div>
</body>
</html>
参考技术A 你把location.href改为一个普通变量,看是否页面仍然跳转。

我估计你其它地方还有跳转语句,因为你上面的语句看来没有问题,不会1秒就跳的。如果你改为普通变量赋值都还跳,那就说明页面还有跳转语句。
参考技术B response.write"<script>setTimeout(""location.href='index.asp'"",30000000);</script>"

这样就可以了,一定要用引号

我的blog http://readlog.cn本回答被提问者采纳

ReactJS:setTimeout()不起作用?

【中文标题】ReactJS:setTimeout()不起作用?【英文标题】:ReactJS: setTimeout() not working? 【发布时间】:2016-07-16 04:32:40 【问题描述】:

记住这段代码:

var Component = React.createClass(

    getInitialState: function () 
        return position: 0;    
    ,

    componentDidMount: function () 
        setTimeout(this.setState(position: 1), 3000);
    ,

    render: function () 
         return (
            <div className="component">
                this.state.position
            </div>
         ); 
    

);

ReactDOM.render(
    <Component />,
    document.getElementById('main')
);

状态不应该只在 3 秒后改变吗?它正在立即改变。

我的主要目标是每 3 秒更改一次状态(使用setInterval()),但由于它不起作用,我尝试了setTimeout(),它也不起作用。这个有灯吗?谢谢!

【问题讨论】:

如果您有foo(bar()),则首先执行bar,并将其返回值传递给foo @FelixKling 似乎正确,但不合适。由于这里的foo() 正是在所需超时后执行bar。还是我完全错了,它会立即执行,并且只在所需时间后返回值? “由于这里的 foo() 正是在期望的超时后执行 bar。” 对,这就是为什么你必须传递 bar,而不是调用它并传递它的原因返回值。您是否期望 foo(bar()) 的行为会改变,这取决于 foo 正在做什么?那真的很奇怪。 【参考方案1】:

setState 由于括号而被立即调用!将其包装在一个匿名函数中,然后调用它:

setTimeout(function() 
    this.setState(position: 1)
.bind(this), 3000);

【讨论】:

【参考方案2】:

setTimeout(
    function() 
        this.setState( position: 1 );
    
    .bind(this),
    3000
);

否则,您会将setState 的结果传递给setTimeout

你也可以使用 ES6 箭头函数来避免使用 this 关键字:

setTimeout(
  () => this.setState( position: 1 ), 
  3000
);

【讨论】:

是的,这是有道理的,它正在工作。但是 function() 不是一个函数吗?那么为什么我们需要绑定它呢?我已经尝试过并且确实需要它,我只是想知道为什么。感谢您的帮助:) 我不明白你为什么说它会将结果传递给 setTimeout,这怎么能不成功?这种情况下的行为是什么? 对于那些喜欢使用 ES6 箭头函数的人:setTimeout(() =&gt; this.setState( position: 1 ), 3000) @PositiveGuy 不确定自从发布此问题以来您是否已经自行研究过,但如果您还没有: Daniel 的原始示例需要.bind(this)this 上下文限制为setState - 否则,this 将自动引用它被调用的上下文(在这种情况下,匿名function 被传递给@987654332 @)。然而,ES6 箭头函数是词法作用域 - 它们将this 限制在调用它们的上下文中。 不起作用... setTimeout(() => if (!this.props.logoIsLoading && !this.props.isLoading) console.log('我们会发生吗?') ; this.setState( ...this.state, shouldUpdate: false, itemToUpdate: null, modalIsOpen: false, modalTitle: '添加新组织' ); , 100);它在类语法糖类组织的上下文中扩展了组件 console.log 永远不会得到 console.log('我们会发生吗?');记录它之前和之后的所有内容。 @juslintek 定义不起作用。如果需要,请提出一个新问题。【参考方案3】:
setTimeout(() => 
  this.setState( position: 1 );
, 3000);

上述方法也可以工作,因为 ES6 箭头函数不会改变 this 的上下文。

【讨论】:

ES6 语法应该是 React 最佳实践的公认答案。两者都可以,但这更优雅,可以处理this【参考方案4】:

您的代码范围 (this) 将是您的 window 对象,而不是您的反应组件,这就是为什么 setTimeout(this.setState(position: 1), 3000) 会以这种方式崩溃。

那来自于 javascript 而不是 React,它是 js 闭包


所以,为了绑定你当前的 react 组件作用域,这样做:

setTimeout(function()this.setState(position: 1).bind(this), 3000);

或者如果您的浏览器支持 es6 或者您的 projs 支持将 es6 编译为 es5,也可以尝试使用箭头函数,因为箭头函数是为了解决“这个”问题:

setTimeout(()=>this.setState(position: 1), 3000);

【讨论】:

【参考方案5】:

任何时候我们创建一个超时,我们都应该在 componentWillUnmount 上清除它,如果它还没有触发的话。

      let myVar;
         const Component = React.createClass(

            getInitialState: function () 
                return position: 0;    
            ,

            componentDidMount: function () 
                 myVar = setTimeout(()=> this.setState(position: 1), 3000)
            ,

            componentWillUnmount: () => 
              clearTimeout(myVar);
             ;
            render: function () 
                 return (
                    <div className="component">
                        this.state.position
                    </div>
                 ); 
            

        );

ReactDOM.render(
    <Component />,
    document.getElementById('main')
);

【讨论】:

【参考方案6】:

有 3 种方法可以访问 'setTimeout' 函数内部的范围

首先,

const self = this
setTimeout(function() 
  self.setState(position:1)
, 3000)

二是使用ES6箭头函数,因为箭头函数本身没有作用域(this)

setTimeout(()=> 
   this.setState(position:1)
, 3000)

第三个是绑定函数内部的作用域

setTimeout(function()
   this.setState(position:1)
.bind(this), 3000)

【讨论】:

【参考方案7】:

你没有告诉谁调用了 setTimeout

这里如何调用超时而不调用其他函数。

1。您可以做到这一点,而无需制作额外的功能。

setTimeout(this.setState.bind(this, position:1), 3000);

使用 function.prototype.bind()

setTimeout 获取函数的位置并将其保存在上下文中。

2。即使编写更少的代码也可以做到这一点的另一种方法。

setTimeout(this.setState, 3000, position:1);

可能在某些时候使用相同的绑定方法

setTimeout 只取函数的位置,函数已经有了上下文?无论如何,它有效!

注意:这些适用于您在 js 中使用的任何函数。

【讨论】:

【参考方案8】:

我知道这有点旧,但重要的是要注意 React 建议在组件卸载时清除间隔:https://reactjs.org/docs/state-and-lifecycle.html

所以我想在这个讨论中添加这个答案:

  componentDidMount() 
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  
  componentWillUnmount() 
    clearInterval(this.timerID);
  

【讨论】:

【参考方案9】:

你做了语法声明错误,使用正确的 setTimeout 声明

message:() =>  
  setTimeout(() => this.setState(opened:false),3000); 
  return 'Thanks for your time, have a nice day ?! 

【讨论】:

【参考方案10】:

尝试使用设置超时的 ES6 语法。普通的 javascript setTimeout() 在 react js 中不起作用

setTimeout(
      () => this.setState( position: 100 ), 
      5000
    );

【讨论】:

【参考方案11】:

只需将函数作为引用传递,无需将其包装在匿名函数中甚至绑定它,这会创建另一个函数。

setTimeout(this.setState, 500, position: 1);

输入 setTimeout

似乎人们没有意识到setTimeoutsetInterval 实际上接受可选的无限参数

setTimeout(callback, timeout?, param1?, param2?, ...)

原因是为了让回调的调用更简单,所以用这个代替

setTimeout(
  function()
    this.doSomething(true, "string", someVariable)
  .bind(this),
  500
)

你可以这样写

setTimeout(this.doSomething, 500, true, "string", someVariable)

是不是很漂亮很优雅? ?


错误?

React 立即调用 setTimeout 没有错误,所以如果你对此感到困惑,请考虑一下。

function doSomething() /* */

const a = doSomething() // immediately invokes and assigns a result
const b = doSomething   // stores a reference for later call

// call later
const x = a() // error
const y = b() // invokes doSomething and assigns a result

在您使用setState 的情况下,这基本上是一回事。 当您注册 setTimeout 回调时,您会错误地立即调用它,而应该在其中传递对它的引用。

function doSomething() /* */

// wrong
setTimeout(doSomething(), 500) // This is basically the same as writing the `a` from above
setTimeout(a, 500)             // like this. See the problem? a() cannot be called later.

要修复它,您有三个选择。

    传递参考
setTimeout(this.doSomething, 500)
    包装一个匿名箭头函数,它对this是透明的, 这意味着它会捕获外部(父级)this请注意,每次调用 this 时,都会将您的函数包装在另一个函数中
setTimeout(() => this.doSomething(), 500)
    包装在标准匿名函数中,但由于它带有自己的this,因此您必须将其绑定到父级的this请注意,这会将您的函数包装在另一个函数中并且然后绑定它,每次都会创建第三个函数
setTimeout(function()this.doSomething().bind(this), 500)

【讨论】:

【参考方案12】:

传递字符串文字 将字符串而不是函数传递给 setTimeout() 与使用 eval() 存在相同的问题。

componentDidMount: function () 
 // Do this instead
 setTimeout(function() 
 console.log('Hello World!');
 , 500);

使用反应钩子

useEffect(() => 
  const timer = setTimeout(() => 
    console.log('This will run after 1 second!')
  , 1000);
  return () => clearTimeout(timer);
, []);

know more

【讨论】:

以上是关于settimeout的参数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

SetTimeout 在 Mongoose 模式后中间件中不起作用

没有 setTimeOut,MatSort 和 MatPaginator 不起作用

setTimeout 在 forEach 中不起作用

JavaScript:在另一个 setTimeOut(嵌套 setTimeOut)中的 setTimeOut 以刺激 API 响应不起作用

JavaScript 调用`setTimeout` 在 Oracle Apex 中不起作用

Jquery .removeClass 在 setTimeout 内不起作用