Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wywołaj funkję po zmianie adresu URL, Jak to zrobić bez hash w adresie?
Bart123
post 27.09.2014, 21:58:05
Post #1





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Wszystko opisałem w tytule. ostatnio spotykam się z takimi problemami, że już dawno powinienem to pytanie zadać.

Ponieważ nigdy tego nie robiłem i to będzie mój pierwszy raz (niczym u prawiczka hahaha ), proszę od razu o przykład.

Chodzi mi konkretnie o addClass kiedy zmieni się adres url strony. Bez żadnego klikania. Niech skrypt patrzy w adres url i jeżeli się zmienił, niech funkcja zadziała.
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
Damonsson
post 27.09.2014, 22:06:22
Post #2





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Jeżeli zmieni się URL, to strona załaduje się od nowa i wszystkie Twoje dynamiczne addClass itp. szlag trafi.
Go to the top of the page
+Quote Post
Bart123
post 27.09.2014, 22:09:24
Post #3





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Nie ponieważ używam wtyczki do ajaxowania linków. W związku z tym, strona ładuje się bez przeładowania takiego fizycznego.

Konkretnie: Ajaxify Wordpress Site.

I w tym momencie zmiana klas działa ale dopiero po kliknięciu na link. Żeby móc dodać do tego paginację, musi to działać na bazie adresu URL właśnie albo w jakikolwiek inny sposób, którego ja nie znam.

Klikam na zmianę strony na następną - link jest nad stopką. A menu mam w header . W momencie kiedy kliknę na następną stronę u dołu, chcę żeby u góry zmieniała się klasa aktywnego linku. Nie wiem czy to jasno opisuję.



Ten post edytował Bart123 27.09.2014, 22:25:32
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 07:19:01
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Pisał o rozwiązaniu w Twoim poprzednim temacie.


--------------------
Go to the top of the page
+Quote Post
Bart123
post 28.09.2014, 12:36:46
Post #5





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Rozwiązanie .on("popstate" - być może przez wordpress - kompletnie nie działa więc podpowiedź mi nie pomogła. Stąd postanowiłem czekać w nowym temacie na inne pomysły, zadając konkretne pytanie.

Ten post edytował Bart123 28.09.2014, 12:37:09
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 12:41:49
Post #6





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Jak wygląda obecnie budowa adresu (w pasku przeglądarki), z hashem czy bez?


--------------------
Go to the top of the page
+Quote Post
Bart123
post 28.09.2014, 12:44:12
Post #7





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Obecnie już bez bo skoro nie zadziałało, wróciłem do starego rozwiązania.

http://Adres/edukacja

Bo w tej chwili zmiany klass w menu działają po kliknięciu w link w headerze w menu głównym - tak jak było.

Natomiast paginacja tylko przerzuca strony ale już nie zmienia klas. Paginacja wtyczkowa oczywiście bo życie sobie należy ułatwiać wink.gif

Ten post edytował Bart123 28.09.2014, 12:52:49
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 12:51:31
Post #8





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Spróbuj podpiąć tak:
window.onpopstate = function(e){
//
}
lub:
window.addEventListener("popstate", function(e) {
//
});


--------------------
Go to the top of the page
+Quote Post
Bart123
post 28.09.2014, 12:54:33
Post #9





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


[JAVASCRIPT] pobierz, plaintext
  1.  
  2. $(window).load(function () {
  3. var tutaj = jQuery('.wrapper').offset().top;
  4. jQuery('html, body').animate({scrollTop: tutaj}, 'slow');
  5.  
  6.  
  7. });
  8.  
  9. jQuery(document).ready(function(){
  10.  
  11. window.onpopstate = function(e){
  12. $('.current-menu-item').removeClass("current-menu-item");
  13. $("a[href*='" + location.pathname + "']").addClass("current-menu-item"); });
  14.  
  15. });
  16.  
  17. jQuery(document).ready(function(){
  18.  
  19. $('.home').click(function() {
  20. $('.current-menu-item').removeClass("current-menu-item");});
  21. });
  22.  
[JAVASCRIPT] pobierz, plaintext


To jest mój dokument w całośći. Po wpisaniu tego co podałeś - DRUGA CZĘŚĆ - żaden ze skryptów nie działa więc pewnie ja coś źle wpisałem? pierwszy zawsze działał bezbłędnie.

ROZWIĄZANIE DRUGIE:

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. jQuery(document).ready(function(){
  3.  
  4. $(window).addEventListener("popstate", function(e) {
  5. $('.current-menu-item').removeClass("current-menu-item");
  6. $("a[href*='" + location.pathname + "']").addClass("current-menu-item"); });
  7.  
  8. });
  9.  
  10.  
[JAVASCRIPT] pobierz, plaintext


Ta część pozostaje kompletnie bez reakcji. Tak, jakby jej nie było.


Ten post edytował Bart123 28.09.2014, 13:07:17
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 13:08:53
Post #10





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Linia 13: });
powinno być }

P.S. Używaj narzędzie developerskich w przeglądarce. Ułatwi Ci sporo.


--------------------
Go to the top of the page
+Quote Post
Bart123
post 28.09.2014, 13:15:58
Post #11





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Zwykle używam. Teraz już po prostu w akcie desperacjii chcę tą stronę skończyć i zostawić ją w cholerę heheh smile.gif

Ej! Działa! Jesteś wielki! Normalnie dać mu browara smile.gif Teraz muszę tylko włączyć anulowanie klas w momencie, kiedy strona dochodzi do home. Ale to mała poprawka. Zaraz będzie.

Trueblue - BiG Respect smile.gif Thx.

Ten post edytował Bart123 28.09.2014, 13:19:32
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 13:19:21
Post #12





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Nie przyłączaj addEventListenter do $(window), ale bezpośrednio do obiektu window.

Chce się upewnić, czy adres w pasku zmienia się bez przeładowania strony?


--------------------
Go to the top of the page
+Quote Post
Bart123
post 28.09.2014, 13:22:50
Post #13





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Trueblue zmienia się bez przeładowania. Ajaxem z gifem. Z tym że ja użyłem tego.

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. jQuery(document).ready(function(){
  3.  
  4. window.onpopstate = function(e){
  5. $('.current-menu-item').removeClass("current-menu-item");
  6. $(".nav-menu li a[href*='" + location.pathname + "']").addClass("current-menu-item"); };
  7.  
  8. });
  9.  
[JAVASCRIPT] pobierz, plaintext



Tylko jakoś nie mogę wyłączyć klas przy zmiana adresu na adres strony głównej. Ale do tego zaraz dojdę znając życie.

Ten post edytował Bart123 28.09.2014, 13:28:39
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 13:32:34
Post #14





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Upewnij się, że ta funkcja jest wywoływana przy zmianie adresu, wrzuć do środka jakiś alert.

P.S. Ten sposób nie jest najlepszy, bo jeśli wcześniej w kodzie jest przypięta obsługa zdarzenia na onpopstate, ta metoda nadpisze handlery.


--------------------
Go to the top of the page
+Quote Post
Bart123
post 28.09.2014, 13:40:17
Post #15





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Tu jest tylko jedna taka funkcja więc nie ma problemu.

Alert się wyświetla. Nie wyświetla się tylko wtedy, kiedy ręcznie zmienię adres, wpisując go do paska, ale tu niie o to chodzi więc wszystko gra chyba.

No nie do końca, bo chyba chcąc dodać remove class dla wszystkich a, kiedy jestem na stronie głównej, będę musiał dwa razy użyć tego samego?

Ten post edytował Bart123 28.09.2014, 13:42:46
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 13:57:01
Post #16





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Nie do końca rozumiem co masz na myśli, ale może chodzi Ci o tzw. initial state, który dotyczy nie tylko strony głównej, ale ogólnie wejścia na jakąkolwiek podstronę bez ajaxa.

http://blog.jonabrams.com/post/25435115993...html5-pushstate
Punkt 4.
Tam też powinieneś obsłużyć zaznaczanie/odznaczanie linków.


--------------------
Go to the top of the page
+Quote Post
Bart123
post 28.09.2014, 14:38:35
Post #17





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Opiszę jaśniej.

Dodawaj klasę do aktualnego linku - czyli to co zrobiliśmy - ale nie dodawaj jej wtedy, kiedy jesteś na stronie głównej. Wtedy, usuwaj klasę z aktualnego linku i niech wszystkie będą bez klasy.

NP. WTEDY - KIEDY PRZY POMOCY PAGINACJI WRÓCIŁEŚ DO PIERWSZEJ STRONY.

Dlatego, że wtedy dodaje klasę do wszystkich linków. Tak jakby będąc na stronie głównej, był na wszystkich podstronach jednocześnie.

Pójdę coś zjeść i poczytam. Coś czuję, że wreszcie skończę dziś to badziewie:)

Próbowałem to zrobić tak, ale niestety tak prosto nie będzie:

[JAVASCRIPT] pobierz, plaintext
  1. jQuery(document).ready(function(){
  2. if (location.href !="Pierwsza strona"){
  3. window.onpopstate = function(e){
  4. $('.current-menu-item').removeClass("current-menu-item");
  5. $(".nav-menu a[href*='" + location.pathname + "']").addClass("current-menu-item");
  6. };
  7. };
  8. });
[JAVASCRIPT] pobierz, plaintext


Ten post edytował Bart123 28.09.2014, 14:22:46
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 15:06:30
Post #18





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Warunek powinieneś dodać w środku zdarzenia i nie taki.

Czy główna strona ma link w .nav-menu?


--------------------
Go to the top of the page
+Quote Post
Bart123
post 28.09.2014, 15:08:45
Post #19





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 10.05.2014
Skąd: Elbląg

Ostrzeżenie: (10%)
X----


Nie no główna strona faktycznie ma link home. Ale to w ogóle chyba jest źle.

Chodziło mi o to - dodawaj klasy w nav-menu jeżeli aktualny url nie równa się i tu mój adres strony głównej.

Już włożyłem warunek do środka ale to nie działa. Nadal jeżeli url zmienia się na główny adres, to klasa dodaje się do wszystkich linków w nav-menu. A ja bym chciał, żeby ona w tym momencie stamtąd zniknęła.

Bo sam link home nie zaznacza się w żaden sposób - klikamy na logo i tyle.

Ten post edytował Bart123 28.09.2014, 15:15:52
Go to the top of the page
+Quote Post
trueblue
post 28.09.2014, 15:14:18
Post #20





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

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


Pytałem czy jest tag <a> w .nav-menu, który odpowiada stronie głównej.

Jeśli jest, to musisz zrobić warunek na href odpowiadający jej, pewnie będzie to:
  1. if(location.pathname!=="/")
  2. $(".nav-menu a[href*='" + location.pathname + "']").addClass("current-menu-item");

Możesz, jeśli masz taką możliwość dodać do niego klasę np. home i wtedy:
  1. $(".nav-menu a[href*='" + location.pathname + "']:not(.home)").addClass("current-menu-item");




--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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: 14.08.2025 - 01:54