jQuery 'if .change () hoặc .keyup ()'


82

Sử dụng jQuery, tôi muốn chạy một hàm khi một trong hai .change()hoặc .keyup()được nâng lên.

Một cái gì đó như thế này.

if ( jQuery(':input').change() || jQuery(':input').keyup() )
{
    alert( 'something happened!' );
}

BIÊN TẬP

Xin lỗi tôi quên đề cập. Cả hai .change().keyup()cần một số biến trong phạm vi.


2
Các sự kiện không "hoạt động", chúng được nâng lên.
StuperUser

need some of the variables to be in-scopeý của bạn là các biến từ sự kiện hay các biến bạn đang sử dụng khi đăng ký các trình xử lý sự kiện này? Bạn nhận được các biến sự kiện trong tham số sự kiện (thường được đặt tên e), nếu không, bạn có thể cần giữ chúng ở cấp cửa sổ hoặc dữ liệu trên phần tử cho đến khi các sự kiện được nâng lên hoặc xem xét các lần đóng.
StuperUser

Câu trả lời:


189

bạn có thể liên kết với nhiều sự kiện bằng cách tách chúng bằng dấu cách:

$(":input").on("keyup change", function(e) {
    // do stuff!
})

tài liệu ở đây .

hy vọng rằng sẽ giúp. chúc mừng!


7
Lưu ý rằng hàm bên trong được gọi hai lần nếu giá trị thay đổi khi gõ phím (vì vậy, gần như luôn luôn). Xem phản hồi của @Joshua Burns để xử lý.
T30

nhưng nó thực hiện 2 lần một cho "keyup" và một cho "thay đổi" ... tại sao?
Rahul Pawar

6
Nên sử dụng .on () thay vì .bind ()
StefanBob

23

Nếu bạn đã từng tạo động nội dung trang hoặc tải nội dung thông qua AJAX, thì ví dụ sau đây thực sự là cách bạn nên làm:

  1. Nó ngăn chặn ràng buộc kép trong trường hợp tập lệnh được tải nhiều lần, chẳng hạn như trong một yêu cầu AJAX.
  2. Liên kết tồn tại trên bodytài liệu, vì vậy bất kể phần tử nào được thêm vào, di chuyển, xóa và thêm lại, tất cả các phần tử con của việc bodykhớp với bộ chọn được chỉ định sẽ giữ lại liên kết thích hợp.

Mật mã:

// Define the element we wish to bind to.
var bind_to = ':input';

// Prevent double-binding.
$(document.body).off('change', bind_to);

// Bind the event to all body descendants matching the "bind_to" selector.
$(document.body).on('change keyup', bind_to, function(event) {
    alert('something happened!');
});

Xin hãy chú ý! Tôi đang sử dụng $.on()$.off()thay vì sử dụng các phương pháp khác vì một số lý do:

  1. $.live()$.die()không được dùng nữa và đã bị loại bỏ khỏi các phiên bản jQuery mới hơn.
  2. Tôi cần phải xác định một hàm riêng biệt (do đó làm lộn xộn phạm vi toàn cục,) và chuyển hàm cho cả hai $.change()$.keyup()riêng biệt, hoặc chuyển cùng một khai báo hàm cho mỗi hàm được gọi; Sự trùng lặp logic ... Đó là điều hoàn toàn không thể chấp nhận được.
  3. Nếu các phần tử đã từng được thêm vào DOM, $.bind()không liên kết động với các phần tử khi chúng được tạo. Do đó, nếu bạn liên kết với :inputvà sau đó thêm một đầu vào vào DOM, thì phương thức liên kết đó sẽ không được gắn với đầu vào mới. Sau đó, bạn cần phải hủy ràng buộc một cách rõ ràng và sau đó liên kết lại với tất cả các phần tử trong DOM (nếu không, các liên kết sẽ bị trùng lặp). Quá trình này sẽ cần được lặp lại mỗi khi một đầu vào được thêm vào DOM.

Dòng thứ hai làm gì?
Varun

@VarunDas, var bind_to = ':input';tạo ra một biến gọi bind_tođó là một chọn để lấy tất cả các loại đầu vào, ví dụ như input, textareabutton.
Joshua Burns

Nếu tôi muốn cho các phần tử cụ thể: var bind_to = '#myInput';Vẫn thực hiện lệnh gọi ajax hai lần. Tại sao???
Pathros

@Pathros Tôi cần xem một ví dụ, chủ đề này không phải là nơi. Gửi cho tôi một tin nhắn trên LinkedIn hay gì đó
Joshua Burns

3

Làm cái này.

$(function(){
    var myFunction = function()
    {
        alert("myFunction called");
    }

    jQuery(':input').change(myFunction).keyup(myFunction);
});

change()keyup()trả lại bộ đã bọc để bạn có thể xâu chuỗi đó.
StuperUser 13/10/11

Bạn có thể, bạn không thể. Cảm ơn.
brenjt 13/10/11

chuỗi cũng loại bỏ truy vấn thứ hai thông qua DOM.
keeganwatkins

2

Bạn có thể đăng ký các sự kiện thay đổi và keyup:

$(function() {
    $(':input').change(myFunction).keyup(myFunction);
});

đâu myFunctionlà chức năng bạn muốn thực thi:

function myFunction() {
    alert( 'something happened!' );
}

1

Đó không phải là cách các sự kiện hoạt động. Thay vào đó, bạn cung cấp cho chúng một hàm để được gọi khi chúng xảy ra.

$("input").change(function() {
    alert("Something happened!");
});

0

Viết một hàm duy nhất và gọi nó cho cả hai.

function yourHandler(e){
    alert( 'something happened!' );        
}
jQuery(':input').change(yourHandler).keyup(yourHandler);

Các hàm đăng ký sự kiện change () và keyup () trả về tập hợp ban đầu, vì vậy chúng có thể được xâu chuỗi.


0

sự kiện keyup đầu vào jquery

Đối với Demo

$(document).ready(function(){  
    $("#tutsmake").keydown(function(){  
        $("#tutsmake").css("background-color", "green");  
    });  
    $("#tutsmake").keyup(function(){  
        $("#tutsmake").css("background-color", "yellow");  
    });  
}); 
<!DOCTYPE html>  
<html>  
<title> jQuery keyup Event Example </title>
<head>  
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>  
<body>  
Fill the Input Box: <input type="text" id="tutsmake">  
</body>  
</html>   


Đánh giá cao những ví dụ đơn lẻ mặc dù OP đang tìm kiếm một KeyUp và thay đổi giải pháp kết hợp ...
Burndog
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.