Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [AJAX][JavaScript]Sprawdzanie zaznaczonych checkboxów

Napisany przez: trifek 16.06.2016, 15:11:11

Witam serdecznie,
Mam taki kod HTML:

  1. OPCJE GŁÓWNE
  2. <http://december.com/html/4/element/input.html checked type="checkbox" value='2' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 1
  3. <http://december.com/html/4/element/input.html type="checkbox" value='8' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 2
  4. <http://december.com/html/4/element/input.html type="checkbox" value='9' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 3
  5. <http://december.com/html/4/element/input.html checked type="checkbox" value='10' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 4
  6. <http://december.com/html/4/element/input.html type="checkbox" value='3' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 5
  7. <http://december.com/html/4/element/input.html type="checkbox" value='11' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 6
  8. <http://december.com/html/4/element/input.html type="checkbox" value='12' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 7
  9. <http://december.com/html/4/element/input.html type="checkbox" value='13' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 8
  10. <http://december.com/html/4/element/input.html type="checkbox" value='14' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 9
  11. <http://december.com/html/4/element/input.html type="checkbox" value='15' name="zaznacz[]" class="zaznacz_sprawdz" /> opcja 10
  12.  
  13. OPCJE WYKLUCZONE
  14. <http://december.com/html/4/element/input.html checked type="checkbox" value='2' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 1
  15. <http://december.com/html/4/element/input.html type="checkbox" value='8' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 2
  16. <http://december.com/html/4/element/input.html type="checkbox" value='9' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 3
  17. <http://december.com/html/4/element/input.html checked type="checkbox" value='10' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 4
  18. <http://december.com/html/4/element/input.html type="checkbox" value='3' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 5
  19. <http://december.com/html/4/element/input.html type="checkbox" value='11' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 6
  20. <http://december.com/html/4/element/input.html type="checkbox" value='12' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 7
  21. <http://december.com/html/4/element/input.html type="checkbox" value='13' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 8
  22. <http://december.com/html/4/element/input.html type="checkbox" value='14' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 9
  23. <http://december.com/html/4/element/input.html type="checkbox" value='15' name="wymagaj[]" class="wymagaj_sprawdz" /> opcja 10



Potrzebuję funkcję w JQUERY która będzie sprawdzała czy po kliknięciu jakiegokolwiek checkboxa z opcji głównych i wykluczonych nie są zduplikowane (wybrane podwójnie).
Czyli np. w momencie gdy zaznaczę pierwszego checkboxa w opcjach głównych - to po zaznaczeniu pierwszego checkboxa z opcji wykluczonych wyskoczy alert z komunikatem błędu i odznaczy zduplikowany checkbox (ostatnio kliknięty).

Użytkownik wybiera zarówno opcje główne jak i wykluczone - tylko jedną, nie może być duplikatów (opcji zaznaczonych w obu wariantach)


Wie ktoś może jak to zrobić?

Bardzo proszę o pomoc

Napisany przez: fate 16.06.2016, 15:25:51

trzeba porównać value

Napisany przez: trifek 16.06.2016, 15:36:33

tak, wiem... tylko nie wiem jak to zrobić sad.gif

Próbowałem czymś takim:

  1. $('.zaznacz_sprawdz').click(function() {
  2. if($(this).is(":checked")) // zaznaczony wymagaj_sprawdz
  3. {
  4. if($('.wymagaj_sprawdz').val() == $(this).val()){
  5. alert('Nie można wybrać tej opcji ponieważ została ona już wybrana WYMAGANYCH.')
  6. $(this).prop('checked', false);
  7. }
  8.  
  9. } else { // odznaczony
  10.  
  11. }
  12. });


ale nie działa to tak, jak powinno sad.gif

Napisany przez: trueblue 16.06.2016, 15:48:46

Musisz sprawdzić w drugiej grupie checkbox o tym samym indeksie, który jest klikany w pierwszej grupie.
Obecnie sprawdzasz zawsze pierwszy w drugiej grupie.

Napisany przez: trifek 16.06.2016, 16:09:15

  1. $('.zaznacz_sprawdz').click(function() {
  2. if($(this).is(":checked")) // zaznaczony wymagaj_sprawdz
  3. {
  4. var selected = [];
  5. $('.wymagaj_sprawdz').each(function() {
  6. if ($('.wymagaj_sprawdz').val() == $(this).val()) {
  7. selected.push($('.wymagaj_sprawdz').attr('val'));
  8. alert('Nie można wybrać tej opcji ponieważ została ona już wybrana WYMAGANYCH.');
  9. $(this).prop('checked', false);
  10. }
  11. });
  12. } else { // odznaczony
  13.  
  14. }
  15. });



Coś w tym stylu? Nie wiem dlaczego zawsze wyświetla mi wartość "2" w $(this).val() :/ bez względu co kliknę...

Napisany przez: trueblue 16.06.2016, 16:13:44

Teraz sprawdzasz każdy z drugiej grupy.

Jeśli sprawdzasz 2 w pierwszej grupie, to również 2 w drugiej grupie.
Możesz to zrobić korzystając z pętli each: http://api.jquery.com/jquery.each/

Albo jeszcze inaczej. Skoro każdy odpowiednik ma taki sam atrybut value, to klikając w pierwszej grupie input z value=5, sprawdzasz w drugiej grupie input z tym samym value.

Napisany przez: viking 16.06.2016, 16:17:07

I mógłbyś tez za pomocą fieldset stworzyć logiczne grupy. Wtedy zbędne były by klasy na każdym elemencie.

Napisany przez: ZenekN 16.06.2016, 16:25:17

https://jsfiddle.net/p2n4goq9/1/

1. Unikajmy bałaganu w HTML ;-)

@trueblue

Cytat
pętla each vs lokalizacja bezpośrednia

Napisany przez: trifek 16.06.2016, 16:59:15

dziękuje, działa smile.gif

Napisany przez: trueblue 16.06.2016, 17:40:36

Cytat(ZenekN @ 16.06.2016, 17:25:17 ) *
@trueblue
Cytat

pętla each vs lokalizacja bezpośrednia


Nie bardzo wiem co miałeś na myśli.

Ale jeśli już dwie pętle, to może lepiej jedna.
https://jsfiddle.net/p2n4goq9/2/

A osobiście zrobiłbym tak:
https://jsfiddle.net/p2n4goq9/3/

Napisany przez: trifek 16.06.2016, 17:45:08

Mam jeszcze pytanie smile.gif

Przerobiłem ten skrypt na taki:

  1. $('.zaznacz_sprawdz').click(function() {
  2. if($(this).is(":checked")) // zaznaczony wymagaj_sprawdz
  3. {
  4. aktualny = $(this).val();
  5. if($('.wymagaj_sprawdz[value="'+aktualny+'"]').is(':checked'))
  6. {
  7. alert('Ten rekord jest już wybrany w WYMAGANYCH');
  8. $(this).prop('checked', false);
  9. }
  10. else{
  11. aktualny = $(this).val();
  12. var randomp = Math.round(Math.random() * 99999) + Math.round(Math.random() * 100000);
  13. $.get("check_producy.php", {query2: randomp, query1: $(this).val(), query3: 1}, function(data1) {
  14. //$(".producent2").html(data1);
  15. var myArray = data1.split('|');
  16. if(myArray.length > 0 ){
  17. var r = confirm("Znalazłem powiązania w konfiguracji WYKLUCZEŃ. Czy nanieść konfigurację na planszę?");
  18. if (r == true) {
  19. for (var i = 0; i <= myArray.length + 1; i++) {
  20. if(myArray[i] !="" && myArray[i] !="undefined" && myArray[i] !="DODAJ" && myArray[i] !="USUN" && myArray[i] != null){
  21. $(".zaznacz_sprawdz:checkbox[value="+myArray[i]+"]").prop("checked","true");
  22. }
  23. }
  24. } else {
  25. alert('Operacja anulowana!');
  26. $('.zaznacz_sprawdz:checkbox[value="' + aktualny + '"]').attr('checked', false);
  27. }
  28. }
  29. });
  30. }
  31. }
  32. });


Z pliku PHP dostaję odpowiedź w formie: DODAJ|2|8|9|10|| lub brak jakiegokolwiek tekstu.

Chciałbym żeby skrypt wyświetlił jeszcze dodatkowo alerta z pytaniem (w momencie gdy z PHP pobierze informację DODAJ): "Wykryto powiązania w bazie danych. Nanieść je na listę? TAK / NIE - po kliknięciu na TAK
odznaczy na stronie w checkboxach wszystkie te, które mają wartość: 2, 8, 9, 10 i należą do klasy zaznacz_sprawdz).

Chodzi o to żeby skrypt sprawdzał prócz obecnie widocznych powiązań jeszcze te z bazy danych smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)