jQuery 'if .change () або .keyup ()'


82

За допомогою jQuery я хотів би запустити функцію, коли .change()або.keyup() є піднято.

Щось на зразок цього.

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

РЕДАГУВАТИ

Вибачте, я забув згадати. Обидва .change()і .keyup()потрібні деякі змінні, щоб бути в обсязі.


2
Події не "активні", вони піднімаються.
StuperUser

need some of the variables to be in-scopeви маєте на увазі змінні з події або змінні, які ви використовуєте, коли реєструєте ці обробники подій? Ви отримуєте змінні події в параметрі події (зазвичай їх називають e), інакше вам може знадобитися тримати їх на рівні вікна або даних на елементі, доки події не будуть підняті, або переглянути закриття.
StuperUser

Відповіді:


189

Ви можете прив’язати кілька подій, розділивши їх пробілом:

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

документи тут .

сподівання, що допомагає. ура!


7
Майте на увазі, що внутрішня функція викликається двічі, якщо значення змінюється при клавіатурі (так, майже завжди). Дивіться відповідь @Joshua Burns, щоб вирішити це.
T30,

але він виконується 2 рази один раз для "клавіатури" і один для "зміни" ... чому?
Рахул Павар,

6
Потрібно використовувати .on () замість .bind ()
StefanBob

23

Якщо ви коли-небудь динамічно генеруєте вміст сторінки або завантажуєте вміст через AJAX, наступний приклад - це справді той шлях, яким ви повинні йти:

  1. Це запобігає подвійному прив'язуванню у випадку, коли сценарій завантажується більше одного разу, наприклад, у запиті AJAX.
  2. Прив'язка живе bodyу документі, тому незалежно від того, які елементи додані, переміщені, видалені та повторно додані, усі нащадки bodyвідповідності вказаному селектору збережуть належну прив'язку.

Код:

// 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!');
});

Зверніть увагу! Я використання $.on()і $.off()швидше , ніж інші методи з кількох причин:

  1. $.live()і $.die()є застарілими та були пропущені в останніх версіях jQuery.
  2. Мені потрібно або визначити окрему функцію (отже, захаращуючи глобальну область дії), і передати функцію обом $.change()і $.keyup()окремо, або передати одне і те ж оголошення функції кожній викликаній функції; Дублююча логіка ... Що абсолютно неприпустимо.
  3. Якщо елементи коли-небудь додаються до DOM, $.bind()не динамічно прив'язуються до елементів під час їх створення. Тому, якщо ви прив'язуєте :inputі додаєте вхід до DOM, цей метод прив'язки не приєднується до нового вводу. Потім вам потрібно буде явно розв’язати, а потім знову прив’язати всі елементи в DOM (інакше прив’язки дублюються). Цей процес потрібно буде повторювати кожного разу, коли в DOM додається вхід.

Що робить другий рядок?
Варун

@VarunDas, var bind_to = ':input';створює змінну, bind_toяка називається селектором для захоплення всіх типів введення, таких як input, textareaта button.
Джошуа Бернс,

Якщо я хочу конкретних елементів: var bind_to = '#myInput';виклик ajax виконується двічі в будь-якому випадку. Чому ???
Pathros

@Pathros Мені потрібно було б побачити приклад, цій темі не місце. Зробіть мені повідомлення на LinkedIn або щось інше
Джошуа Бернс,

3

Зробити це.

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

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

change()і keyup()поверніть упакований набір, щоб ви могли це прив’язати.
StuperUser

Ви могли, не могли б. Дякую.
brenjt

ланцюжок також усуває другий запит через DOM.
keeganwatkins

2

Ви можете підписатись на зміни та зміни подій:

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

де myFunctionфункція, яку ви хотіли б виконати:

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

1

Не так працюють події. Натомість ви надаєте їм функцію, яку потрібно викликати, коли вони трапляються.

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

0

Напишіть одну функцію та назвіть її обома.

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

Функції реєстрації подій change () та keyup () повертають початковий набір, щоб їх можна було прив’язати.


0

введення події клавіатури jquery - -

Для демонстрації

$(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>   


Цінуйте одиничний приклад, навіть незважаючи на те, що ОП шукало комбіноване рішення клавіатури та змін ...
Берндог,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.