2017-02-01 49 views
1

編輯爲幾個人指出,我會平變化混合的onclick ...

this question昨天,這人的方式,固定親切回答我的貼問題,但我不明白爲什麼$("#selector").click methon可行,但onchange=(...)不行。

所以,如果我有HTML,在父元素的DataTable cloumn頭,其中頭部的任何點擊觸發的DataTable排序過程:

<div> 
    <input type="checkbox" id="select_all" onchange="SelectAll(event)"> 
    SELECT ALL 
</div> 
//This is hit only AFTER the sort routine from the parent element is fired. 
function SelectAll(event) { 
    event.stopPropagation(); 

    var boxes = document.querySelectorAll("[name*=\"include_\"]"); //All checkboxes prefixed "include_".  
    var chk = document.getElementById('select_all').checked; 

    for (var i = 0; i < boxes.length; i++) { 
     if(!boxes[i].disabled) { 
      boxes[i].checked = chk; 
     } 
    } 
} 

//This is hit BEFORE the sort routine from the parent element is fired. 
$("#select_all").click(function(event){ 
    event.stopPropagation() 
}); 
} 

第二種方法,父元素的click事件之前發射,作品對我而言,但兩者之間的根本區別是什麼?

JsFiddle

+0

你正在使用onChange事件,而不是onclick。在某些瀏覽器中,當元素失去焦點時,onchange只會被觸發,所以onclick將首先被觸發。 –

回答

3

onchange邏輯您所提供的全球event對象,這是不是在所有的瀏覽器,而且也不能100%保證是你所期望的單擊事件。

由於這個原因,最好避免使用on*事件屬性,並在原生JS或jQuery中使用不引人注目的事件處理程序 - 正如第二個JS示例所做的那樣。傳遞給處理函數的event對象保證是包含所需信息的相關事件。

另請注意,jQuery邏輯使用的是click事件處理程序,而不是change。您應該將.click()更改爲.change(),以便事件處理程序仍適用於通過鍵盤瀏覽網頁的人員。當元素失去焦點

1

的onChange事件通常解僱,所以點擊事件會先啓用。

+0

更改事件被觸發文本輸入的onblur。對於複選框立即提出 –

+0

對不起是onchange ... – whoasked

0

如果你打算使用jQuery,只是使用它。你爲什麼要把老派的「onxxxx」屬性與這個混在一起?

您的代碼非常簡單。只需做到這一點:

<div> 
    <input type="checkbox" id="select_all"> 
    SELECT ALL 
</div> 

function SelectAll(event) { 
    event.stopPropagation(); 

    var chk = $('#select_all')[0].checked; 
    $("[name*=\"include_\"]").each(i, element) { 
     if(! element.disabled) { 
      element.checked = chk; 
     } 
    } 
} 

$("#select_all").click(SelectAll); 
+0

我接受你的觀點。從C/C++編程來看,我發現jQuery的語法比原生JS更容易理解。如果我的代碼中有jquery,它通常由其他人提供。我確實打算轉換,承諾。 – whoasked

+1

如果有幫助,需要記住的一點是jQuery _is_原生JavaScript。畢竟,jQuery只是一個JavaScript庫。它沒有在JavaScript語言中引入任何尚未存在的語法:根據定義,每行jQuery代碼都是一行JavaScript代碼。它不像[JSX](https://facebook.github.io/react/docs/jsx-in-depth.html),它使用預處理器來提供自己的語法。你只需調用jQuery庫提供的函數,就像你可能調用任何其他庫或你自己的代碼中的函數一樣。 –