2010-09-24 21 views
6

kịch bản của tôi hoạt động nhưng tôi không hiểu cách làm cho nó KHÔNG khởi chạy các chức năng khi trong văn bản/đầu vào và các phím đó được nhấn. aka: khởi chạy sự kiện khi người dùng nhấn phím đó, trừ khi người dùng ở trong vùng văn bản/đầu vào.jquery: thực hiện việc này trên keyup, trừ khi người đó đang ở trong vùng văn bản hoặc nhập

$('body').keyup(function (event) { 

var direction = null; 
if (event.keyCode == 37) { 
    $('#wrapper').fadeOut(500) 
} else if (event.keyCode == 39) { 
     $('html,body').animate({scrollTop: $('body').offset().top}, {duration: 1500, easing: 'easeInOutQuart'} 
     ) 
return false;  
} 
    }) 

Trả lời

10

Chỉ cần kiểm tra event.target:

$('body').keyup(function(event) { 
    if ($(event.target).is(':not(input, textarea)')) { 
     ... 
    } 
}); 

Trong trường hợp này bạn sẽ vẫn chỉ có một trình xử lý sự kiện (được gắn với phần thân) nhưng nó sẽ lọc các phần tử nhận được sự kiện

+0

Tại sao chỉ định sự kiện cho đầu vào ở vị trí đầu tiên nếu bạn không bao giờ muốn xử lý nó? – GenericTypeTea

+1

Ở đây chúng tôi gán sự kiện cho cơ thể, không phải cho đầu vào. Và sau đó chỉ lọc với đầu vào và textarea .. Nó tốt hơn sau đó gán sự kiện cho tất cả các yếu tố ngoại trừ đầu vào – fantactuka

+1

+1 hiệu quả thực hiện – Thariama

1

Hãy thử:

$('body *:not(textarea,input)').keyup(function (event) { 

}); 
+1

Lựa chọn này không chính xác vì nó sẽ thêm nhiều trình xử lý sự kiện như nhiều phần tử bạn có trên trang. – fantactuka

+0

gần như đúng (văn bản không được bao gồm), nhưng điều này sẽ làm việc – Thariama

1
$('body :not(textarea,input[type=text])').keyup(function (event) { 

hoặc

$('body').not('textarea,input[type=text]').keyup(function (event) { 
+0

Điều này có cùng một vấn đề như giải pháp của Thariama – fantactuka

+0

đó là những gì ông yêu cầu. –

+0

Chỉ cần hình dung trang đó có 10000 phần tử (không quá nhiều). Bạn sẽ chỉ định sự kiện cho từng phần tử? Nó không có ý nghĩa – fantactuka

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