2009-10-08 7 views
6

Używam funkcji ajax jquery do przechwytywania fragmentu strony i wyświetlania w sekcji strony - ten fragment zawiera html i odnośniki do zewnętrznych plików js.Jak zatrzymać jquery dodawanie unikalnego identyfikatora do skryptów wywoływanych przez ajax?

przepływu

Program wygląda następująco:

Strona główna nazywa -> strona Fragment, który nazywa -> różne dużych plików js poprzez znaczniki skryptów.

Włączyłem opcję pamięci podręcznej podczas początkowego wywołania ajax, aby strona z frapowaniem została zapisana w pamięci podręcznej (unikalne unikalne identyfikatory dołączone do adresu URL), jednak po wczytaniu fragmentu jQuery zmienia adres URL skryptu na zawierają uniksowy znacznik czasu, dzięki czemu przeglądarka pobiera za każdym razem nową kopię skryptów. Skrypty, do których dzwonię, mają min. 250 KB i są bardzo szkodliwe dla użytkownika, ponieważ przeglądarka blokuje się, gdy tylko zostaną wywołane. Czy jest to pożądane zachowanie jquery? Czy istnieje sposób na wyłączenie przepisywania adresu URL?

Wiele wiele dzięki za pomoc

Odpowiedz

4

Wygląda funkcji jQuerys za evalScript jest brudząc cię ...

Linia 543 z jQuery:

function evalScript(i, elem) { 
    if (elem.src) 
     jQuery.ajax({ 
      url: elem.src, 
      async: false, 
      dataType: "script" 
     }); 

    else 
     jQuery.globalEval(elem.text || elem.textContent || elem.innerHTML || ""); 

    if (elem.parentNode) 
     elem.parentNode.removeChild(elem); 
} 

Oto podział tego, co się dzieje: stronie głównej użytkownika Połączenia JS:

$.ajax({ 
    url:"frag.htm", 
    type:"GET", 
    success:callBackFunction 
}) 

i dostaje frag.htm który zawiera coś takiego:

<html><head><script src="test.js"></script></head><body>Content</body></html> 

wówczas funkcja zwrotna jest wywoływana, która prawdopodobnie wygląda tak:

function callBackFunction(data){ 
    $("#ajaxContent").html(data); // <- this is the beginning of your problems... 
} 

html Kiedy wywoływana jest funkcja jQuery (dane) jest " czyści "kod HTML, usuwając wszelkie znaczniki skryptów, a następnie wywołuje evalScript na każdym z nich. evalScript, jak widać, nie określa "cache: true", więc gdy przejdzie przez $ .ajax cache ma wartość null. Gdy pamięć podręczna ma wartość null, a dataType to "skrypt" jQuery ustawia cache = false.

Tak więc, aby obejść ten problem, spróbuj tego:

function callBackFunction(data){ 
    var tempAJAX = $.ajax; // save the original $.ajax 
     $.ajax=function(s){ // wrap the old $.ajax so set cache to true... 
      s.cache=true; 
      tempAJAX(s); // call old $.ajax 
     } 
     $("#ajaxContent").html(data); // insert the HTML and download the <script>s 
     $.ajax = tempAJAX; // reset $.ajax to the original. 
    } 
} 

Zanim wstawić nowy HTML z „frag.htm” na stronie głównej możemy przechwytywać wszystkie połączenia do $ .ajax, modyfikacji obiektu obejmuje cache = true, a następnie po załadowaniu skryptu wstaw kod HTML.

Daj mi znać, jeśli masz jakieś pytania.

+0

Fantastycznie działa, dzięki! –

+0

Bez problemu. Używam tego w aplikacji, którą teraz układam. : o) –

0
  1. zmusić serwer WWW służyć skrypt z datą wygaśnięcia w przyszłości.

  2. Jeśli użyjesz opcji dataType = "script" jako opcji dla jquery ajax, buforowanie zostanie domyślnie wyłączone, zobacz http://docs.jquery.com/Ajax/jQuery.ajax#options, spróbuj ustawić ręcznie na "html".

$.ajax({ 
    type: "GET", 
    url: "test.js", 
    dataType: "html" // if not set jquery will guess what type it is and disables caching when matching "script" 
}); 
+0

cześć, dzięki, ale próbowałem to tylko początkowe żądanie jest wywoływana za pośrednictwem AJAX i który jest buforowane w porządku , że wniosek ajax zwraca zawartość jak:

Część zawartości html

to prośby do http://blah.com/script.js, które są przepisywane jako http://blah.com/script.js?_id=3423423423 lub podobne, zapobiegając buforowaniu –

+0

Przepraszamy, przykro mi z powodu formatowania. –

+0

Czy jquery naprawdę dodaje "? _id = 007" do adresu URL? A może jest to coś innego, inny scenariusz? Jeśli szukam w źródle jQuery, nie znajduję żadnego "_id" również google nie pasuje nic ważnego. – powtac

11

To rozwiązanie jest mniej hack niż Murdocha rozwiązania:

$.ajaxPrefilter('script', function(options) { 
    options.cache = true; 
}); 

Zobacz http://api.jquery.com/jQuery.ajaxPrefilter/

+0

Doskonały. Masz jednak przewagę 2,5 roku ewolucji jquery :) – Tim

+0

Masz rację :) - "ajaxPrefilter" został wprowadzony w jQuery 1.5, który został wydany w styczniu 2010 roku, trzy miesiące po zadaniu pytania. – Blaise

+0

Pięknie precyzyjne rozwiązanie. Pracował dla mnie. –

Powiązane problemy