我把有关的贴出来。全部代码在最下面
function moveElement(elementID,final_x,final_y,interval) {.....
var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
movement = setTimeout(repeat,interval);}.......
中间那条代码为什么要这么复杂。我看倒是能看懂,repeat就是一个函数字符串化,因为setTimeout第一个参数要是字符串
可为什么不这么写var repeat = "moveElement(elementID,final_x,final_y,interval) "; 我这也是个字符串。去掉引号就是原函数
function moveElement(elementID,final_x,final_y,interval) {
if (!document.getElementById) return false;
if (!document.getElementById(elementID)) return false;
var elem = document.getElementById(elementID);
var xpos = parseInt(elem.style.left);
var ypos = parseInt(elem.style.top);
if (xpos == final_x && ypos == final_y) {
return true;
}
if (xpos < final_x) {
xpos++;
}
if (xpos > final_x) {
xpos--;
}
if (ypos < final_y) {
ypos++;
}
if (ypos > final_y) {
ypos--;
}
elem.style.left = xpos + "px";
elem.style.top = ypos + "px";
var repeat = moveElement(elementID,final_x,final_y,interval);
movement = setTimeout("repeat",interval);
}
关于dom编程艺术动画部分一句代码的解释问题
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
- 斯洛文尼亚旅游 2017-03-08 13:12关注
计时器第一个参数尽量不要用字符串,而是匿名函数(需要传入参数)或者直接要执行的函数名称(对于不需要参数的),字符串是用eval执行的,存在xss漏洞并且效率低
var repeat = moveElement(elementID,final_x,final_y,interval);///你这样写也是错误的,repeat得到的是moveElement的返回值,没有reutrn那么默认就是undefined,那么下面的计时器就没意义了 movement = setTimeout(function(){ moveElement(elementID,final_x,final_y,interval);/// },interval);
setTimeout第一个参数如果是字符串,那么如果你传递的是变量,就是
var repeat = "moveElement(elementID,final_x,final_y,interval)你这种形式,那么变量必须要是window作用域下的(虽然eval执行,但是需要变量是wiindow作用域下的,这个和eval有区别,是当前作用域内的变量可以访问到),访问不到此时传入的参数,会报错demo
function aa(v) { eval('alert(v)')//1 setTimeout('aa(v)', 2000)//2s后执行aa(v)报错,v is not defined } aa(1)
var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
这样串接起来就是变为传递当前参数的值,由于elementID是字符串,必须要要变为引号括起
1)var repeat = "moveElement(elementID,final_x,final_y,interval)
var repeat = "moveElement('"+elementID+"',"+final_x+","+final_y+","+interval+")";
这2中其实都是相当于执行下面的js代码1)moveElement(elementID,final_x,final_y,interval)"
2)moveElement('elementID的值', final_x的值,final_y的值, interval的值)所以为什么第一个是传递变量,第二个需要注意字符串类,非数字布尔变量需要引号括起
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
- ¥15 电脑蓝屏logfilessrtsrttrail问题
- ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
- ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
- ¥15 Java+vue部署版本反编译
- ¥100 对反编译和ai熟悉的开发者。
- ¥15 带序列特征的多输出预测模型
- ¥15 Python 如何安装 distutils模块
- ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
- ¥15 资源泄露软件闪退怎么解决?