• 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

Object Storage Arubacloud
+1 głos
297 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 (253,280 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,190 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,190 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 533 wizyt
pytanie zadane 5 grudnia 2016 w Nasze projekty przez Horace17 Obywatel (1,070 p.)
0 głosów
0 odpowiedzi 66 wizyt
pytanie zadane 14 lutego 2021 w JavaScript przez ProXim Nowicjusz (120 p.)
0 głosów
1 odpowiedź 434 wizyt
pytanie zadane 3 stycznia 2019 w JavaScript przez Whereismycode Obywatel (1,710 p.)

92,565 zapytań

141,417 odpowiedzi

319,601 komentarzy

61,950 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...