Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Java][AJAX]Ajax Live nie działa Tooltip oraz toggle
Forum PHP.pl > Forum > Przedszkole
casperii
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.
bostaf
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...
casperii
@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źć.
bostaf
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.
casperii
@bostaf zmiana na :
  1. $(document).on('click',function(event) {
  2.  
  3. });


nic nie daje. Jakiś inny pomysł?
viking
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
casperii
@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();



bostaf
@viking toggleClass tam ma

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

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

casperii
@bostaf zobacz post przed dodaniem swojego posta:) JS został zedytowany.
bostaf
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.
casperii
@bostaf podesłałem na PW link do działającego triala, by tu nie spamować.
bostaf
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.
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.