Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Java][AJAX]Ajax Live nie działa Tooltip oraz toggle
casperii
post 9.05.2017, 23:38:21
Post #1





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


Panowie, wczytuje wyniki poprzez ajax na stronę, lecz nie działa w wynikach dialog czy tooltip.
  1. function search() {
  2. var value = $('input#name').val();
  3. if(value !== ''){
  4. $.ajax({
  5. type: "POST",
  6. url: "/ajaxSearch.php",
  7. data: { query: value },
  8. cache: false,
  9. success: function(html){
  10. $("#table").html(html);
  11. }
  12. });
  13. }return false;
  14. }


poza pobraniem wyników poprzez ajax tooltip czy toggle działa bez problemów, konsola też nic nie wywala.

Problem rozwiązany w połowie, dla tooltip wystarczy zrobić:
  1. $(document).on('mouseover',function () {
  2. $("[data-toggle=tooltip]").tooltip();
  3. });


ale dla toggle() problem pozostaje dalej.

Ten post edytował casperii 10.05.2017, 00:25:50
Go to the top of the page
+Quote Post
bostaf
post 10.05.2017, 09:23:10
Post #2





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Dla toggle() teoretycznie tak samo, ale jeśli działa przed przeładowaniem tabeli ajaxem a po nie działa, to być może html który dostajesz w ajaxSearch.php nie jest spójny z tym, który generowany jest przy pierwszym załadowaniu strony. Może jakieś id mają inne nazwy...
Go to the top of the page
+Quote Post
casperii
post 10.05.2017, 21:24:28
Post #3





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@bostaf po wczytaniu HTMLa poprzez ajaxa dane są takie same ID etc.

może problem polega w tym, że te dane są tak jakby z zewnątrz wczytywane ?

poniżej kod JS dla toggle:
  1. var uiDropdown = new function() {
  2. var self;
  3. self = this;
  4. this.hideDialog = function($el) {
  5. return $el.find(".dialog").hide().removeClass("is-visible");
  6. };
  7. this.showDialog = function($el) {
  8. return $el.find(".dialog").show().addClass("is-visible");
  9. };
  10. return this.initialize = function() {
  11. $("html").click(function() {
  12. $(".ui-dropdown .head").removeClass("active");
  13. return self.hideDialog($(".ui-dropdown"));
  14. });
  15. $(".ui-dropdown .body").click(function(e) {
  16. return e.stopPropagation();
  17. });
  18. return $(".ui-dropdown").each(function(index, el) {
  19. return $(el).click(function(e) {
  20. e.stopPropagation();
  21. $(el).find(".head").toggleClass("active");
  22. if ($(el).find(".head").hasClass("active")) {
  23. return self.showDialog($(el));
  24. } else {
  25. return self.hideDialog($(el));
  26. }
  27. });
  28. });
  29. };
  30. };


ale nijak nie mogę tego ugryźć.
Go to the top of the page
+Quote Post
bostaf
post 11.05.2017, 15:25:17
Post #4





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Cytat(casperii @ 10.05.2017, 22:24:28 ) *
może problem polega w tym, że te dane są tak jakby z zewnątrz wczytywane ?

Tak. Tutaj to jest wyjaśnione:
Cytat
Delegated events have the advantage that they can process events from descendant elements that are added to the document at a later time.


I gdzieś widziałem zalecenie, żeby zamiast starych eventhandlerów "click", "keydown", ... używać on(), tak jak to zrobiłeś z tooltipem. Chociażby dlatego, że radzą sobie z elementami dodawanymi dynamicznie.
Go to the top of the page
+Quote Post
casperii
post 11.05.2017, 18:51:05
Post #5





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@bostaf zmiana na :
  1. $(document).on('click',function(event) {
  2.  
  3. });


nic nie daje. Jakiś inny pomysł?
Go to the top of the page
+Quote Post
viking
post 11.05.2017, 19:02:54
Post #6





Grupa: Zarejestrowani
Postów: 6 378
Pomógł: 1116
Dołączył: 30.08.2006

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


Ale co konkretnie zastępujesz bo w kodzie wyżej nie widać wywołania toggle. Jeśli podmieniasz cały html to wszystkie przypięte zdarzenia przestaną działać.
https://prophp.pl/article/15/jquery%2C_zdar...e_metoda_%24.on


--------------------
Go to the top of the page
+Quote Post
casperii
post 11.05.2017, 19:14:09
Post #7





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@viking na stronie mam 10 rekordów po kliknięciu w nie jest wszystko w porządku, następnie w wyszukiwarkę wpisuje frazę, rekordy są wczytywane poprzez ajaxa i tu zero reakcji, spoglądając w kod źródłowy wydaje się , że wszystko jest tak samo.

kod odpowiedzialny za uruchomienie toggle/dialog:

  1. var uiDropdown = new function() {
  2. var self;
  3. self = this;
  4. this.hideDialog = function($el) {
  5. return $el.find(".dialog").hide().removeClass("is-visible");
  6. };
  7. this.showDialog = function($el) {
  8. return $el.find(".dialog").show().addClass("is-visible");
  9. };
  10. return this.initialize = function() {
  11. $("html").on('click', function() {
  12. $(".ui-dropdown .head").removeClass("active");
  13. return self.hideDialog($(".ui-dropdown"));
  14. });
  15. $(".ui-dropdown .body").on('click', function(e) {
  16. return e.stopPropagation();
  17. });
  18. return $(".ui-dropdown").each(function(index, el) {
  19. return $(el).on('click', function(e) {
  20. e.stopPropagation();
  21. $(el).find(".head").toggleClass("active");
  22. if ($(el).find(".head").hasClass("active")) {
  23. return self.showDialog($(el));
  24. } else {
  25. return self.hideDialog($(el));
  26. }
  27. });
  28. });
  29. };
  30. };
  31.  
  32. new uiDropdown();



Go to the top of the page
+Quote Post
bostaf
post 11.05.2017, 19:15:39
Post #8





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


@viking toggleClass tam ma

@casperii
  1. return $(el).click(function(e) {

zmień na
  1. return $(el).on("click", function(e) {

Go to the top of the page
+Quote Post
casperii
post 11.05.2017, 19:18:22
Post #9





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@bostaf zobacz post przed dodaniem swojego posta:) JS został zedytowany.
Go to the top of the page
+Quote Post
bostaf
post 11.05.2017, 19:29:30
Post #10





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Cytat(casperii @ 11.05.2017, 20:18:22 ) *
@bostaf zobacz post przed dodaniem swojego posta:) JS został zedytowany.

Niom, w tym samym czasie rzeźbiliśmy smile.gif

Ciekawe to, a byłbyś w stanie spreparować fidla żeby zobaczyć co tam się dzieje. Fidla bez ajaxa, tak żeby chociaż mieć lepsze wyobrażenie o strukturze.
Go to the top of the page
+Quote Post
casperii
post 11.05.2017, 21:01:47
Post #11





Grupa: Zarejestrowani
Postów: 681
Pomógł: 28
Dołączył: 14.08.2014

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


@bostaf podesłałem na PW link do działającego triala, by tu nie spamować.
Go to the top of the page
+Quote Post
bostaf
post 12.05.2017, 23:48:49
Post #12





Grupa: Zarejestrowani
Postów: 374
Pomógł: 79
Dołączył: 6.04.2010
Skąd: Ostrów Wielkopolski

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


Problem rozwiązany.
Dosyć długi kod został zdefiniowany jako osobna funkacja, która następnie została wywołana osobno dla oryginalnego dokumentu jak i tego zmienionego dynamicznie:
[JAVASCRIPT] pobierz, plaintext
  1. function mojaFunkcja () {
  2. // cały długi kod, który nie hulał po ajaxie
  3. }
  4. $(document).ready(function() {mojaFunkcja();});
  5. $(document).ajaxStop(function() {mojaFunkcja();});
[JAVASCRIPT] pobierz, plaintext

document.ready oddziałuje tylko na elementy utworzone przed jego wywołaniem, a zatem nie uwzględnia tych utworzonych dynamicznie (np ajaxem), a ajaxStop operuje tylko na elementach dodanych dynamicznie. Stąd konieczność dwóch wywołań całego kodu.
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: 12.07.2025 - 18:59