Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [jQuery] Autocomplete dla kilku inputów z taką samą klasą.
Forum PHP.pl > Forum > Przedszkole
lustfingers
Próbuje wdrożyć ten autocomplete: http://www.bewebdeveloper.com/tutorial-abo...ysql-and-jquery i działa ładnie z tym że posiadam naście identycznych inputów a autocomplete pojawia się tylko dla pierwszego.

Mój input wygląda tak:

  1. <li>
  2. <input type="text" class="ingredient" name="ingredient[]" onkeyup="autocomplet()" autocomplete="off" value="" />
  3. <ul id="ingredient_list_id"></ul>
  4. </li>


a kolejne inputy pojawiają się przy użyciu funkcji clone(), natomiast kod js prezentuje się tak:

  1. function autocomplet() {
  2. var min_length = 1; // min caracters to display the autocomplete
  3. var keyword = $('.ingredient').val();
  4. if (keyword.length >= min_length) {
  5. $.ajax({
  6. url: 'ajax_refresh.php',
  7. type: 'POST',
  8. data: {keyword:keyword},
  9. success:function(data){
  10. $('#ingredient_list_id').show();
  11. $('#ingredient_list_id').html(data);
  12. }
  13. });
  14. } else {
  15. $('#ingredient_list_id').hide();
  16. }
  17. }
  18.  
  19. // set_item : this function will be executed when we select an item
  20. function set_item(item) {
  21. // change input value
  22. $('.ingredient').val(item);
  23. // hide proposition list
  24. $('#ingredient_list_id').hide();
  25. }


więc jest minimalnie inny od tego z przykładu ponieważ w przykładzie opierał się na ID. Wiem że muszę dla każdego inputa nadać inne ID i dostosować do tego kod js tylko nie mam zielonego pojęcia jak, od czego zacząć?
Pyton_000
Odpal sobie Developers Tool w przeglądarce i zobacz sobie jakimi błędami sypie
lustfingers
Nie mam błędów, po prostu gdy ma np. 10 inputów to wpisanie w jednym powoduje wpisanie w wszystkich to samo.
viking
Znowu nie rozrozniasz klasy od identyfikatora?
lustfingers
Znowu nie rozumiem o co chodzi i tu chyba mam największy problem biggrin.gif przydałyby się nieco konkretniejsze wskazówki, coś co pobudzi do myślenia na razie nie wiem w którą stronę iść mimo że problem wydaje się być bardzo podobny do ostatniego nie mam pomysłu jak to ogarnąć.


EDIT.
Ponieważ w js mam już podobna działającą funkcję datepickera próbowałem na podobnej zasadzie dopisać obsługę autocomplete, niestety rezultat nie przyniósł chcianych efektów.

W chwili obecnej to mam:

  1. $('button').on('click', function(event) {
  2. event.preventDefault();
  3. var lines = $('#lines');
  4. var i = 0;
  5. $('input.datepicker').datepicker("destroy");
  6. lines.append(lines.find('li:first-child').clone());
  7. $('.datepicker').each(function () {
  8. $(this).attr("id",'datepicker' + i).datepicker();
  9. i++;
  10. });
  11. });
  12. $('input.datepicker').datepicker();
  13. $( function() {
  14. $( "#datepicker" ).datepicker();
  15. } );
  16.  
  17. // autocomplet : this function will be executed every time we change the text
  18. function autocomplet() {
  19. var min_length = 1; // min caracters to display the autocomplete
  20. var keyword = $('.ingredient').val();
  21. if (keyword.length >= min_length) {
  22. $.ajax({
  23. url: 'ajax_refresh.php',
  24. type: 'POST',
  25. data: {keyword:keyword},
  26. success:function(data){
  27. $('#ingredient_list_id').show();
  28. $('#ingredient_list_id').html(data);
  29. }
  30. });
  31. } else {
  32. $('#ingredient_list_id').hide();
  33. }
  34. }
  35.  
  36. // set_item : this function will be executed when we select an item
  37. function set_item(item) {
  38. // change input value
  39. $('.ingredient').val(item);
  40. // hide proposition list
  41. $('#ingredient_list_id').hide();
  42. }
  43.  


Na próbę jak zrobię tak:

Kod
<li>
     <input type="text" class="ingredient" name="ingredient[]" onkeyup="autocomplet()" autocomplete="off" value=""  />
     <ul id="ingredient_list_id"></ul>
     <input type="text" class="datepicker" name="deliverydate[]" autocomplete="off" value=""  />
</li>
<li>
     <input type="text" class="ingredient" name="ingredient[]" onkeyup="autocomplet2()" autocomplete="off" value=""  />
     <ul id="ingredient_list_id"></ul>
     <input type="text" class="datepicker" name="deliverydate[]" autocomplete="off" value=""  />
</li>


i

Kod
$('button').on('click', function(event) {
event.preventDefault();
var lines = $('#lines');
var i = 0;
$('input.datepicker').datepicker("destroy");
lines.append(lines.find('li:first-child').clone());
$('.datepicker').each(function () {
$(this).attr("id",'datepicker' + i).datepicker();
i++;
});
});
$('input.datepicker').datepicker();
$( function() {
$( "#datepicker" ).datepicker();
} );

   // autocomplet : this function will be executed every time we change the text
function autocomplet() {
    var min_length = 1; // min caracters to display the autocomplete
    var keyword = $('.ingredient').val();
    if (keyword.length >= min_length) {
        $.ajax({
            url: 'ajax_refresh.php',
            type: 'POST',
            data: {keyword:keyword},
            success:function(data){
                $('#ingredient_list_id').show();
                $('#ingredient_list_id').html(data);
            }
        });
    } else {
        $('#ingredient_list_id').hide();
    }
}

function autocomplet2() {
    var min_length = 1; // min caracters to display the autocomplete
    var keyword = $('.ingredient').val();
    if (keyword.length >= min_length) {
        $.ajax({
            url: 'ajax_refresh.php',
            type: 'POST',
            data: {keyword:keyword},
            success:function(data){
                $('#ingredient_list_id').show();
                $('#ingredient_list_id').html(data);
            }
        });
    } else {
        $('#ingredient_list_id').hide();
    }
}

// set_item : this function will be executed when we select an item
function set_item(item) {
    // change input value
    $('.ingredient').val(item);
    // hide proposition list
    $('#ingredient_list_id').hide();
}


Drugi input nie działa, tzn. nie ma podpowiedzi w ogóle, pierwszy input działa normalnie z tym że wybrana opcja pojawia się w wszystkich inputach.
Pyton_000
Zauważ że wszędzie gdzie robisz `$('.ingredient').val();` to zawsze pobiera Ci pierwszy (chyba) input z tą klasą. Musisz to zmienić.

Oczywiście ID elementu MUSI być unikalne więc też musisz dodać zamiast `ingredient_list_id` jakąś unikalną nazwę dla każdego autocomplete.
lustfingers
Dzięki ostatecznie całkowicie usunąłem funkcję autocomplet() i set_item() a użyłem:

  1. $(document).on('input', '.ingredient', function () {
  2. var $input = $(this);
  3. var min_length = 1; // min caracters to display the autocomplete
  4. var keyword = $input.val();
  5. if (keyword.length >= min_length) {
  6. $.ajax({
  7. url: 'ajax_refresh.php',
  8. type: 'POST',
  9. data: {keyword:keyword},
  10. success:function(data){
  11. $input.next('ul').html(data).show();
  12. }
  13. });
  14. } else {
  15. $input.next('ul').hide();
  16. }
  17. });
  18.  
  19. $(document).on('click', '.ingredient + ul > li', function () {
  20. var $list = $(this).closest('ul');
  21. var $input = $list.prev('input');
  22.  
  23. $input.val($(this).data('text'));
  24. $list.hide();
  25. });


Teraz działa tak jak chciałe przynajmniej tak mi sie na razie wydaje wink.gif
viking
Poprobuj w różnych przeglądarkach bo zdarzenie input nie wszędzie działało jeszcze.
lustfingers
Chrome i mozilla ok a generalnie jest to do własnego użytku więc więcej mi nie potrzeba, mam jeszcze jedna sprawę z tym autocomplete ponieważ w chwili obecnej podpowiedzi się wyświetlają aż do momentu gdy:
1. kliknę na wybrana podpowiedź
2. wpiszę tekst którego nie ma w bazie
3. usunę wymagana ilość liter z inputa

więc zaczynając wpisywać wyświetlają się podpowiedzi natomiast chcę aby po kliknięciu gdziekolwiek poza obszarem inputa i podpowiedzi okno podpowiedzi zniknęło.

Gdy zrobię to tak:

  1. $(document).bind('click', function (event) {
  2. if (!($(event.target).is('.ingredient'))) {
  3. $("#ingredient_list_id").remove();
  4. }
  5. });


to okno znika ale dopiero po 2 kliknięciu poza obszarem, oraz już podpowiedzi przestają sie całkowicie pokazywać dla dowolnego inputa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.