Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JavaScript]Event click w pętli, Coffee script
MateuszS
post 16.09.2015, 13:01:28
Post #1





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Hej,

Mam problem z eventem click na buttonie, ktory jest w pętli. Tu fragment kodu (coffee script)

[JAVASCRIPT] pobierz, plaintext
  1. for index of shelfs
  2. shelf = shelfs[index]
  3. content = 'Empty shelf '+ shelf.getId()
  4. $(@).append('<input type="button" style="width: 100%; height: 40px" class="input_button" value="'+content+'" /><br />')
  5. button = $(@).find('input').last()
  6.  
  7. parent = $(@)
  8. button.click ->
  9. console.log(button.val())
[JAVASCRIPT] pobierz, plaintext


Za kazdym razem wyswietla mi value ostatniego buttona zamiast kolejnych. Wiecie jak to obejsc?

Pozdrawiam


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
nospor
post 16.09.2015, 13:05:44
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




console.log(button.val())
Poniewaz wartosc button jest nadpisywana w petli i na jej koncu zawiera wartosc ostatniego elementu ktory byl do niej przypisany


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Comandeer
post 16.09.2015, 13:08:00
Post #3





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


A do jakiego to kodu jest kompilowane? Bo wygląda tak, jakby button był wyciągnięty poza pętlę (CS to lubi) i tym samym każda iteracja ją nadpisuje. W czystym JS po prostu zawartość pętli otacza się w IIFE. W nowym JS (ES6) po prostu wystarczyłoby zadeklarować button przez słowo kluczowe let, a nie var wewnątrz pętli.


--------------------
Go to the top of the page
+Quote Post
MateuszS
post 16.09.2015, 13:13:31
Post #4





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 16.09.2015, 14:05:44 ) *
console.log(button.val())
Poniewaz wartosc button jest nadpisywana w petli i na jej koncu zawiera wartosc ostatniego elementu ktory byl do niej przypisany


Tak, tego się domyśliłem, ale nie jest to u mnie porządane zachowanie

@Comandeer

[JAVASCRIPT] pobierz, plaintext
  1. for (index in shelfs) {
  2. shelf = shelfs[index];
  3. content = 'Empty shelf ' + shelf.getId();
  4.  
  5. $(this).append('<input type="button" style="width: 100%; height: 40px" class="input_button" value="' + content + '" /><br />');
  6. button = $(this).find('input').last();
  7. parent = $(this);
  8. results.push(button.click(function() {
  9. console.log(button.val());
  10.  
  11. }));
[JAVASCRIPT] pobierz, plaintext


Ten post edytował MateuszS 16.09.2015, 13:13:41


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
nospor
post 16.09.2015, 13:22:22
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Czemu nei zrobisz poprostu:

console.log(this.value);
? Przeciez pod this masz aktualny element


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
MateuszS
post 16.09.2015, 13:27:57
Post #6





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 16.09.2015, 14:22:22 ) *
Czemu nei zrobisz poprostu:

console.log(this.value);
? Przeciez pod this masz aktualny element



Ajj moja pomyłka, miał być console.log(shelf.getId()). Z buttonem owszem this działa ale shelf jest nadpisywany.


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
nospor
post 16.09.2015, 13:33:42
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




shelf = shelfs[index];
To jest zmienna globalna i poraz kolejny nadpisywana.

sprobuj:
var shelf = shelfs[index]; //zmienna lokalna


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
MateuszS
post 16.09.2015, 13:37:42
Post #8





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Próbowałem zmienić to w .js i to też nie pomogło:

[JAVASCRIPT] pobierz, plaintext
  1. for (index in shelfs) {
  2. var shelf = shelfs[index];
  3. var content = 'Empty shelf ' + shelf.getId();
  4. $(this).append('<input type="button" style="width: 100%; height: 40px" class="input_button" value="' + content + '" /><br />');
  5. var button = $(this).find('input').last();
  6. var parent = $(this);
  7. results.push(button.click(function() {
  8. console.log(console.log(shelf.getId());
[JAVASCRIPT] pobierz, plaintext


Niestety coffee script wyrzuca mi zawsze deklaracje zmiennych "piętro" wyżej i nie bardzo wiem czy da się to jakoś przestawić. Ale tak czy siak niestety nie pomaga.

//edit, moze daloby sie jakos przez parametr clicka przeslac tego shelfa? Bo pewnie onClick w inpucie by przeszlo ale nie jest to eleganckie, moze jakis trigger wywolam z parametrem?

Ten post edytował MateuszS 16.09.2015, 13:40:37


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
nospor
post 16.09.2015, 13:40:13
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




chcesz tylko dobrac sie do tego ID? To dopisuj go jako atrybuj dla inputa i pobieraj na podobnej zasadzie co this.value. I po sprawie


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Comandeer
post 16.09.2015, 13:41:05
Post #10





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


Kod
for (index in shelfs) {
    (function(shelf)
    {
        var content = 'Empty shelf ' + shelf.getId();
        $(this).append('<input type="button" style="width: 100%; height: 40px" class="input_button" value="' + content + '" /><br />');
        var button = $(this).find('input').last();
        var parent = $(this);
        button.click(function() {
            console.log(console.log(shelf.getId());
        });
    }(shelfs[index]));
}

?


--------------------
Go to the top of the page
+Quote Post
MateuszS
post 16.09.2015, 13:42:57
Post #11





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Cytat(nospor @ 16.09.2015, 14:40:13 ) *
chcesz tylko dobrac sie do tego ID? To dopisuj go jako atrybuj dla inputa i pobieraj na podobnej zasadzie co this.value. I po sprawie


ten shelf jest obiektem, czasami bede potrzebowal rzeczy z "wyzej". Obiektu nie zapisze do atrybuta bez jakiejs serializacji a to chyba nie jest dobre rozwiazanie. Fajnie byloby tego clicka wywolac jakos z parametrem cos jak w onClick

Cytat(Comandeer @ 16.09.2015, 14:41:05 ) *
Kod
for (index in shelfs) {
    (function(shelf)
    {
        var content = 'Empty shelf ' + shelf.getId();
        $(this).append('<input type="button" style="width: 100%; height: 40px" class="input_button" value="' + content + '" /><br />');
        var button = $(this).find('input').last();
        var parent = $(this);
        button.click(function() {
            console.log(console.log(shelf.getId());
        });
    }(shelfs[index]));
}

?


to kod JSowy, jak to zapisac w coffee? To zadziala?


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
nospor
post 16.09.2015, 13:43:12
Post #12





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
ten shelf jest obiektem, czasami bede potrzebowal rzeczy z "wyzej"
To zapisuj index tego obiektu z tablicy. I po sprawie. Mnozysz problemy tongue.gif


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Comandeer
post 16.09.2015, 13:47:54
Post #13





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


https://realguess.net/2014/03/03/immediatel...n-coffeescript/ → tak by to wyglądało w CS.


--------------------
Go to the top of the page
+Quote Post
MateuszS
post 16.09.2015, 14:01:13
Post #14





Grupa: Zarejestrowani
Postów: 1 429
Pomógł: 195
Dołączył: 6.10.2008
Skąd: Kraków/Tomaszów Lubelski

Ostrzeżenie: (0%)
-----


Cytat(Comandeer @ 16.09.2015, 14:47:54 ) *


No wlasnie nie za dobrze mi kompiluje. Początek się zgadza

(shelf) ->

natomiast mam problem z przekazaniem argumentu. Gdy wklepię kod na sztywno do JS to wywala mi

Uncaught TypeError: Cannot read property 'createDocumentFragment' of undefined


--------------------
O! Zimniok :P
Go to the top of the page
+Quote Post
Comandeer
post 16.09.2015, 19:52:50
Post #15





Grupa: Zarejestrowani
Postów: 1 268
Pomógł: 254
Dołączył: 11.06.2009
Skąd: Świętochłowice

Ostrzeżenie: (0%)
-----


Prawdę mówiąc nie bardzo wiem czego ten błąd dotyczy… Czyżby chodziło o $.fn.append?


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 09:06