• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Drugi skrypt ajax nie działa poprawnie po załadowaniu pierwszego

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
109 wizyt
pytanie zadane 5 marca w JavaScript przez Us Użytkownik (840 p.)
edycja 5 marca przez Us

Cześć,

Mam takie dwa skrypty jak poniżej. Oba działają poprawnie jeśli używam ich oddzielnie, jednak jak załaduję pierwszego, a następnie drugiego to już nie. Działa to tak, że ten drugi skrypt potrafi zmienić css, ale już wartości nie. Podejrzewam, że jest to związane z metodą .load() w pierwszym skrypcie, ale sam nie potrafię rozwikłać problemu. 

Z góry dziękuję za pomoc.

 

Pierwszy kod:

var basketAddTimeout;
var ajaxSubmitForm;

    ajaxSubmitForm = function() {
        $this = $('#projector_button_basket');
		
        var url = $('#projector_form').attr('action');
        var txt = $this.text().trim();
        clearTimeout(basketAddTimeout);
        $.ajax({
            type: 'POST',
            url: url,
            data: $('#projector_form').serializeArray(),
            success: function(data) {	
                basketAddTimeout = setTimeout(function() { 
					openbasket();
					koszyczekk();
					$('#Basket').load(' #projector-basket-form');
                }, 1000)
                fetch('/ajax/basket.php').then(res => res.json()).then(({
                    basket
                }) => {
                    const number = basket.productsNumber;
					const number12 = basket.worth_formatted;
					$('#kwota-basket').text(number12);
					
                    document.getElementById('badgekoszyka').style.display = 'block';
					$( "#badgekoszyka" ).fadeOut( "slow");
					$( "#badgekoszyka" ).fadeIn( "slow");
                    $('#menu_basket .badge').text(number);
                    $('#badgekoszyka').text(number);
					
                })
            },
            error: function() {
                classObj.alert(classObj.txt.dodano_produkt_blad);
                $('#projector_button_basket').html(txt);
                $('#projector_button_basket').removeClass('loader');
            }
      });
    }

$(document).on('submit', '#projector_form', function(e) {
    
   
    ajaxSubmitForm();
	 e.preventDefault();
});

Drugi:

var ajaxSubmitForm2;

    ajaxSubmitForm2 = function() {
        var url = '/basketchange.php?type=multiproduct';
		$('#loaders').addClass('loader-koszyk');
		$('#blok-koszyk').css('filter','blur(3px)');
		let xxx = $('#projector-basket-form').serializeArray();
     
        $.ajax({
            type: 'POST',
            url: url,
            data: $('#projector-basket-form').serializeArray(),
            success: function(data) {
               
							koszyczekk();
							
                
                fetch('/ajax/basket.php').then(res => res.json()).then(({
                    basket
                }) => {
					
					
                    const number = basket.productsNumber;
                    const number12 = basket.worth_formatted;
					$('#kwota-basket').text(number12);
                    $('#menu_basket .badge').text(number);
                    $('#badgekoszyka').text(number);
					$('.topBasket').load('/basketchange.php?type=multiproduct&mode=2 .topBasket>*', function() {});
					$('#loaders').removeClass('loader-koszyk');
					$('#blok-koszyk').css('filter','blur(0px)');
				
                })
            },
            error: function() {
                classObj.alert(classObj.txt.dodano_produkt_blad);
			}
        });
    }


$(document).on('click', '#usuwanie-koszyk, #dodawanie-koszyk, #usuwanie-calkowite ', function() {
	
	ajaxSubmitForm2();
	e.preventDefault();

});

 

komentarz 8 marca przez Us Użytkownik (840 p.)

Dzięki za odpowiedź. Jeśli chodzi o projector-basket-form to jest to po prostu formularz z listą produktów, któremu muszę przekazać dane, takie jak ilość, koszt, id itd. Też próbowałem załadować dane z url w taki sposób:

$('#projector-basket-form').load('/basketchange.php?type=multiproduct&mode=2');

Ale ładowało do tego formularza całą stronę ;D Więc zrobiłem tak:

$('#projector-basket-form').load('/basketchange.php?type=multiproduct&mode=2 #projector-basket-form>*');

No i niestety to dalej nie śmiga jak powinno, więc chyba muszę zrezygnować z .load() ale nie mam pojęcia jak tam przekazać te dane. Po za tym jest to trochę dziwne, że wybieram element, do którego ładuję dane, a oprócz tego ładuje się tam ta strona, którą aktualnie przeglądam :D

Gdyby istniał sposób na to, żeby odświeżyć ten element #projector-basket-form po kliknięciu to była by rewelacja, ale na stackoverflow jedyny sposób jaki podają to właśnie .load() 

komentarz 8 marca przez VBService Ekspert (204,730 p.)
edycja 8 marca przez VBService

ten zapis jest nieprawidłowy

$('#projector-basket-form').load('/basketchange.php?type=multiproduct&mode=2 #projector-basket-form>*');

prawidłowy jest do momentu

$('#projector-basket-form').load('/basketchange.php?type=multiproduct&mode=2');

chyba się domyślam czego potrzebujesz, potrzebujesz obiektu json, który zwróci Twój skrypt php ('/basketchange.php?type=multiproduct&mode=2'), za pomocą json-a, możesz przesłać wartość kilku zmiennych, które mają być załadowane do kilku elementów na stronie i  wystarczy do tego "jedno zapytanieajax-owe.

Przykładowy wygląd takiego json-a, który "zwróciłby" basketchange.php?...

pierwsza wartość w cudzysłowie to może być id elementu na stronie, do którego ma być załadowana wartość podana po dwukropku w drugim cudzysłowie.

{ 'kwota-basket':'12.20pln', 'inne-id1':'wartosc1', 'inne-id2':'wartosc2' }

lub nawet dla kliku artykułów w koszyku

[ 
  { 'kwota-basket':'12.20pln', 'inne-id1':'wartosc1', 'inne-id2':'wartosc2' },
  { 'kwota-basket':'18.20pln', 'inne-id5':'wartosc5', 'inne-id6':'wartosc6' }, // itd.
]

po odebraniu przez ajax-a takiego json-a w 

success: function(data) { ...

iterujesz po odpowiednich polach (getElementById, czy querySelector itp.) i wstawiasz dane.

 

P.S. json_encode in php for js

komentarz 8 marca przez Us Użytkownik (840 p.)
Próbowałem to sobie zobrazować i faktycznie mogło by pomóc, jednak tylko wtedy gdy bym pracował bezpośrednio na html. A tutaj jest szablon xsl. Jeśli nie ma produktu w koszyku, to formularz jest w postaci "okrojonej" bez wielu elementów i nie mogę sobie tam "od tak" wstawić zdjęcia, tytułu itd. Sprawa niestety jest bardzo skomplikowana ;D Pewnie gdybyś miał wgląd w to co ja to było by inaczej, a tak z mojego opisu musisz się wiele domyślać. Tak sobie teraz pomyślałem, że mógłbym z tego koszyka zrobić osobną stronę, dzięki czemu można by to odświeżać dowoli.
komentarz 8 marca przez VBService Ekspert (204,730 p.)

Szablony xsl też możesz "przegląd" i robić zmiany prawie podobnie jak to się robi w dokumentach xml i to z poziomu jak i php-a taki i z javascript.

komentarz 8 marca przez VBService Ekspert (204,730 p.)
edycja 8 marca przez VBService

Skoro na początku napisałeś

Oba działają poprawnie jeśli używam ich oddzielnie

może pierwszy załaduj jako "normalny" (html + pierwszy skrypt) drugi załaduj na tej samej stronie do <iframe> (html + drugi skrypt) i wtedy będzie traktowany jako osobny dokument html.

 

Tak sobie teraz pomyślałem, że mógłbym z tego koszyka zrobić osobną stronę, dzięki czemu można by to odświeżać dowoli.

w <div> ustawionym jak modal (html + pierwszy skrypt)  wrzucasz <iframe> (html + drugi skrypt) i na jednej stronie masz dwa niezależne dokumenty html, miedzy którymi ciągle możesz "przerzucać" dane za pomocą js-a.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 222 wizyt
0 głosów
2 odpowiedzi 133 wizyt
0 głosów
1 odpowiedź 63 wizyt
pytanie zadane 8 października 2018 w JavaScript przez Bakr Mądrala (6,880 p.)

89,768 zapytań

138,374 odpowiedzi

309,458 komentarzy

59,679 pasjonatów

Advent of Code 2022

Top 15 użytkowników

  1. 1074p. - Argeento
  2. 1010p. - rucin93
  3. 1006p. - Michal Drewniak
  4. 1000p. - Łukasz Eckert
  5. 974p. - TheLukaszNs
  6. 949p. - JMazurkiewicz
  7. 946p. - adrian17
  8. 933p. - Jarosław Roszyk
  9. 889p. - nidomika
  10. 860p. - Mikbac
  11. 847p. - ssynowiec
  12. 799p. - Hubert Chęciński
  13. 772p. - Mawrok
  14. 768p. - overcq
  15. 764p. - Vinox
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...