2012-01-10 30 views
81

Trong khi làm việc với các sự kiện trình duyệt, tôi đã bắt đầu kết hợp touchEvents của Safari cho thiết bị di động. Tôi thấy rằng addEventListener s đang xếp chồng lên nhau với các điều kiện. Dự án này không thể sử dụng JQuery.Liên kết nhiều sự kiện với người nghe (không có JQuery)?

Một sự kiện tiêu chuẩn nghe:

/* option 1 */ 
window.addEventListener('mousemove', this.mouseMoveHandler, false); 
window.addEventListener('touchmove', this.mouseMoveHandler, false); 

/* option 2, only enables the required event */ 
var isTouchEnabled = window.Touch || false; 
window.addEventListener(isTouchEnabled ? 'touchmove' : 'mousemove', this.mouseMoveHandler, false); 

JQuery bind cho phép nhiều sự kiện, như vậy:

$(window).bind('mousemove touchmove', function(e) { 
    //do something; 
}); 

Có cách nào để kết hợp hai người nghe sự kiện như trong ví dụ JQuery? ví dụ:

window.addEventListener('mousemove touchmove', this.mouseMoveHandler, false); 

Bất kỳ đề xuất hoặc mẹo nào được đánh giá cao!

+0

@RobG có lẽ vì câu hỏi đặt ra là hỏi cách sao chép một số chức năng của jQuery. Tôi không chắc đó có phải là cách sử dụng thích hợp cho một thẻ hay không. –

+0

Đủ công bằng, dường như với tôi rằng câu hỏi đó không cần đến nó. Mặc dù có vẻ hơi lén lút, đã bị xóa. – RobG

Trả lời

70

Trong POJS, bạn thêm một người nghe mỗi lần. Nó không phải là phổ biến để thêm cùng một người nghe cho hai sự kiện khác nhau trên cùng một phần tử. Bạn có thể viết chức năng nhỏ của riêng mình để thực hiện công việc, ví dụ:

/* Add one or more listeners to an element 
** @param {DOMElement} element - DOM element to add listeners to 
** @param {string} eventNames - space separated list of event names, e.g. 'click change' 
** @param {Function} listener - function to attach for each event as a listener 
*/ 
function addListenerMulti(element, eventNames, listener) { 
    var events = eventNames.split(' '); 
    for (var i=0, iLen=events.length; i<iLen; i++) { 
    element.addEventListener(events[i], listener, false); 
    } 
} 

addListenerMulti(window, 'mousemove touchmove', function(){…}); 

Hy vọng nó sẽ hiển thị khái niệm.

Sửa 2016-02-25

bình luận Dalgard của gây ra cho tôi xem lại này. Tôi đoán việc thêm cùng một trình lắng nghe cho nhiều sự kiện trên một phần tử phổ biến hơn là bao gồm các loại giao diện khác nhau đang sử dụng, và câu trả lời của Isaac cung cấp một cách sử dụng tốt các phương thức tích hợp để giảm mã (mặc dù ít mã hơn , không nhất thiết phải là tiền thưởng). Mở rộng với chức năng mũi tên ECMAScript 2015 cho:

function addListenerMulti(el, s, fn) { 
    s.split(' ').forEach(e => el.addEventListener(e, fn, false)); 
} 

Một chiến lược tương tự có thể thêm cùng một người nghe vào nhiều yếu tố, nhưng cần phải làm điều đó có thể là chỉ báo cho sự kiện.

+2

Cảm ơn bạn cho câu "" Không phổ biến để thêm cùng một người nghe cho hai sự kiện khác nhau trên cùng một phần tử. "Đôi khi (xanh) devs cần phải nghe điều này để biết họ đang làm đúng :) –

+0

Don ' t bạn có nghĩa là "nó không phải là UNcommon"? – dalgard

+2

@ dalgard — thông thường hơn khi các thiết bị cảm ứng phổ biến hơn, nhưng chỉ cho một số sự kiện hạn chế (chẳng hạn như mousemove và touchmove). Rằng nó được yêu cầu cho thấy tầm nhìn ngắn của các sự kiện đặt tên sau khi vật lý, di chuyển con trỏ có thể đã được thích hợp hơn. Nó có thể được thực hiện bằng cách chạm hoặc thiết bị khác. Trước khi chuột (hoặc chuột) có x/y bánh xe, một số tôi đã sử dụng đã có bánh xe tay và chân (1970 Stecometer). Ngoài ra còn có các quả bóng theo dõi và quả cầu, một số di chuyển trong 3d. – RobG

1

AddEventListener lấy một chuỗi đơn giản đại diện cho event.type. Vì vậy, bạn cần phải viết một chức năng tùy chỉnh để lặp qua nhiều sự kiện.

Điều này đang được xử lý trong jQuery bằng cách sử dụng .split ("") và sau đó lặp qua danh sách để đặt eventListeners cho mỗi types.

// Add elem as a property of the handle function 
    // This is to prevent a memory leak with non-native events in IE. 
    eventHandle.elem = elem; 

    // Handle multiple events separated by a space 
    // jQuery(...).bind("mouseover mouseout", fn); 
    types = types.split(" "); 

    var type, i = 0, namespaces; 

    while ((type = types[ i++ ])) { <-- iterates thru 1 by 1 
74

Một số cú pháp nhỏ gọn mà đạt được kết quả mong muốn, POJS:

("mousemove touchmove".split(" ")).forEach(function(e){ 
     window.addEventListener(e,mouseMoveHandler,false); 
    }); 
+88

Hoặc trực tiếp '['mousemove', 'touchmove']. ForEach (...)' –

+1

* chèn thankyou gif * – super

+0

+1 VÀ nó không cần «ECMAScript 2015 chức năng mũi tên» mở rộng! ;-) –

5

Đối với tôi; mã này hoạt động tốt và là mã ngắn nhất để xử lý nhiều sự kiện có cùng chức năng (nội tuyến).

var eventList = ["change", "keyup", "paste", "input", "propertychange", "..."]; 
for(event of eventList) { 
    element.addEventListener(event, function() { 
     // your function body... 
     console.log("you inserted things by paste or typing etc."); 
    }); 
} 
7

ES2015:

let el = document.getElementById("el"); 
let handler =()=> console.log("changed"); 
['change', 'keyup', 'cut'].forEach(event => el.addEventListener(event, handler)); 
+0

Hoặc sử dụng vòng lặp 'cho ... của' – dude

16

Dọn dẹp Isaac câu trả lời:

['mousemove', 'touchmove'].map(function(e) { 
    window.addEventListener(e, mouseMoveHandler); 
}); 
3

Tôi có một giải pháp đơn giản cho bạn:

window.onload = window.onresize = (event) => { 
    //Your Code Here 
} 

Tôi đã thử nghiệm này một nó hoạt động tuyệt vời, ở mặt cộng với nó là nhỏ gọn và uncomplica ted như các ví dụ khác ở đây.

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