2013-01-09 127 views
0

可能重複:
jQuery - on() function when a div is clicked, but not when a child of that div is clicked在點擊TD,文本框被點擊

$(oTrPlanning).prev().children('td').each(function() { 
    this.onclick = setCountClick; 
}); 

在TD setCountClick()的點擊被調用,但TD還包含了Textbox

<td> 
    <input class="Input-InlineFilter" id="TextFirst" type="text" value=""> 
</td> 

因此,當我開始在Textbox上輸入內容時,setCountClick()再次被調用。 單擊TD時,我想調用setCountClick(),但不是Textbox

+2

哇喔哇。你爲什麼要這樣綁定'click'?爲什麼不能'$(oTrPlanning).prev()。on('click','td',setCountClick)'? – Mathletics

+0

我只是要刺穿這個,但會onclick =「返回false;」在文本框中防止? – Bender

+0

@Mathletics將做到這一點 – Yogesh

回答

5

點擊事件將DOM從textbox增加到td,一直到body。如果你不想textbox點擊觸發td單擊處理程序,你需要停止冒泡:

$('#TextFirst').click(function (e) { 
    e.stopPropogation(); 
}); 

Documentation for stopPropagation

擴大,你應該考慮這個冒泡的優勢,只能綁定一個事件處理程序,所有td S:

// bind one handler to all tds 
$(oTrPlanning).prev().on('click', 'td', function (e) { 
    // ensure the clicked element is a TD 
    if (this.nodeName === 'TD') { 
     setCountClick(e); 
    } 
}); 

Documentation for nodeName

請注意,如果您依靠this運營商在setCountClick以內的任何地方運營,它可能不再按預期工作。爲了解決這個問題,你就需要考慮使用$.proxybind,當你調用setCountClick

setCountClick.bind(this)(e); 

bind返回使用您通過爲新函數內this參數必須一個新的功能。然後執行該函數並將其傳遞給您的常規參數。

Documentation for bind

+0

爲什麼添加另一個綁定,當你只能檢查父級的綁定處理程序中的目標? – Mathletics

+0

現在使用第一個'click'來設置點擊處理程序;我以爲OP想要實際上點擊點擊處理程序? – Mathletics

+0

@Mathletics謝謝,錯過了。 – jbabey

0

的問題是,事件是由兒童家長傳播。您可以綁定像這樣:

$(oTrPlanning).prev().on('click', 'td', setCountClick); 

你的方法setCountClick會收到event作爲第一個參數,您可以檢查這些像這樣:

function setCountClick(event) { 
    // make sure the click was on a TD and not something else 
    if ($(event.target).is('td')) { 
     // you've hit a TD, run your code here 
    } 

}