2011-01-17 16 views
20

dodaję mój plik Javsacript na stronach z różnych ciągów zapytań w ścieżce skryptu jak ten:Jak uzyskać wartość ciągu zapytania ze ścieżki skryptu?

Strona1:

<script type="text/javascript" src="file.js?abc=123"></script> 

stronie 2:

<script type="text/javascript" src="file.js?abc=456"></script> 

STR.3:

<script type="text/javascript" src="file.js?abc=789"></script> 

W moim pliku JavaScript, jak mogę uzyskać wartość " abc "param? Próbowałem do tego użyć window.location, ale to nie działa.

W przypadku pomaga, poniżej jest funkcją używam znaleźć wartość param ciąg kwerendy:

function getQuerystring(key, defaultValue) { 
    if (defaultValue == null) defaultValue = ""; 
    key = key.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); 
    var regex = new RegExp("[\\?&]" + key + "=([^&#]*)"); 
    var qs = regex.exec(window.location.href); 
    if (qs == null) 
     return defaultValue; 
    else 
     return qs[1]; 
} 
+0

możliwe duplikat [Jak mogę uzyskać nazwę pliku skryptu z poziomu tego skryptu?] (Http://stackoverflow.com/questions/710957/how-might-i-get-the-script-filename- from-within-that-script) – Bergi

Odpowiedz

24

Jest to możliwe. Zobacz Passing JavaScript arguments via the src attribute. Punchline jest to, że ponieważ skrypty w HTML (nie XHTML) są wykonywane jako załadowany, pozwoli to skrypt, aby dowiedzieć się, jak to jest zawsze ostatni skrypt na stronie, gdy jest triggered-

var scripts = document.getElementsByTagName('script'); 
var index = scripts.length - 1; 
var myScript = scripts[index]; 
// myScript now contains our script object 
var queryString = myScript.src.replace(/^[^\?]+\??/,''); 

Wtedy po prostu zastosuj parsowanie ciągu zapytania.

+10

* "... ponieważ skrypty w HTML (nie XHTML) są wykonywane jako załadowane ..." * Zwróć uwagę, że ['odroczenie' i' async'] (http://www.w3.org/TR/html5/ scripting-1.html # attr-script-defer) modyfikują to zachowanie, więc jeśli używasz ich, to może nie działać: Twój skrypt może nie być ostatnim z serii w tym momencie. Opieranie się na tym powodowało u mnie dreszcze, więc prawdopodobnie użyłbym nazwy pliku i filtra na 'src' (przy założeniu, że wprowadza ograniczenie, że nie można zmienić nazwy pliku). –

+1

Filtrowanie na src może być trudne, jeśli wielokrotnie odwołujesz się do tego samego skryptu z różnymi parametrami. – bendytree

+4

Można użyć 'document.currentScript', który jest rzeczywistym znacznikiem skryptu, który uruchamia rzeczywisty kod. – MichelMattos

9

pierwsze, odpowiedź technicznych: jeśli przypisać tag skryptu identyfikator, można następnie chwyć jego src, a następnie przeanalizuj ciąg zapytania.

<script id="whatever" type="text/javascript" src="file.js?abc=123"></script> 

 

var path = document.getElementById('whatever').src; 
// ... 

Mając to odpowiedział, Chciałbym wyrazić moje zaniepokojenie — to cuchnie złych decyzji projektowych. Dlaczego włączasz swój skrypt w ten sposób (za pomocą kwerendy)? Jeśli próbujesz zoptymalizować swoją witrynę (mając jeden duży skrypt, który można przechowywać w pamięci podręcznej dla kolejnych stron), to aplikacja jest w rzeczywistości nieproduktywna, ponieważ przeglądarki wykonają nowe żądanie dla pliku skryptu na każdej stronie ze względu na różniące się ciągi zapytania. Prawidłowym podejściem jest posiadanie jednego dużego pliku współdzielonego, a następnie małego pliku specyficznego dla strony na każdej stronie.

+3

Josh3736 - jednym z powodów (i dlatego trafiłem tutaj przez wyszukiwarkę Google) jest obsługa widgetu, który jest używany gdzie indziej. Na przykład robię