2010-06-22 118 views
3

我在JavaScript中擁有以下函數if語句的每個部分都正確執行,除了將焦點返回給調用函數的元素。它在IE或Fire Fox中不起作用,並且瀏覽器都不給我一個錯誤。它看起來對我來說是正確的... 爲什麼它不工作?JavaScript不會將焦點傳遞給元素

function check(x){ 

    //doing some stuff 

    if (uc_check == false){ 
      window.alert('Houston, we have a problem.'); 
      document.getElementById(x).value = ''; 
      document.getElementById(x).focus(); //this line is not working 
    } 
} 

P.S.我從一個表單輸入調用這個函數是這樣的:

onchange="check(this.id)" 

回答

7

這裏的問題是,當onChange函數完成時,它將焦點設置到下一個元素。因此,您在該函數中設置的任何焦點只會在onChange結束後消失。

你可以通過很多方式解決這個問題。最簡單的可能是使用超時。

你的焦點行更改爲以下:

var el = document.getElementById(x); 
window.setTimeout(function(){el.focus();}, 100); 
+0

我剛剛準備回帖,並說我認爲它正在做你說的那些事情(儘管我不知道爲什麼),當我閱讀你的文章。這很好,但你能解釋一下'function {el.focus();}'在做什麼?我想了解爲什麼這是行得通的。 – ubiquibacon 2010-06-22 06:00:14

+0

@typoknig - 它只是在100毫秒後調用focus()函數。 – nickf 2010-06-22 06:09:20

+0

事實上,正如nickf指出的那樣,它只是延遲了100毫秒的焦點。這會讓您的onChange功能完成時間(以及隨後的焦點更改)。 – desau 2010-06-22 06:11:46

2

你已經擁有的元素(this)的引用,因此你不需要通過圍繞ID:

<input onchange="check(this);"> 

而且JS:

function check(el) { 
    if (uc_check == false) { 
     el.value = ''; 
     el.focus(); 
    } 
} 
+0

謝謝,你說得對'(本)',但我是一個JS noobie,我只是做它是如何www.w3schools.com說去做吧。你的方式有助於清理代碼,但沒有解決我的問題。不過,謝謝! – ubiquibacon 2010-06-22 06:03:27