Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript] Resource do dodawanego elementu HTML
Forum PHP.pl > Forum > Po stronie przeglądarki
Adi32
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.
Arcioch
Mógłbyś pokazać jak używasz tego ON w jQuery smile.gif bo coś mi się wydaje, że źle go używasz smile.gif
Adi32
Cytat(Arcioch @ 13.05.2013, 12:59:28 ) *
Mógłbyś pokazać jak używasz tego ON w jQuery smile.gif bo coś mi się wydaje, że źle go używasz 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;
            })

        })
Arcioch
Pokaż strukturę html smile.gif
Adi32
  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:

Arcioch
Spróbuj tak smile.gif Gdybyś miał to jak spakować i wysłać to bym bardziej mógł pomóc, ponieważ mógłbym po tym przeklinać 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. });
Adi32
Zrobiłem 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.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.