Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak podpiąć js do elementu pobranego za pomocą ajax'a
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
NickOver
Cześć.
Mam problem z podpinaniem js'ów do elementów pobieranych ajaxowo. Dobry przykład jest z dropzone.js
Pobieram część strony za pomocą ajax'a. Na końcu jest skrypt:
  1. Dropzone.options.myAwesomeDropzone = {
  2. autoProcessQueue: true,
  3. uploadMultiple: true,
  4. parallelUploads: 100,
  5. maxFiles: 100,
  6. init: function() {
  7. var myDropzone = this;
  8.  
  9. this.element.querySelector("button[type=submit]").addEventListener("click", function(e) {
  10. e.preventDefault();
  11. e.stopPropagation();
  12. myDropzone.processQueue();
  13. });
  14. this.on("sendingmultiple", function() {
  15. });
  16. this.on("successmultiple", function(files, response) {
  17. });
  18. this.on("errormultiple", function(files, response) {
  19. });
  20. }
  21.  
  22. }

Próbowałem dać bez document ready ale też nie działało.
Comandeer
Zdarzenia można przypiąć tylko do istniejących elementów. Dlatego w Twoim wypadku musisz przypinać dropzone'y przy każdym zakończeniu żądania ajaksowego.
NickOver
Tak, wiem o tym. Mój problem polega na tym iż skrypt jest na końcu zawartości widoku który ajax mi zwraca, tj:
  1. <div class="col-md-8">
  2. <div class="ibox float-e-margins">
  3. <div class="ibox-title">
  4. <h5>Dodaj nowe zadanie</h5>
  5. <div class="ibox-tools">
  6.  
  7. </div>
  8. </div>
  9. <div class="ibox-content">
  10. <form method="get" class="form-horizontal">
  11. <div class="form-group"><label class="col-sm-2 control-label">Nazwa: </label>
  12.  
  13. <div class="col-sm-10"><input type="text" class="form-control"></div>
  14. </div>
  15. <div class="hr-line-dashed"></div>
  16. <div class="form-group"><label class="col-sm-2 control-label">Opis: </label>
  17. <div class="col-sm-10">
  18. <textarea class="form-control" rows="10"></textarea>
  19. </div>
  20. </div>
  21. <div class="hr-line-dashed"></div>
  22. <form id="my-awesome-dropzone" class="dropzone" action="#">
  23. <div class="dropzone-previews"></div>
  24. <button type="submit" class="btn btn-primary pull-right">xXx</button>
  25. </form>
  26. <div class="hr-line-dashed"></div>
  27. <div class="form-group">
  28. <div class="col-sm-4 col-sm-offset-2">
  29. <button class="btn btn-white" type="submit">Anuluj</button>
  30. <button class="btn btn-primary" type="submit">Dodaj</button>
  31. </div>
  32. </div>
  33. </form>
  34. </div>
  35. </div>
  36. </div>
  37. <div class="col-md-4">
  38. <div class="ibox float-e-margins">
  39. <div class="ibox-title">
  40. <h5>Komunikacja</h5>
  41. <div class="ibox-tools">
  42. <a class="collapse-link binded">
  43. <i class="fa fa-chevron-up"></i>
  44. </a>
  45. <a class="dropdown-toggle" data-toggle="dropdown" href="#">
  46. <i class="fa fa-wrench"></i>
  47. </a>
  48. <ul class="dropdown-menu dropdown-user">
  49. <li><a href="#">Config option 1</a>
  50. </li>
  51. <li><a href="#">Config option 2</a>
  52. </li>
  53. </ul>
  54. <a class="close-link binded">
  55. <i class="fa fa-times"></i>
  56. </a>
  57. </div>
  58. </div>
  59. <div class="ibox-content">
  60. <div>
  61. <div class="feed-activity-list">
  62. <div class="feed-element">
  63. <div class="media-body form-group">
  64. <textarea class="form-control" placeholder="Wiadomość"></textarea>
  65. <div class="pull-right">
  66. <button type="button" class="btn btn-xs btn-primary" style="margin-top: 5px;">Wyślij wiadomość</button>
  67. </div>
  68. </div>
  69. </div>
  70. </div>
  71. <button class="btn btn-primary btn-block m-t"><i class="fa fa-arrow-down"></i> Show More</button>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. Dropzone.options.myAwesomeDropzone = {
  77. autoProcessQueue: true,
  78. uploadMultiple: true,
  79. parallelUploads: 100,
  80. maxFiles: 100,
  81. init: function() {
  82. var myDropzone = this;
  83.  
  84. this.element.querySelector("button[type=submit]").addEventListener("click", function(e) {
  85. e.preventDefault();
  86. e.stopPropagation();
  87. myDropzone.processQueue();
  88. });
  89. this.on("sendingmultiple", function() {
  90. });
  91. this.on("successmultiple", function(files, response) {
  92. });
  93. this.on("errormultiple", function(files, response) {
  94. });
  95. }
  96.  
  97. }

Dodam że ten sam problem mam przy np: http://abpetkov.github.io/switchery/
Comandeer
Bo Ajax takich skryptów nie wykonuje. Musiałbyś parsować odpowiedź, wyciągać te skrypty i odpalać przez eval… albo zmienić sposób zwracania odpowiedzi i kod js przerzucić do miejsca, z którego żądania wykonujesz
NickOver
Ok. Przerobiłem wszystko w taki sposób aby zwracał mi json'a z tablicą:
-page - zawartość jaka ma się wyświetlić - działa bez problemu.
-script - skrypt js'owy i tu zaczynają się schody ponieważ nadal to nie działa.
Gdy dam console.log('asd'); jest ok, ale przy skrypcie z posta wcześniej nic nie działa. Dumpując co zwraca po eval mam obiekt, niestety i tak nie jest on podpinany. Pierwsza moja myśli to że jednocześnie to wszystko odpala, tj. w tym samym momencie przez co tworzy się ten obiekt, ale nie podpina się pod id więc dałem wszystko w
  1. setTimeout(skrypt, 3000);
, niestety to nie pomogło. Następnie wszystko wrzuciłem w funkcję którą chciałem odpalić z konsoli. Niestety chcąc odpalić ją z konsoli dostałem "is not defined". Może jeszcze wrzucę skrypt który jest odpowiedzialny za obsługę tego jsona:
  1. $("body").on("click", ".ajax-menu", function(e){
  2. e.preventDefault();
  3. var url = $(this).attr('href');
  4. $.ajax({
  5. method: "POST",
  6. url: url,
  7. })
  8. .done(function(json){
  9. data = $.parseJSON(json);
  10. $('.page-content').html(data.page);
  11. eval(data.script);
  12. });
  13. });

Mógłby mi ktoś powiedzieć co robię źle?
trueblue
Czy data.script zawiera znaczniki <script>?
NickOver
Nie
trueblue
A zwykły alert w kodzie w data.script? Działa?
Comandeer
A dropzone.js jest dołączany gdzieś po drodze?

Tak se myślę czy nie da się ominąć eval przy pomocy dynamicznie stworzonego script, hm
NickOver
Cytat(trueblue @ 17.11.2015, 18:17:58 ) *
A zwykły alert w kodzie w data.script? Działa?

Tak.

Cytat(Comandeer @ 17.11.2015, 18:25:10 ) *
A dropzone.js jest dołączany gdzieś po drodze?

Tak se myślę czy nie da się ominąć eval przy pomocy dynamicznie stworzonego script, hm

Tak. dropzone.js jest ładowany razem ze stroną.
trueblue
A alert w metodzie init DropZone działa?
Wygląda na to, jakbyś nie incjalizował tego modułu. To co robisz to tylko ustawienia opcji (co prawda jest tam metoda init, ale wywoływana przy nadrzędnej inicjalizacji, coś ala onload).
NickOver
Ok, ogarnąłem w czym jest problem. Mianowicie plik jest jednocześnie wyzwalaczem (co jest według mnie bez sensu, taka mała dygresja). Wyrzuciłem pobieranie tego pliku, teraz pobiera go jquerowe getScript(), niestety to nadal nie rozwiązuje problemu. Funkcja zwraca mi sukces, ale nadal nie chce się podpiąć. Niezrażony próbami wrzuciłem pobrany plik w eval();, niestety nieskutecznie. Ale zauważyłem że mam formularz w formularzu. Usunąłem więc jeden, ale i to nie przyniosło rezultatu (z eval i bez niego na zmiennej ze skryptem) Macie jeszcze jakieś pomysły? A może znacie godny polecenia plugin do wrzucania plików "drag & drop"?
trueblue
Czyli jest właśnie tak, że fragment, który podałeś odpowiada tylko za parametry, a sama inicjalizacja zaszła już wcześniej.

Czy czasem ta opcja nie jest użyteczna:
// Disable auto discover for all elements:
Dropzone.autoDiscover = false;
?

Lub .disable(), obecny skrypt (ustawienie opcji), enable().
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.