2012-12-05 54 views
2

爲什麼此代碼隱藏在blur()上用作jQuery選擇器的div如果單擊其內部?模糊()應該只隱藏它,如果我點擊它之外。jQuery .blur() - 不要隱藏活動div

HTML觸發:

<div class="header">To-Do <a class="triggernewtodo">Add a task...</a></div> 

裏顯示/隱藏:

<li class="addnewtodo"> 
<form> 
    <textarea class="addtodotextarea"></textarea> 
    <div class="controlarea"> 
    <input class="primary" name="commit" type="submit" value="Add" /> 
    </div> 
</form> 
</li> 

的jQuery:

// Show/Hide New Todo form 
$('a.triggernewtodo').click(function() { 
    $('li.addnewtodo').show() 
    $('textarea.addtodotextarea').focus(); 
}); 

$('li.addnewtodo').live("blur", function() { 
    $(this).hide(); 
}) 

我猜我它與放置在textarea上的.focus()有關,因爲如果我取出.focus(),它會正常工作,直到我點擊textarea內部,然後單擊(仍然在列表項中)並且它隱藏整個列表項。有任何想法嗎?我究竟做錯了什麼?

+0

你爲什麼使用'$ .live'?它已被棄用。另外,請不要發佈服務器端語言代碼,粘貼生成的HTML –

+0

當問題與您的後端代碼無關時,最好在您的問題中包含您的呈現html,而不是創建它的代碼。 –

+0

我猜猜你的文本區域在li元素裏面。當把焦點放在那個元素上時,你的li元素執行模糊函數。因此,隱藏它。您可以在隱藏它之前檢查textarea元素是否有焦點 –

回答

1

我懷疑你看到一個事件在LI中「冒出來」。實質上,來自INPUT的「模糊」事件,例如,觸發該輸入上的所有「模糊」處理程序。 然後它觸發FORM上的所有「模糊」處理程序。然後它觸發LI上的「模糊」處理程序 - 隱藏它。

事件繼續一直沿着DOM樹,除非您撥打stopPropagation來防止這種情況。在你的情況,你應該能夠使用event.target屬性,看看事件實際上起源於李,只有把它藏在這種情況下(警告:未經測試):

$('li.addnewtodo').live("blur", function(event) { 
    if(event.target == this) 
    { 
     $(this).hide(); 
    } 
}); 

希望幫助!

PS:請參閱blur event上的頁面以瞭解更多注意事項。