Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JQuery] Wytłumaczcie mi dlaczego to działa w ten sposób.
korro
post
Post #1





Grupa: Zarejestrowani
Postów: 259
Pomógł: 42
Dołączył: 8.04.2005
Skąd: Mława

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


Witam.
Robię dynamiczny formularz z użyciem JQuery.
Kod wygląda tak:
Szablon HTML:
  1. <textarea style="display:none" id="departments">
  2.    <tr id="departments_tr_{0}">
  3.        <td>{0}
  4.            <select name="departments_{0}">
  5.                <option value="">[choose department]</option>
  6.                <?php
  7.                $depts = $db->getDepartments();
  8.                foreach ($depts as $depts_row) {
  9.                    echo '<option value="'.$depts_row[0].'">'.$depts_row[1].'</option>'."\n";
  10.                }
  11.                ?>
  12.           </select>
  13.        </td>
  14.        <td>
  15.            <a href="#" ><img id="deleteDepartmentLine_{0}" border="0" src="images/minus.png"></a>
  16.        </td>
  17.   </tr>
  18. </textarea>


Niedziałający kod JS:
  1. <?php
  2. var templateDepartments = jQuery.format($("#departments").val());
  3.        var depts_id = 1;
  4.        function addDepartment() {
  5.            depts_id++;
  6.            $(templateDepartments(depts_id)).appendTo("#approvalLine tbody");
  7.            $("#deleteDepartmentLine_" + depts_id).click(function(){
  8.                $("#departments_tr_" +  depts_id).remove();
  9.            });
  10.          
  11.        }
  12.        $("#addDepartmentLine").click(addDepartment);
  13. ?>


Działający kod JS:
  1. <?php
  2. var templateDepartments = jQuery.format($("#departments").val());
  3.        var depts_id = 1;
  4.        function addDepartment() {
  5.            var r = depts_id++;
  6.            $(templateDepartments(r)).appendTo("#approvalLine tbody");
  7.            $("#deleteDepartmentLine_" + r).click(function(){
  8.                $("#departments_tr_" +  r).remove();
  9.            });
  10.          
  11.        }
  12.        $("#addDepartmentLine").click(addDepartment);
  13. ?>


Różnica polega na tym, że przepisuję zmienną i do zdarzeń używam przepisanej.
Pisząc 'nie działa' mam na myśli to, że wartość depts_id nie jest doklejana do nazwy elementu w momencie deklaracji, tylko w momencie zdarzenia.
Czyli: klikając na dowolny guzik minus usunie się tylko ostatnio wstawiony wiersz.

Z góry dzięki za pomysły.

Ten post edytował korro 17.03.2009, 18:27:15
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
korro
post
Post #2





Grupa: Zarejestrowani
Postów: 259
Pomógł: 42
Dołączył: 8.04.2005
Skąd: Mława

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


Niezupełnie.
Ten przykład z var r działa w oczekiwany sposób.

W pierwszym przykładzie tak jak napisałem wcześniej.
Wygląda na to, że dla każdego
  1. <?php
  2. $("#departments_tr_" +  depts_id).remove();
  3. ?>
selektor jest równy maksymalnej wartości depts_id.

Ten post edytował korro 17.03.2009, 19:41:45
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #3





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Cytat(korro @ 17.03.2009, 19:40:55 ) *
Niezupełnie.
Ten przykład z var r działa w oczekiwany sposób.

W pierwszym przykładzie tak jak napisałem wcześniej.
Wygląda na to, że dla każdego
  1. <?php
  2. $("#departments_tr_" +  depts_id).remove();
  3. ?>
selektor jest równy maksymalnej wartości depts_id.


1. powcinaj kod prawidlowo - nie wprowadza wtedy tyle zamieszania
2.
  1. <?php
  2. var templateDepartments = jQuery.format($("#departments").val());
  3. var depts_id = 1; // zmienna globalna
  4. function addDepartment() {
  5.   depts_id++; // zmienna globalna
  6.   $(templateDepartments(depts_id)).appendTo("#approvalLine tbody");
  7.   $("#deleteDepartmentLine_" + depts_id).click(function(){
  8. // tworzysz fukcje == tworzy sie domkniecie, tzn 'depts_id' to to samo co zmienna globalna..
  9.       $("#departments_tr_" +  depts_id).remove(); // ... wartosc depts_id jest wczytywana w momencie wykonywania tej linijki
  10. // czyli dodasz kilka departametnow => depts_id bedzie powiedzmy 5, i depts_id wewnatrz tej funkcji odwoluje sie do tej samej zmiennej czyli tez ma wartosc 5
  11. // zrobienie: var r = depts_id wewnatrz addDepartment() tworzy zmienna lokalna, dalej: handler click() laczy sie znowu z ta zmienna, ale tym
  12. // razem ona jest lokalna i zostanie usunieta (wewnatrz handlera pozostanie nietknieta) wraz z koncem funkcji addDepartment(), jako ze nie
  13. // jest globalna i nigdzie indziej jej nie modyfikujesz to wszytko jest ok
  14.   });
  15.  
  16. }
  17. $("#addDepartmentLine").click(addDepartment);
  18. ?>
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 11.10.2025 - 05:10