[jQuery] funkcja load w Internet Explorer


(hoobert) #1

Witam, mam problem z funkcją load w jquery, a konkretniej w przypadku interpretowania jej przez przeglądarkę Internet Explorer.

Mianowicie sprawa wygląda następująco: Mam stronę główną index.php, gdzie aktualności są wyświetlane za pomocą fukncji load w jquery. Czyli mam sobie plik aktualnosci.php i do tego pliku poprzez dodanie do urla parametrów wyświetlam aktualności. Czyli np.

index.php

Aktualności 1
Aktualności 2[/code]




index.php

[code]
I to działa ok pod wszystkimi przeglądarkami, ale jeżeli mamy sytuację, że niektóre aktualności mają opcję "czytaj więcej" to w pliku aktualnosci.php jest skrypt który umożliwia przeczytanie tej konkretnej informacji. Czyli np. mamy jakiś warunek, który sprawdza czy przy danym newsie ma być opcja 'czytaj więcej' i w którymś przypadku będzie. Więc wyświetla się link aktualnosci.php

//Aktualnosc 
Czytaj więcej[/code]




i skrypt js:



aktualnosci.php

[code] });

I w przeglądarkach Firefox, Opera, Chrome działa to bez zarzutów. Natomiast w przypadku przeglądarki Internet Explorer pierwsze aktualności wczytuje ok, ale przy opcji 'czytaj więcej' nic się nie dzieję. Jakby ten kod js z pliku aktualnosci.php nie wykonywał się poprawnie lub jakby w ogóle nie był widziany przez przeglądarkę.

Czy ktoś ma jakieś propozycje?

Z góry dzięki, pozdrawiam.


(Drobok) #2

Nie rób php'em kodu js'a. Owy kod umieszcza się w head, a nie za każdym razem po wpisie. Ogólnie dodawaj linki php. A js'em tylko je interpretuj :slight_smile:

Spróbuj dać return false; przed zamknięciem skryptu :slight_smile:


(Grzesie K) #3

zamiast return false w jQuery lepiej użyć event.preventDefault()


(hoobert) #4

Dzięki drobok za odpowiedź.

dodanie return false; nie rozwiązuje sprawy.

Jeżeli chodzi o dodawanie linków php to co masz konkretnie na myśli?

Przeglądałem jeszcze ten kod i właśnie jak mam link w postaci index.php#aktualnosc1/cos_tam

to jest w js pobierany ten ciąg #aktualnosc1/cos_tam i jest wysyłany do tego pliku aktualnosci.php w postaci

$("#info").load('aktualnosci.php?kategoria=aktualnosci/cos_tam');

i potem php już dalej przetwarza ten kod. Ale zrobiłem sobie rozpoznanie czy w ogóle widzi tą zmienną $_GET['kategoria'] w tym pliku aktualnosci.php i w firefoxie, chromie i operze pokazuje

string(19) "aktualnosci/cos_tam"

A w Internet Explorerze pokazuje

string(37) "127.0.0.1/projekt/aktualnosci/cos_tam"

Dziwna sprawa, ale w sumie teraz się nie dziwie, że to nie działało. To chyba rozwiązuje ten problem.

A co do tworzenia linków, aby były dynamicznie wyświetlane to metoda Link nie jest dobrym rozwiązaniem?


(Drobok) #5

Nie jest, ze względu na to iż nie działa on w wypadku wyłączonego js'a. Lepiej pisać w czystym php, by potem jquery robić samo przeładowanie bez odświeżenia :slight_smile:

Do każdego news'a generujesz kolejny ??


(slepcu) #6

@drobok : pokaż mi współczesną stronę www w ogóle bez js ? Ludzie chcą by strony byly interaktywne a tylko js albo flash/silverlight to zapewni.

dobrym pomyslem zamiast wstawiania dla każdego linku bloku jest wysłanie Ajaxem calego zestawu linkow( w tym nazwy, adres url do wczytania, komentarzy itd) i budowie tego po stronie js. Albo budowanie zakazdym razem tego w php dla calego zestawu.

IE wyrzuca jakies bledy na konsoli bledow ? pokaz nam jeszcze jak przypisujesz akcje do przycikow "pokaz wiecej"


(Drobok) #7

@up nie chodzi mi o całkowite wywalenie js'a. Pokaż mi popularną stronę na której po wyłączeniu js'a nie można przeczytać treści.

  1. [*:19yp5qrj]Nie działające linki

Po czymś takim wrócił byś na jakąś stronę ? Cóż za problem zrobić normalne linki działające każdemu, po czym obsłużyć je w jquery ?? :slight_smile:


(slepcu) #8

spoko wiem, o co chodzi. IE automatycznie wrzuca do linkow w atrybucie href, ktore maja hash, adres samej strony;

jak rozumiem wszystkie linki maja adres zaczynajacy sie od "#" ?

w takim razie utni te stringi do tego znaku.

napisalem w mintuke prosta funkcyjka js'owa wyciagajaca hashe z adres url :

function getHash(addressUrl){

    var p = addressUrl.indexOf('#');

    if (p >= 0){

        return addressUrl.slice(p+1);

    }

    return addressUrl;


}


alert(getHash("www.gazeta.pl/aktualnosci#pl_gfg"));

alert(getHash("#pl_gfg2"));

alert(getHash("pl_gfg3"));

te alerty sa tylko do sprawdzenia. gdy nie ma znaku zwraca caly string

moze pomoglem, a jak nie o to chodzilo to podaj cos wiecej o tym przypadku.


(hoobert) #9

U mnie działa to w ten sposób, że z bazy jest wyświetlana lista z menu i w kodzie html wygląda to mniej więcej tak:

  • Aktualność 1
  • Aktualność 2
  • Aktualność 3
    [/code] no i potem mam skrypt w js
    [code] $(".menu_link").click(function() { var link = $(this).attr('href'); link = link.replace("#", ""); $("#info").load('aktualnosci.php?kategoria='+link); });

Nic nie jest generowane, wszystko mi działa na tym schemacie przy wybieraniu kategorii z tego menu.

A to jakbym miał robić zwyczajnie odnośniki czyli np. zamiast #aktualnosc1 to ?kategoria=aktualnosc1 to jak z poziomu jquery zrobić, aby po kliknięciu takiego linku (przy domyślnie włączonej obsłudze js) nie odświeżało strony tylko wczytało ją do tego diva id="info" bez odświeżania?

Edit.

dzięki slepcu, zaraz przetestuję.


(Drobok) #10

Nie miałbyś linka:

?kategoria=aktualnosc1

tylko:

aktualnosci.php?kategoria=aktualnosc1

W takim wypadku dałbyś:

$(".menu_link").click(function() {

event.preventDefault();

$("#info").load($(this).attr('href'));

});

Przy linku:

Aktualność 1[/code]




Jeśli skorzystałbyś z mod_rewrite mógłbyś stworzyć linki w postaci:

[code][Aktualność 1](aktualnosc1)
Wpisując mniej więcej (w zależności od serwera) w htaccess:

Options +FollowSymlinks

RewriteBase /

RewriteEngine on


RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.+)$ aktualnosci.php?kategoria=$1 [L]

(slepcu) #11

wlasnie tu jest pies pogrzebany, ze niby wszystko ladnie jakby to chodzilo poprawie. to i tak zwykle sie to robi z przeladowaniem strony i zaladowaniem wtedy do tego diva odpowiednia zawartosc. Powod ? bo takie czasy ze prostsze i pewniejsze sposoby sa czesciej wybierane. Zwieksza to sie ilosc zaladowan strony przez co mozna pokazac wiekszy ruch na stronie, lepiej to wypada w przypadku pozycjonowania strony i obecnosci reklam, a w kazdym razie jest to prostsze.

to co drobok dodal tez ma sens, zalezy tylko jak obslugujesz te strony ladowane do wnetrza tego diva.


(hoobert) #12

No rzeczywiście takie coś też działa :slight_smile:

tylko zamiast

$(".menu_link").click(function() {

     event.preventDefault();

     $("#info").load($(this).attr('href'));

});

musiałem dać

$(".menu_link").click(function(event) {

     event.preventDefault();

     $("#info").load($(this).attr('href'));

});

bo bez tego 'event' przekierowywało mnie na aktualnosci.php?kategoria=aktualnosc1, a nie ładowało jej do diva.

slepcu, to prawda, ale cała strona nie działa w ten sposób. Tutaj jest to akurat taki dodatek. Nie wyeliminowałem całkowicie przeładowywania strony, więc z indeksowaniem jej przez wyszukiwarki nie powinno być problemów.

dzięki wszystkim za wskazówki, dobra robota.