2011-09-29 84 views
1

我有一個html表單,它使用jQuery的焦點和模糊來清除和恢復一些預設的字段文本。然而,表單是在一個模式對話框中,可以隱藏和顯示使用jQuery的hide()和show()。然而,當表單是隱藏的,它拋出一個JavaScript錯誤:JQuery - 元素不可聚焦的錯誤/如何強制模糊?

an invalid form control with name = 'email' is not focusable 

我假設這是因爲形式是隱藏的,不能被訪問。有沒有辦法強制模糊事件?或者某種方式來解決這個錯誤?這裏是我的代碼:

$j('.dField').focus(function(){ 
    clearInput($j(this)[0]); //The [0] seems to be necessary to retrieve the element at the DOM object level 
}); 
$j('.dField').blur(function(){ 
    restoreInput($j(this)[0]); 
}); 

function clearInput(textField) { 
    if (textField.value == textField.defaultValue) { 
     textField.value = ""; 
    } 
} 

//Restores the default value 
function restoreInput(textField){ 
    if (textField.value == ""){ 
     textField.value = textField.defaultValue; 
    } 
} 

$j('#dFormBack').click(function(){ 
     $j('#dContentContainer').show(); 
     $j('#vehicle_form').hide(); 
    }); 
+0

之前隱藏的'[0]'等同於'獲得(0)'。它檢索jQuery對象中指定位置的底層DOM元素。 http://api.jquery.com/get/ –

+1

注意:你是否嘗試使用placeholder屬性來代替(可能是一個佔位符插件來實現可兼容性)? – David

+0

當您談論佔位符插件時,我不確定您指的是什麼? – mheavers

回答

1

您可以激活blur事件偵聽器中的功能,而不是嘗試啓動模糊事件。

restoreInput($j(".dfield")[0]); 

一個方面說明,你的第一線可以更有效地寫入:

$j('.dField').focus(function(){ 
    clearInput(this); 
}).blur(function(){ 
    restoreInput(this); 
}); 

在事件處理程序this指到的事件偵聽器所連接的DOM元素。沒有必要將this包裝在JQuery包裝器中,並使用[0]再次獲取DOM元素。

+0

我不能使用上面的代碼,因爲每個具有該類的字段都有唯一的值,所以$(this)是必需的。但是,由於代碼縮短,這很有用 – mheavers

+0

調整選擇器以匹配相關輸入元素:'restoreInput($ j(「。dfield#email」)[0]);'。 –

+0

我真的不明白什麼是引用特定字段來解決這個問題 - 即使我處理電子郵件字段,還有四個人擔心 – mheavers

0

你是對的。當某些東西不可見時,它不能是focus()'ed或blur()'ed。

1

如前所述here

Triggering the focus on hidden elements causes an error in Internet Explorer. Take care to only call .focus() without parameters on elements that are visible.

所以,你應該只檢查元素調用focus()

+0

該代碼的外觀如何 - 我嘗試的所有內容似乎都不起作用。你不能在焦點偵聽器中放置一個條件,調用blur似乎不起作用。此外,這不僅僅是一個IE問題 - 它是任何瀏覽器。 – mheavers

+0

不在焦點偵聽器中,請在焦點觸發前進行檢查。 – David

+0

是的 - 但事情是 - 一旦你觸發了一個焦點監聽器,它會一直存在,除非你解開監聽器,對吧?至少在我看來 – mheavers