Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [JavaScript] Resource do dodawanego elementu HTML, i kilka innych pytań związanych z jQuery.
Adi32
post
Post #1





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Witajcie.

Przejdę do rzeczy:

Mamy powiedzmy akcję ajaxową:
Kod
                $.ajax({
                    type: "POST",
                    url: "index.php?module="+moduleName+"&action=getSearchView&noView=1&field="+val
                }).done(function( data ) {
                    forField.html( data );
                });


Do pola <div class="forField"> zostało wrzuconekolejne pole wyszukiwania. Widok:

Kod
<div class="searchFields">
    <div class="forField">
        <select>Lista pól po których mozna szukac</select>
        <select>Warunki (=|!=|>|<|in|not in itd)</select>
        <input or select or checkbox> Wartość

        <plus i minus> (aby dodać kolejne pole forField takie samo jak to)
    <div/>

    <div class="forField">
    <div/>

    ....
</div>


Tak to mniej więcej wygląda i działa ale mogłoby działać wiele lepiej.

Po pierwsze, nie działa jQuery.live, zalecany jest jQuery.on, ale on nie działa... Przynajmniej tak jak powinien.
<plus i minus> mają .on("click" function(){ ... }) ale te przyciski działają tylko przy tych polach, które są aktualnie wczytane. Nie działają dla tych, których pola zostały wczytane za pomocą przycisku "plus" przy innym polu.

Po drugie, poza akcjami podpiętymi pod plus i minus mam poprzypinane inne akcje tj.
// zapewniam, że składnia w kodzie jest w porządku ($(<input or select or checkbox>) używam tylko dla pokazania ze może tam być różne pole)
$(<input or select or checkbox>).on("keyup || change", function(){....}) też działa tylko dla pierwszego pola, inne pola dodane za pomocą plusa nie działają.

Te pola są dodawane za pomocą AJXA który wkleiłem na samej górze. Jeśli nie da się użyć tego ".on()" normalnie, to może da się zrobić coś takiego:

Kod
                $.ajax({
                    type: "POST",
                    url: "index.php?module="+moduleName+"&action=getSearchView&noView=1&field="+val
                }).done(function( data ) {
                    forField.html( data );
                    initPlusMinus( data );
                    initChangeAndKeyup( data );
                });

ale zmienna"data" to nie referencja do htmlowego obiektu który właśnie został wstawiony tylko zwykły ciąg, string. Jak uzyskać referencje do właśnie wstawionego obiektu htmlowego z danej zmiennej? Biorąc pod uwagę, że może się znajdować nieskończenie wiele dokładnie identycznych pól.

Ten post edytował Adi32 13.05.2013, 11:41:10
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
Arcioch
post
Post #2





Grupa: Zarejestrowani
Postów: 324
Pomógł: 110
Dołączył: 18.09.2012

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


Mógłbyś pokazać jak używasz tego ON w jQuery (IMG:style_emoticons/default/smile.gif) bo coś mi się wydaje, że źle go używasz (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Adi32
post
Post #3





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Cytat(Arcioch @ 13.05.2013, 12:59:28 ) *
Mógłbyś pokazać jak używasz tego ON w jQuery (IMG:style_emoticons/default/smile.gif) bo coś mi się wydaje, że źle go używasz (IMG:style_emoticons/default/smile.gif)

Zapewne chodzi Ci o to, że .on() na elementach dynamicznych używamy w taki sposób:

$(nieDynamicznyElement).on(event, elementDynamiczny, funkcja);

To powiedz mi jak użyć tej konstrukcji jeżeli nie wiemy jakim obiektem będzie element dynamiczny, wiemy jedynie, że będzie to drugi element w obiekcie "forField". Próbowałem tak:

Kod
        $('.forField').each(function(){
            $(this).children().next().on('keyup || change', $(this) , function(){

                var form = $('form[name="search"]');
                var sform = (form.serialize());

                $.ajax({
                    type: "POST",
                    url: "index.php?module="+moduleName+"&action=saveSearchToSession",
                    data: {result: sform}
                }).done(function( data ) {
                    ListView.refreshListTable();
                });

                return false;
            })

        })
Go to the top of the page
+Quote Post
Arcioch
post
Post #4





Grupa: Zarejestrowani
Postów: 324
Pomógł: 110
Dołączył: 18.09.2012

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


Pokaż strukturę html (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Adi32
post
Post #5





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


  1. <form method="post" name="search" action="">
  2.  
  3. <ul>
  4. {if $filter}
  5. {foreach $filter as $fieldName => $fieldNum}
  6. {foreach $fieldNum as $fieldDetails}
  7. <li>
  8. <tr>
  9. <td>
  10. <select class="search" name="">
  11. {foreach $searchFields as $field}
  12. {if $field['name'] == $fieldName}
  13. {assign var="selected" value="selected"}
  14. {else}
  15. {assign var="selected" value=""}
  16. {/if}
  17. <option {$selected} value="{$field['name']}">{$field['vname']}</option>
  18. {/foreach}
  19. </select>
  20. </td>
  21. <td>
  22. <div class="forField">{eval var=$fieldDetails}</div>
  23. </td>
  24. <td>
  25. <div class="quantityManager" style="display: inline;">
  26. <span id="" class="plus"></span>
  27. <span id="" class="minus"></span>
  28. </div>
  29. </td>
  30. </tr>
  31. </table>
  32. </li>
  33.  
  34. {assign var=key value=$key+1}
  35.  
  36. <script type="text/javascript">
  37. maxKey = {$key};
  38. </script>
  39. {/foreach}
  40. {/foreach}
  41. {/if}
  42.  
  43. <li>
  44. <tr>
  45. <td>
  46. <select class="search" name="">
  47. {foreach $searchFields as $field}
  48. <option value="{$field['name']}">{$field['vname']}</option>
  49. {/foreach}
  50. </select>
  51. </td>
  52. <td>
  53. <div class="forField"></div>
  54. </td>
  55. <td>
  56. <div class="quantityManager" style="display: inline;">
  57. <span id="" class="plus"></span>
  58. <span id="" class="minus"></span>
  59. </div>
  60. </td>
  61. </tr>
  62. </table>
  63. </li>
  64.  
  65. </ul>
  66. <input type="submit" name="submit[search]" value="Szukaj" />
  67. <input type="submit" name="clear[search]" value="Wyczyść" />
  68.  
  69. </form>


Search.js:

  1. function Search() {
  2.  
  3. this.init = function() {
  4.  
  5. _this = this;
  6.  
  7. $('select[class="search"]').change(function(){
  8. var val = $(this).val();
  9.  
  10. var forField = $(this).closest('tr').find('.forField');
  11.  
  12. if (val.length) {
  13. $.ajax({
  14. type: "POST",
  15. url: "index.php?module="+moduleName+"&action=getSearchView&noView=1&field="+val
  16. }).done(function( data ) {
  17.  
  18. data = data.replace('{$key}',maxKey);
  19. data = data.replace('{$key}',maxKey);
  20.  
  21. maxKey = maxKey+1;
  22.  
  23. forField.html( data );
  24. // _this.initPlusMinus();
  25. // search.initRefreshList();
  26.  
  27. });
  28. return false;
  29.  
  30. } else {
  31. forField.text('')
  32. }
  33.  
  34. });
  35.  
  36. this.initPlusMinus();
  37. this.initSaveSearch();
  38. this.initLoadSearch();
  39. this.initRefreshList();
  40.  
  41. }
  42.  
  43. this.initPlusMinus = function() {
  44. $('span.plus').on('click',function(){
  45. var li = $(this).closest('li');
  46. var ul = $(li).closest('ul');
  47.  
  48. var newTr = $(li).clone();
  49. newTr.removeAttr('id');
  50.  
  51. $(ul).append(newTr);
  52.  
  53. });
  54.  
  55. $('span.minus').on('click',function(){
  56. $(this).closest('li').remove();
  57. });
  58. }
  59.  
  60. this.initSaveSearch = function() {
  61.  
  62. _this = this;
  63.  
  64. $('a#saveSearch').click(function(){
  65. var form = $('form[name="search"]');
  66. var sform = (form.serialize());
  67. var name = $('input[name="searchName"]').val();
  68.  
  69. $.ajax({
  70. type: "POST",
  71. url: "index.php?module="+moduleName+"&action=saveSearch",
  72. data: {sform: sform, name: name}
  73. }).done(function( data ) {
  74. // _this.rebuildLoadSavedSearch();
  75. });
  76.  
  77. return false;
  78. });
  79.  
  80. }
  81.  
  82. this.initLoadSearch = function() {
  83.  
  84. _this = this;
  85.  
  86. $('a#loadSearch').click(function(){
  87.  
  88. var searchId = $('select[name="searchLoader"]').val();
  89.  
  90. $.ajax({
  91. type: "POST",
  92. url: "index.php?module="+moduleName+"&action=loadSearch",
  93. data: {searchId: searchId}
  94. }).done(function( data ) {
  95. // alert(data)
  96. location.reload();
  97. });
  98.  
  99. return false;
  100. });
  101. }
  102.  
  103. this.initRefreshList = function() {
  104. _this = this;
  105.  
  106. $('form[name="search"]').on('change || blur', '.forField [name*="search"]:last-child ', function(){
  107. obj = $(this);
  108.  
  109. var form = $('form[name="search"]');
  110. var sform = (form.serialize());
  111. var name = $('input[name="searchName"]').val();
  112.  
  113. $.ajax({
  114. type: "POST",
  115. url: "index.php?module="+moduleName+"&action=saveSearchToSession",
  116. data: {result: sform}
  117. }).done(function( data ) {
  118. ListView.refreshListTable();
  119. });
  120.  
  121. return false;
  122. })
  123.  
  124. // $('.forField').each(function(){
  125. // $(this).children().next().on('keyup || change', $(this) , function(){
  126. // obj = $(this);
  127. //
  128. // var form = $('form[name="search"]');
  129. // var sform = (form.serialize());
  130. // var name = $('input[name="searchName"]').val();
  131. //
  132. // $.ajax({
  133. // type: "POST",
  134. // url: "index.php?module="+moduleName+"&action=saveSearchToSession",
  135. // data: {result: sform}
  136. // }).done(function( data ) {
  137. // ListView.refreshListTable();
  138. // });
  139. //
  140. // return false;
  141. // })
  142. //
  143. // })
  144.  
  145. }
  146.  
  147. this.rebuildLoadSavedSearch = function() {
  148.  
  149. }
  150.  
  151. }
  152.  
  153. $(function(){
  154. search = new Search();
  155. search.init();
  156.  
  157. });


Zrzucik:

(IMG:http://img803.imageshack.us/img803/7476/szukajka.jpg)
Go to the top of the page
+Quote Post
Arcioch
post
Post #6





Grupa: Zarejestrowani
Postów: 324
Pomógł: 110
Dołączył: 18.09.2012

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


Spróbuj tak (IMG:style_emoticons/default/smile.gif) Gdybyś miał to jak spakować i wysłać to bym bardziej mógł pomóc, ponieważ mógłbym po tym przeklinać (IMG:style_emoticons/default/smile.gif)

  1. $('.forField').each(function(){
  2.  
  3. var obj = $(this);
  4.  
  5. $(document).on('keyup || change', obj.children().eq(1) , function(){
  6.  
  7. var form = $('form[name="search"]');
  8. var sform = (form.serialize());
  9.  
  10. $.ajax({
  11. type: "POST",
  12. url: "index.php?module="+moduleName+"&action=saveSearchToSession",
  13. data: {result: sform}
  14. }).done(function( data ) {
  15. ListView.refreshListTable();
  16. });
  17.  
  18. return false;
  19. })
  20.  
  21. });
Go to the top of the page
+Quote Post
Adi32
post
Post #7





Grupa: Zarejestrowani
Postów: 348
Pomógł: 26
Dołączył: 8.10.2008
Skąd: Lublin

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


Zrobiłem (IMG:style_emoticons/default/smile.gif)

Kod
    this.initRefreshList = function() {
        _this = this;
        
        $('form[name="search"]').on('change || blur', '.forField [name*="search"] ', function(){
            obj = $(this);

            var form = $('form[name="search"]');
            var sform = (form.serialize());

            $.ajax({
                type: "POST",
                url: "index.php?module="+moduleName+"&action=saveSearchToSession",
                data: {result: sform}
            }).done(function( data ) {
                ListView.refreshListTable();
            });

            return false;
        });
        
    }


' obj.children().eq(1) ' raczej by nie przeszło, zdaje mi się, że w tym miejscu dostępna jest tylko stringowa ścieżka jak w CSS.
Go to the top of the page
+Quote Post

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: 23.08.2025 - 18:25