2011-10-28 38 views
6

Tôi đang tìm cách tạo sự kiện tùy chỉnh trong HTML, JS.Sự kiện tùy chỉnh trong HTML, Javascript

<input type="text" oncustombind="foo(event);" /> 

Làm cách nào để tạo một tài khoản như vậy? 'oncustombind' là sự kiện tùy chỉnh mà tôi muốn tạo. Tôi có thể gọi hàm/mã được xác định trong thuộc tính oncustombind. Ngoài ra, tôi cần truyền một số dữ liệu cho đối tượng sự kiện.

Tôi không muốn sử dụng bất kỳ thư viện nào như jquery, YUI.

Mọi trợ giúp sẽ được đánh giá cao.

+2

Là một javascript nội dòng sang một bên trong HTML là một bản hack bẩn lớn. Đừng làm thế. – Raynos

+0

Kể từ khi câu hỏi được đăng lần đã thay đổi. Hiện tại các thành phần web đang trở thành một cách khả thi để thay thế các khung công tác js. Có sự kiện tùy chỉnh nội tuyến sẽ thực sự thực sự hữu ích cho việc viết mã có thể dễ dàng đọc (tương tự như góc cạnh/phản ứng). Một mẹo hay là chia sẻ ngữ cảnh 'này' của thành phần web với phần tử dom chidlren bằng cách sử dụng' Object.assign'. Theo cách này, bất kỳ phần tử Dom đã chọn nào cũng có thể truy cập vào các phương thức được định nghĩa trong lớp thành phần web. Sẽ tốt hơn nếu bạn có quyền truy cập vào các sự kiện tùy chỉnh từ trình xử lý sự kiện tùy chỉnh nội tuyến. –

Trả lời

9

Bạn muốn có một CustomEvent

Họ nên dễ làm việc với nhưng hỗ trợ trình duyệt nghèo. Tuy nhiên, DOM-shim nên khắc phục điều đó.

var ev = new CustomEvent("someString"); 
var el = document.getElementById("someElement"); 
el.addEventListener("someString", function (ev) { 
    // should work 
}); 
el.dispatchEvent(ev); 
4

Thực tiễn không tốt là sử dụng new Functionwith, nhưng điều này có thể được thực hiện như sau: http://jsfiddle.net/pimvdb/72GwE/13/.

function trigger(elem, name, e) { 
    var func = new Function('e', 

     'with(document) {' 
    + 'with(this) {' 
    + elem.getAttribute('on' + name) 
    + '}' 
    + '}'); 

    func.call(elem, e); 
} 

Với HTML sau:

<input type="text" oncustombind="console.log(e, type, getElementById);" id="x"> 

sau đó kích hoạt các sự kiện như:

trigger(document.getElementById('x'), 'custombind', {foo: 123}); 
+1

@Raynos: Bạn sẽ sử dụng gì để làm cho 'window',' document', 'event' và' e' nằm trong phạm vi? Không có cách nào tốt hơn 'with' ... – pimvdb

+0

trong phạm vi của cái gì? 'window',' document', 'elem' và' e' đã nằm trong phạm vi. – Raynos

+0

@Raynos: Trong thuộc tính sự kiện HTML, bạn có thể tự động lấy các thuộc tính và các hàm 'tài liệu', ví dụ: 'getElementById' không có' document.' được thêm vào trước. – pimvdb

Các vấn đề liên quan