Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Jak podpiąć js do elementu pobranego za pomocą ajax'a
NickOver
post 16.11.2015, 19:26:31
Post #1





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

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


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.
Go to the top of the page
+Quote Post
Comandeer
post 16.11.2015, 20:48:38
Post #2





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

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


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.


--------------------
Go to the top of the page
+Quote Post
NickOver
post 17.11.2015, 15:16:17
Post #3





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

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


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/

Ten post edytował NickOver 17.11.2015, 15:18:34
Go to the top of the page
+Quote Post
Comandeer
post 17.11.2015, 16:26:22
Post #4





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

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


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


--------------------
Go to the top of the page
+Quote Post
NickOver
post 17.11.2015, 17:55:53
Post #5





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

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


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?

Ten post edytował NickOver 17.11.2015, 17:59:08
Go to the top of the page
+Quote Post
trueblue
post 17.11.2015, 18:12:18
Post #6





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

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


Czy data.script zawiera znaczniki <script>?


--------------------
Go to the top of the page
+Quote Post
NickOver
post 17.11.2015, 18:13:31
Post #7





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

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


Nie
Go to the top of the page
+Quote Post
trueblue
post 17.11.2015, 18:17:58
Post #8





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

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


A zwykły alert w kodzie w data.script? Działa?


--------------------
Go to the top of the page
+Quote Post
Comandeer
post 17.11.2015, 18:25:10
Post #9





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

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


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


--------------------
Go to the top of the page
+Quote Post
NickOver
post 17.11.2015, 18:32:39
Post #10





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

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


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ą.
Go to the top of the page
+Quote Post
trueblue
post 17.11.2015, 19:01:51
Post #11





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

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


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).

Ten post edytował trueblue 17.11.2015, 19:39:27


--------------------
Go to the top of the page
+Quote Post
NickOver
post 17.11.2015, 20:55:01
Post #12





Grupa: Zarejestrowani
Postów: 332
Pomógł: 10
Dołączył: 13.03.2014
Skąd: Bydgoszcz

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


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"?
Go to the top of the page
+Quote Post
trueblue
post 17.11.2015, 21:26:00
Post #13





Grupa: Zarejestrowani
Postów: 6 799
Pomógł: 1827
Dołączył: 11.03.2014

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


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().


--------------------
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: 13.06.2025 - 03:04