问答详情
源自:10-1 编程挑战

关于DOM编程艺术里的moveElement加单引号的问题

function positionMessage(){
	var elem=document.getElementById("message");
	elem.style.position="absolute";
	elem.style.top="100px";
	elem.style.left="50px";
	moveElement("message",200,100,10);
	// movement=setTimeout("moveMessage()",5000);//movement在这里是全局变量,因此可以在函数以外的地方被取消
}
addLoadEvent(positionMessage);

function moveElement(elemID,final_x,final_y,interval){
	//elemID传入为 "message"
	//传入时已经带有冒号,因此不能再传入冒号,否则无法获取元素ID的值
	var elem=document.getElementById(elemID);
	
	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('" + elemID + "'," + final_x + "," + final_y + "," + interval + ")";
	movement=setTimeout(repeat,interval);//递归
}

我想问的是  为什么在第一次调用moveElement时参数elemID不需要带引号,而通过递归再次调用moveElement时elemID要加上引号了(即repeat中的单引号)。

我从网上已经查了,基本已经明白了加引号的目的是moveElement中的setTimeout的第一个参数必须是字符串。

但是我觉得有一个冲突是:

第一次调用moveElement时,传入的实参时带引号的message,即"message".所以在var elem=document.getElementById(elemID);这里,elemID不用加引号。之前代码一直不对就是这里加了引号导致效果显示不出来。

那既然传入的实参已经加了引号,那为什么再次调用moveElement时却要给elemID加一个单引号呢


提问者:qq_兜里有米_04383258 2017-07-03 23:30

个回答

  • 油炸小香瓜3192649
    2017-07-07 17:29:43

    第一次传入的实参是字符串,即 "message", 再次调用 var repeat="moveElement('" + elemID + "'," + final_x + "," + final_y + "," + interval + ")"; 里面 elemID 是一个对象,添加加引号,才会变为字符串