2016-02-02 8 views
10

Chcę użyć jQuery, aby sprawdzić, czy trzy pola tekstowe zostały zmienione, więc mogę wysyłać dane przez AJAX.Możemy użyć operatora i połączyć wiele zdarzeń jQuery

próbowałem prosty skrypt:

$("#name, #position, #salary").change(function() 
{ 
    console.log("All data are changed"); 
}); 

Gdzie nazwisko, stanowisko i wynagrodzenie są odpowiednie identyfikatory z trzech polu tekstowym.

Rezultatem było to, że kiedy zmieni się pierwszy:

enter image description here

I kiedy zmienił drugie:

enter image description here

A oto trzeci:

enter image description here

Tak, mam wiadomość, gdy osobno zmienia się każde pole tekstowe. To, czego potrzebuję, to to, że kiedy trzy zostaną zmienione, wyświetl wiadomość. Jestem nowy w jQuery, więc chcę wiedzieć, czy mogę użyć czegoś takiego jak IF ... AND ... AND w jQuery.

+6

Jak działa ludzki Update 3 otaczaniem w w tym samym czasie? – choz

+4

LOL, okay, zobacz to w ten sposób, kiedy "ludzki" typ w pierwszym polu, a następnie w drugim, a następnie trzecim, i bez kliknięcia przycisku, dane te zostaną wysłane na serwer. Wystarczająco dobry ? –

+1

Więc zasadniczo chcesz sprawdzić, czy te trzy nie są puste, gdy jedna z nich się zmienia? Nie musimy widzieć skomplikowanych rzeczy tam, gdzie ich nie ma. –

Odpowiedz

6

Wiele frameworków do sprawdzania poprawności ma koncepcję brudnego wejścia, gdy użytkownik zmieni wartość. Możesz to zaimplementować i sprawdzić, czy wszystkie twoje pola są brudne.

$("#name, #position, #salary").change(function() { 
 
    this.classList.add("dirty"); 
 
    if ($(".dirty").length === 3) { 
 
    console.log("All data are changed"); 
 
    } 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="name" /> 
 
<input id="position" /> 
 
<input id="salary" />

Możemy abstrakcyjny na to uwagę w plugin jQuery do ponownego użycia

$.fn.allChange = function(callback) { 
 
    var $elements = this; 
 
    $elements.change(function() { 
 
    this.classList.add("dirty"); 
 
    if (callback && $elements.filter(".dirty").length === $elements.length) { 
 
     callback.call($elements); 
 
    } 
 
    }); 
 
    return $elements; 
 
} 
 

 
$("#name, #position, #salary").allChange(function() { 
 
    console.log("All data are changed"); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="name" /> 
 
<input id="position" /> 
 
<input id="salary" />

1

Zapisz wiele selektorów w zmiennej. Na .change() zapętlić elementy w selektorze wielokrotnym, aby przetestować wartości wejściowe. Jeśli wszystkie wejścia mają treść, można wywołać dodatkową funkcję.

$(document).ready(function(){ 
 
    
 
    var $selectors = $('#input1, #input2, #input3'); 
 

 
    $selectors.change(function(){ 
 
    var allChanged = true; 
 
    console.log($(this).attr('id') + ' was changed.'); 
 

 
    $selectors.each(function(){ 
 
     if ($(this).val() == '') { 
 
     allChanged = false; 
 
     } 
 
    }); 
 

 
    if (allChanged) { 
 
     // $().ajax(); 
 
    } 
 

 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="input1"> 
 
<input id="input2"> 
 
<input id="input3">

4

można zapisać zmienione wejść w tablicy i sprawdzić jego długość, aby wykryć, czy wszystkie z nich, gdzie zmienił.

var changedInputs = []; 
$("#name, #position, #salary").change(function() 
{ 
    changedInputs.push(this.id); 
    if(changedInputs.length === 3) { 
     alert('All 3 inputs where changed!'); 
    } 
}); 
+3

Problem z tym jest taki, że jeśli osoba zmienia ten sam identyfikator 2 razy, to czy to działa? – dvenkatsagar

+2

Nie wspomniano o tym w op, ale można dodać logikę, która wykonuje 'push' /' splice' na podstawie wartości wejściowej. Nie widzę żadnych problemów. –

2

Możesz także użyć tego podejścia. Fiddle

var isNameChanged, isPositionChanged, isSalaryChanged = false; 

function fieldsChanged() 
{ 
    var id = $(this).attr('id'); 
    if (id == 'name') isNameChanged = true; 
    else if (id == 'position') isPositionChanged = true; 
    else if (id == 'salary') isSalaryChanged = true; 

    if (isNameChanged && isPositionChanged && isSalaryChanged) { 
    console.log('All have been changed'); 
    isNameChanged = isPositionChanged = isSalaryChanged = false; 
    } 
} 

$(function(){ 
    $('#name, #position, #salary').change(fieldsChanged); 
}); 
1

Spróbuj użyć klasę:

<input class="need"> 
<input class="need"> 
<input class="need"> 
$(".need").change(function() 
{ 
    var all = 0; 
    $(".need").each(function(i,v){ 
     if ($(v).val().length >0) { 
      all+=1; 
     } 
    }); 
    if(all.length == 3) { 
     alert('All 3 inputs where changed!'); 
    } 
}); 
4

Można spróbować:

var changedInputs = []; 
$("#name, #position, #salary").change(function() 
{ 
    if !(changedInputs.include(this.id)){ 
    changedInputs.push(this.id); 
    if(changedInputs.length == 3) { 
     alert('All 3 inputs where changed!'); 
    } 
}); 
0

jedno możliwe rozwiązanie:

var needed = ["name", "position", "salary"]; 

$("#name, #position, #salary").change(function() 
{ 
    if(needed.length == 0) return; 
    needed.splice(needed.indexOf($(this).attr('id')), 1); 
    if(needed.length == 0) 
     console.log("All data are changed"); 
}); 

pierwsze, trzeba init tablicę "potrzebne" do wszystkich wymaganych pól wtedy, gdy pole jest zmieniana, usunięcie tego pola z poszkodowanym tablicy gdy tablica jest pusta, wszystkie wymagane wartości są zmieniane;)

pierwszym warunkiem jest zapewnienie, aby nie logować się komunikat o więcej niż raz

0

Możesz porównać wartość prądu wejściowego do domyślnego, a następnie logika może być następująca:

BTW ustalić wspólną klasę dla wszystkich wejść, by sprawdzić, ponieważ jest to w jaki sposób powinno się to odbywać imho ...

$('.inputToCheck').on('change', function() { 
 
    var allInputsChanged = !$('.inputToCheck').filter(function() { 
 
    return this.value === this.defaultValue; 
 
    }).length; 
 
    if (allInputsChanged) alert('All inputs changed!'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<input id="name" class="inputToCheck"> 
 
<input id="position" class="inputToCheck"> 
 
<input id="salary" class="inputToCheck">

+0

Dzięki temu naprawdę pomaga –

Powiązane problemy