Odpalenie skryptów wczytanych dynamicznie wraz z HTML

0

Witam, stworzyłem sobie kilka podstron, które są wczytywane dynamicznie(jquery-ajax) na tych podstronach znajdują się skrypty. Po wczytaniu danych odpalają się wyłącznie skrypty, które mają przypisane zdarzenia "on" np. $(document).on('click', 'div', function() {alert('test');});. Czy jest jakiś inny sposób wczytywania wszystkich skryptów niż każdorazowo ponownie wywołanie funkcji po wczytaniu danych? Działa funkcja $(document).trigger("ready"); odpala wszystko, ale po każdorazowym kliknięciu w daną podstronę, skrypt się powiela( np. po 2 krotnym kliknięciu, w div'a, który wywoła zdarzenie (alert), zdarzenie wykona się najpierw 1raz ,potem 2razy, 3razy itd.

Z góry bardzo dziękuję za pomoc

0

Mógłbyś pokazać trochę kodu bo nie za bardzo rozumiem problem.

0

w document.ready zrób sobie wywołanie funkcji typu attach_events, w niej sobie przypinaj te zdarzenia bez on, a po każdej zmianie zawartości (np. z ajaxa) wywołuj sobie po raz kolejny funkcję attach_events.

żeby zapobiec duplikowaniu zdarzeń możesz:
a) tworzyć zdarzenia z "namespace" czy jak to nazwali w dokumentacji jQuery, tj: $('selektor').bind('click.mojeZdarzenia');, a potem odpinać wszystkie takie zdarzenia (unbind('.mojeZdarzenia') i przypinać je ponownie (czyli Twoja funkcja na początku z góry odpina wszystko, a potem przypina)
b) do każdego ozdarzeniowanego elementu dodać wartość do elementu DOM, tj:

$('selektor').each(function(){
  if (!this.MojeZdarzenia) {
    this.MojeZdarzenia = true;
    $(this).click(function(){ /* ... */ });
  }
});

w ten sposób pominiesz po prostu elementy, które mają już Twoje eventy (i możesz użyć jakiegoś "ogólnego" selektora).

Google podpowiada te same metody, co wypisałem: http://stackoverflow.com/questions/16995645/how-to-prevent-of-attaching-event-handler-multiple-times
Oraz jakąś magię, nie znam skuteczności: http://stackoverflow.com/questions/2180326/jquery-event-model-and-preventing-duplicate-handlers

0

A co ze zwykłymi skryptami, które nie mają zdarzeń (np zmienne, skrypty dla styli np "chosen" dla select list) ? Czy da się je jakoś odpalić, bez ponownego wczytywania? Próbowałem poprzez stworzenie funkcji z tym skryptem i potem wywołanie ten funkcji, ale niestety nie działało.

Pozdrawiam

0

nie bardzo rozumiem o co Ci chodzi

0

Tamten problem rozwiązałem. Niestety mam kolejny i nie wiem czy przypadkiem to nie jest jakiś bug.

Niektóre dane na mojej stronie głównej są ładowane dynamicznie po odpaleniu witryny:

$(document).on("ready", function() {
    pobierzDane();
});


function pobierzDane() {
        $.get(url, function(data) {
                $("#divDane").append(data.html);
        }, 'json');
    }

Funkcja pobierzDane() również jest odpalana po ajaxowym przejściu ponownie na stronę główną. Problem polega na tym, że co jakiś czas po przejściu na stronę główną odpalają się dwie funkcję, ta ze strony głównej oraz ta, która wczytuje dane z danej podstrony. Nie mogę nigdzie znaleźć zależności, ponieważ dzieje się to losowo. Raz na jakiś czas odpala się ona podwójnie. Wie ktoś może czemu tak się dzieje, lub czy ktoś zna inny sposób żeby ta funkcja się sama odpaliła przy pobraniu danych z danej podstrony?

Kod do pobierania danych:


jQuery.ajax({
                type: "GET",
                url: url,
                data: getData,
                cache: false,
                dataType: "html",
                context: document.body,
                success: function(data) { 
                    
                    data = data.split('id="' + content + '"')[1];
                    data = data.substring(data.indexOf('>') + 1);
                    var depth = 1;
                    var output = '';
                    while (depth > 0) {
                        temp = data.split('</main>')[0];
                        i = 0;
                        pos = temp.indexOf("<main");
                        while (pos != -1) {
                            i++;
                            pos = temp.indexOf("<main", pos + 1);
                        }
                        //end count
                        depth = depth + i - 1;
                        output = output + data.split('</main>')[0] + '</main>';
                        data = data.substring(data.indexOf('</main>') + 6);
                    }
                   
                    jQuery("#main").html(output);
                    jQuery("#main").find("script").each(function(i) {
                        eval(jQuery(this).text());
                    });
                    if (jQuery('#main').children('div').hasClass('home')) {
                        pobierzDane(); 
                    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1