论坛首页 Web前端技术论坛

focus不起作用的问题。

浏览 21542 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-06-27  
一个很奇怪的问题:
对一个input对象(text)加onkeydown事件,在按下某个键时候,将该input对象append到下个obj上,然后调用focus(),结果input并没有得到焦点,在调用focus()前,加一个alert(),却可以起作用。请问是什么问题?



		     		singleInputbox.onkeydown = function(){
			     		//debug(event.keyCode);
			     		switch(event.keyCode){
			     		case 27:			//Esc
				     		singleInputbox.style.display = "none";
			     			var indexArr = singleInputbox.id.split( "_");
				     		var lastCell = tb.rows[indexArr[0]].childNodes[indexArr[1]] ;
				     		lastCell.innerHTML =  singleInputbox.value ;
			     			singleInputbox = null ;
			     			break ;
			     		case 13:
			     		case 39:			//Enter,Right
			     			var indexArr = singleInputbox.id.split( "_");
				     		var lastCell = tb.rows[indexArr[0]].childNodes[indexArr[1]] ;
				     		lastCell.innerHTML =  singleInputbox.value ;
				    		//debug(singleInputbox.id);
				     		if(indexArr[1]<tb.rows[0].cells.length -1 ){	//move to next cell 
				     			var intt = Number(indexArr[1])+1 ;
					     		var nextCell =  tb.rows[indexArr[0]].childNodes[intt] ;
					     		singleInputbox.id = inrow.rowIndex + "_" + nextCell.cellIndex;
					     		singleInputbox.value = nextCell.innerHTML ;
					     		nextCell.innerHTML=  '';
					     		singleInputbox.size = singleInputbox.value.length + 2 ;	
					     		nextCell.appendChild(singleInputbox);
					     		//alert(1);		//~~~~here~~~~~~
					     		singleInputbox.focus();
					     		
				     		}else{
					     		singleInputbox.style.display = "none";
					     		singleInputbox = null ;
				     		}
			     			break ;
			     			
			     			
			     		}
		     		}



   发表时间:2007-06-27  
一个可能的原因是:在执行一段脚本时,对dom的操作不是即时生效的。浏览器可能执行完当前脚本所有代码后才真正处理脚本中对dom的操作。因此我在处理这种情况的时候,在settimeout指定的函数中执行某个input的focus()方法
0 请登录后投票
   发表时间:2007-06-28  
nextCell.appendChild(singleInputbox);				     
window.setTimeout("document.getElementById('"+singleInputbox.id+"').focus();", 50)  ;
    
果然有效!
0 请登录后投票
   发表时间:2007-06-28  
当时焦点本在你的input里,所以你append之后,首先会被remove,焦点就消失了。那么ie要把焦点重置到某个地方的,比如它的parentNode。而你直接调用focus方法是在重置之前,就可能不起作用了。

问题的关键是ie的焦点不仅有浏览器自身逻辑焦点,而是会被映射到windows控件焦点。两者的同步是存在一定问题的,因此ie经常会出现一些奇怪的丢焦点问题。例如你开启着输入法的时候点击一个vml图像,焦点就会消失,此时你可以输入一些汉字看看发生什么奇怪的事情,呵呵。

所以hexiaodong的方法就起作用了。推而广之,许多时候碰到奇怪问题,延时可以解决问题。

不过这并不是说dom操作不是即时生效。dom操作确实都是同步的。但是因dom改变而触发的事件,以及其他一些效应(例如样式应用),很可能是异步的。
0 请登录后投票
   发表时间:2007-06-28  
是的。
IE的事件处理方式和标准很不一样。我程序写到事件处理的时候,就不能兼容Firefox了。
0 请登录后投票
   发表时间:2007-06-29  
我分别在ie和ff下使了一下,在ff下一切正常不仅有焦点而且还能把刚输入的值也打上,在ie下不仅失去了焦点而且刚输入的值也随着移动没了。
0 请登录后投票
   发表时间:2007-06-29  
因为ff用的是自己的跨平台的控件,没有用windows控件,所以不存在html逻辑控件与win控件的同步问题。
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics