여기서는 DataTables 1.10.0 을 기준으로 이야기한다.
input event
기본적으로 DataTables 에서 search input 은 input event 를 이용하는 듯 하다.[ref. 2] 테스트를 해봤는데 change 나 keyup event 는 아니었던 것 같다.(기억이 확실치 않다.)여하튼 input element 에 input event handler 대신에 새로운 event handler 를 bind 해주면 된다. IE 8 에서는 input event 가 발생하지 않기 때문이다.[ref. 1]
그래서 ref. 1 에서 소개하는 것처럼 propertychange event 를 사용했다. handler 는 아래 처럼 bind 해주면 된다.
_setSearchEventHandler = function(){ var dtapi; dtapi = this.$table.api(); $("#" + this.tableId + "_wrapper .dataTables_filter input") .unbind() .bind("input propertychange", function(e) { return dtapi.ajax.reload((function() { console.log("callback"); }), true); }); return; }
datatables.ajax.reload
여기서 ajax.reload 를 사용하는 이유는 server-side processing 을 사용하기 때문이다. 만약 그냥 단순한 search 를 위해서라면 search()(또는 fnFilter) 를 이용하면 된다.[ref. 3]data.search.value
이 때 주의할 점은 search input 을 가져오는 routine 이 없기 때문에 이 부분을 넣어줄 필요가 있다. 필자는 아래와 같은 Datatables 의 option 을 사용한다. 이 option 에서 ajax 부분을 수정해서 parameter 관련 callback 을 호출하기 전에 search value 를 set 해줄 수 있다.참고로 아래 코드는 coffeescript 이다.
_dtOptions = { "processing": true, # show indicator "serverSide": true, ajax: (data, callback, settings) -> if that.ie8 data.search.value = data.search.value or $("##{that.tableId}_wrapper .dataTables_filter input").val() parameterCallback.call(that, data) $.ajax url: url data: data dataType: _dataType success: (json) -> if nimpack.utils.Ajax.errorAccessKey(json.api_response.data) return callback(dataSource(json)) return "columns": columns, "order": initialOrder, "createdRow": fnCreatedRowCallback, "preDrawCallback" : preDrawCallback, "drawCallback" : drawCallback }
References
- jQuery 'input' event - Stack Overflow
- jQuery DataTables: Delay search until 3 characters been typed OR a button clicked - Stack Overflow
- jquery - Datatables - Search Box outside datatable - Stack Overflow
댓글 없음:
댓글 쓰기