• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zmiana string na wartość wybraną z listy

+1 głos
850 wizyt
pytanie zadane 16 grudnia 2022 w JavaScript przez Whereismycode Obywatel (1,710 p.)

Chciałbym zrobić interaktywny input, który po wprowadzeniu @ + litera pokaże listę obecnych osób, a po kliknięciu uzupełni input o daną wartość patrz zdj. poniżej .

Z samym pokazaniem osób nie mam problemu. Do tego wykorzystuję wyrażenie regularne 'RegEx', a samą listę osób pobieram z tablicy. 

Problem pojawia się przy wyborze danej osoby z listy. Gdy uruchamiam funkcję poprzez kliknięcie to raz, że funkcja zaczyna działanie dopiero po dwukrotnym jej wymuszeniu, a dwa to zamiana czy też uzupełnienie brakującej nazwy po kliknięciu w daną osobę.

// co do tego kodu nie jestem pewien czy on działa zgodnie z konspektem 
$(document).on("click", ".find_user div", ()=>{
    let c = $(".find_user div");
    for(let i = 0; i< c.length; i++){
        $(".find_user div#found-"+(i+1)).click(()=>{
            //hide 
            $("#chat_text").val($("#chat_text").val() + $(".find_user div#found-"+(i+1)).text())
        })
    }
})

Uzupełniając: Gdy mam wpisane w input @gre to w sytuacji kiedy kliknę w greg z listy nie wiem zbytnio jak zamienić dane słowo w inpucie o pełną nazwę. 

Trzy: To sytuacja kiedy mam @gre w środku lub na końcu zdania. Gdyby było inaczej to w dużym skrócie zrobiłbym coś w stylu poniższego kodu: 

$("#text").val($("#text").val() + "@" + selected_from_list)

RegEx code: 

var patients = [
    "Greg",
    "Grey",
    "Anna"
];
        function xa(input){
            var re = new RegExp(input+'.+$', 'i');
            let patient = patients.filter(function(e, i, a){
                return e.search(re) != -1;
            });
    
            return patient;
        }

Pytanie dodatkowe: Na wyżej opublikowanym screenshot'cie jest zwyczajny input [text]. W przyszłości chcę wykorzystać contenteditable div, ale nie mogę znaleźć rozwiązania, aby wyłączyć rozciąganie go po naduszeniu przycisku ENTER. Jeśli ktoś ma wiedzę jak zrobić aby div zachowywał się jak zwyczajny input to byłbym wdzięczny 

1
komentarz 16 grudnia 2022 przez VBService Ekspert (256,660 p.)
edycja 16 grudnia 2022 przez VBService

W przyszłości chcę wykorzystać contenteditable div, ale nie mogę znaleźć rozwiązania, aby wyłączyć rozciąganie go po naduszeniu przycisku ENTER. Jeśli ktoś ma wiedzę jak zrobić aby div zachowywał się jak zwyczajny input to byłbym wdzięczny 

Możesz np. przez zdarzenie keydown przypisane do contenteditable div "wyłapać" kiedy został naciśnięty klawisz ENTER i wyłączyć domyślną akcję lub "obsłużyć" po swojemu.

Dawno temu padło tu pytanie o kolorowanie liter w takim contenteditable div-ie i pozostał taki kod, sprawdź to: https://codepen.io/vbservice/pen/ZEWWdLb

1 odpowiedź

+2 głosów
odpowiedź 16 grudnia 2022 przez ScriptyChris Mędrzec (190,170 p.)
wybrane 16 grudnia 2022 przez Whereismycode
 
Najlepsza
$(document).on("click", ".find_user div", ()=>{
    let c = $(".find_user div");
    for(let i = 0; i< c.length; i++){
        $(".find_user div#found-"+(i+1)).click(()=>{
            //hide 
            $("#chat_text").val($("#chat_text").val() + $(".find_user div#found-"+(i+1)).text())
        })
    }
})

Czemu nie ustawisz click event handlera na każdy #found-* od razu, korzystając z selektora atrybutu?

const $chatText = $("#chat_text")
$(document).on("click", ".find_user [id^=found-]", ({ target }) => {
  //hide 
  $chatText.val($chatText.val() + target.text());
})

Bo teraz masz zagnieżdżone click event handlery i pewnie dlatego reakcja jest dopiero na kolejny klik (obstawiam nawet, że przy każdym kolejnym kliku następuje kolejna duplikacja).

Trzy: To sytuacja kiedy mam @gre w środku lub na końcu zdania. Gdyby było inaczej to w dużym skrócie zrobiłbym coś w stylu poniższego kodu: 

Czyli chcesz wyciągać adnotację/ping, gdy @nick-jakiegoś-usera znajduje się w dowolnym miejscu stringa, a nie tylko na początku?

Pytanie dodatkowe: (...) wyłączyć rozciąganie go po naduszeniu przycisku ENTER. Jeśli ktoś ma wiedzę jak zrobić aby div zachowywał się jak zwyczajny input to byłbym wdzięczny 

Nie wiem czy tak się da - wizualnie można by na sztywno ograniczyć wysokość, ale wtedy pewnie zawartość po nowej linii będzie ucinana przez overflow. Może lepiej tutaj użyć textarea?

komentarz 16 grudnia 2022 przez Whereismycode Obywatel (1,710 p.)

Twój kod rozwiązał cały problem. Delikatnie trzeba było go zmienić o :

... 
    $chatText.val($chatText.val() + $(target).text());   
...                                  
1
komentarz 16 grudnia 2022 przez ScriptyChris Mędrzec (190,170 p.)
Czy cały problem to nie wiem, bo ten kod nie uwzględnia sprawdzania na jakiej pozycji w tekście jest adnotacja usera. :P
komentarz 16 grudnia 2022 przez Whereismycode Obywatel (1,710 p.)
Szczerze mówiąc nie wiem dlaczego ale działa. Jeszcze raz dzięki!

Podobne pytania

+1 głos
3 odpowiedzi 1,219 wizyt
pytanie zadane 5 grudnia 2016 w Nasze projekty przez Horace17 Obywatel (1,070 p.)
0 głosów
0 odpowiedzi 143 wizyt
pytanie zadane 14 lutego 2021 w JavaScript przez ProXim Nowicjusz (120 p.)
0 głosów
1 odpowiedź 742 wizyt
pytanie zadane 3 stycznia 2019 w JavaScript przez Whereismycode Obywatel (1,710 p.)

93,786 zapytań

142,748 odpowiedzi

323,418 komentarzy

63,391 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...