settimeout的参数不起作用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了settimeout的参数不起作用相关的知识,希望对你有一定的参考价值。
response.write"……………………………………"
response.write"<script>setTimeout(location.href='index.asp',30000000);</script>"
我虽然把后面的参数(毫秒)调到了3000万,但是还是一秒不到的时间就转向index.asp了,这是怎么回事??
<!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(() => 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
似乎人们没有意识到setTimeout
和setInterval
实际上接受可选的无限参数。
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 不起作用
JavaScript:在另一个 setTimeOut(嵌套 setTimeOut)中的 setTimeOut 以刺激 API 响应不起作用