Domanda

Sto cercando un plugin jQuery in grado di ottenere parametri URL e supportare questa stringa di ricerca senza generare l'errore JavaScript: "sequenza URI non valida". Se non esiste un plug-in jQuery che supporti questo, devo sapere come modificarlo per supportarlo.

?search=%E6%F8%E5

Il valore del parametro URL, quando decodificato, dovrebbe essere:

æøå

(i personaggi sono norvegesi).

Non ho accesso al server, quindi non posso modificare nulla su di esso.

È stato utile?

Soluzione 10

Non dovresti usare jQuery per qualcosa del genere!
Il modo moderno è usare piccoli moduli riutilizzabili attraverso un gestore di pacchetti come Bower.

Ho creato un minuscolo modulo che può analizzare la stringa di query in un oggetto. Usalo in questo modo:

// parse the query string into an object and get the property
queryString.parse(unescape(location.search)).search;
//=> æøå

Altri suggerimenti

function getURLParameter(name) {
    return decodeURI(
        (RegExp(name + '=' + '(.+?)(&|$)').exec(location.search)||[,null])[1]
    );
}

Di seguito è riportato ciò che ho creato dai commenti qui, oltre a correggere bug non menzionati (come la restituzione effettiva di null e non "null"):

function getURLParameter(name) {
    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
}

Quello che vuoi davvero è il plug-in Parser URL jQuery . Con questo plugin, ottenere il valore di un parametro URL specifico (per l'URL corrente) è simile al seguente:

$.url().param('foo');

Se vuoi un oggetto con nomi di parametri come chiavi e valori di parametri come valori, chiameresti param () senza un argomento, come questo:

$.url().param();

Questa libreria funziona anche con altri URL, non solo quello corrente:

$.url('http://allmarkedup.com?sky=blue&grass=green').param();
$('#myElement').url().param(); // works with elements that have 'src', 'href' or 'action' attributes

Poiché si tratta di un'intera libreria di analisi dell'URL, puoi anche ottenere altre informazioni dall'URL, come la porta specificata, il percorso, il protocollo ecc.

var url = $.url('http://allmarkedup.com/folder/dir/index.html?item=value');
url.attr('protocol'); // returns 'http'
url.attr('path'); // returns '/folder/dir/index.html'

Ha anche altre funzionalità, controlla la sua homepage per ulteriori documenti ed esempi.

Invece di scrivere il tuo parser URI per questo scopo specifico che kinda funziona nella maggior parte dei casi , usa un vero parser URI. A seconda della risposta, il codice di altre risposte può restituire 'null' invece di null , non funziona con parametri vuoti (? Foo = & amp; bar = x ), impossibile analizzare e restituire tutti i parametri contemporaneamente, ripete il lavoro se esegui ripetutamente query sull'URL per parametri ecc.

Usa un vero parser URI, non inventare il tuo.

Per chi è contrario a jQuery, c'è una versione del plugin che è JS puro .

Se non sai quali saranno i parametri URL e vuoi ottenere un oggetto con le chiavi e i valori che sono nei parametri, puoi usare questo:

function getParameters() {
  var searchString = window.location.search.substring(1),
      params = searchString.split("&"),
      hash = {};

  if (searchString == "") return {};
  for (var i = 0; i < params.length; i++) {
    var val = params[i].split("=");
    hash[unescape(val[0])] = unescape(val[1]);
  }
  return hash;
}

Chiamando getParameters () con un url come / posts? date = 9/10/11 e amp; author = nilbus tornerebbe:

{
  date:   '9/10/11',
  author: 'nilbus'
}

Non includerò il codice qui poiché è ancora più lontano dalla domanda, ma weareon.net ha pubblicato una libreria che consente anche la manipolazione dei parametri nell'URL:

Puoi utilizzare la proprietà oggetto-query

  • getURLParam
  • Basato sulla la risposta di 999 :

    function getURLParameter(name) {
        return decodeURIComponent(
            (location.search.match(RegExp("[?|&]"+name+'=(.+?)(&|$)'))||[,null])[1]
        );  
    }
    

    Modifiche:

    • decodeURI () è sostituito con decodeURIComponent()
    • [? | & amp;] viene aggiunto all'inizio della regexp

    È necessario aggiungere il parametro i per renderlo insensibile alle maiuscole:

      function getURLParameter(name) {
        return decodeURIComponent(
          (RegExp(name + '=' + '(.+?)(&|$)', 'i').exec(location.search) || [, ""])[1]
        );
      }
    
    $.urlParam = function(name){
      var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(top.window.location.href); 
      return (results !== null) ? results[1] : 0;
    }
    
    $.urlParam("key");
    

    Ad esempio, una funzione che restituisce il valore di qualsiasi variabile di parametro.

    function GetURLParameter(sParam)
    {
        var sPageURL = window.location.search.substring(1);
        var sURLVariables = sPageURL.split('&');
        for (var i = 0; i < sURLVariables.length; i++)
        {
            var sParameterName = sURLVariables[i].split('=');
            if (sParameterName[0] == sParam)
            {
                return sParameterName[1];
            }
        }
    }​
    

    Ed è così che puoi usare questa funzione supponendo che l'URL sia,

    " http:? //Example.com/ tecnologia = jquery & amp; blog = jquerybyexample " ;.

    var tech = GetURLParameter('technology');
    var blog = GetURLParameter('blog');
    

    Quindi nella variabile di codice sopra " tech " avrà " jQuery " come valore e " blog " la variabile sarà " jquerybyexample " ;.

    Dopo aver letto tutte le risposte ho finito con questa versione con + una seconda funzione per usare i parametri come flag

    function getURLParameter(name) {
        return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)','i').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
    }
    
    function isSetURLParameter(name) {
        return (new RegExp('[?|&]' + name + '(?:[=|&|#|;|]|$)','i').exec(location.search) !== null)
    }
    

    C'è molto codice errato qui e le soluzioni regex sono molto lente. Ho trovato una soluzione che funziona fino a 20 volte più veloce della controparte regex ed è elegantemente semplice:

        /*
        *   @param      string      parameter to return the value of.
        *   @return     string      value of chosen parameter, if found.
        */
        function get_param(return_this)
        {
            return_this = return_this.replace(/\?/ig, "").replace(/=/ig, ""); // Globally replace illegal chars.
    
            var url = window.location.href;                                   // Get the URL.
            var parameters = url.substring(url.indexOf("?") + 1).split("&");  // Split by "param=value".
            var params = [];                                                  // Array to store individual values.
    
            for(var i = 0; i < parameters.length; i++)
                if(parameters[i].search(return_this + "=") != -1)
                    return parameters[i].substring(parameters[i].indexOf("=") + 1).split("+");
    
            return "Parameter not found";
        }
    
    console.log(get_param("parameterName"));
    

    Regex non è la soluzione completa, per questo tipo di problema la semplice manipolazione delle stringhe può funzionare in modo molto più efficiente. Fonte del codice .

    <script type="text/javascript">
    function getURLParameter(name) {
            return decodeURIComponent(
                (location.search.toLowerCase().match(RegExp("[?|&]" + name + '=(.+?)(&|$)')) || [, null])[1]
            );
        }
    
    </script>
    

    getURLParameter (id) o getURLParameter (Id) Funziona allo stesso modo:)

    Snippet di codice jQuery per ottenere le variabili dinamiche archiviate nell'URL come parametri e memorizzarle come variabili JavaScript pronte per l'uso con gli script:

    $.urlParam = function(name){
        var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
        if (results==null){
           return null;
        }
        else{
           return results[1] || 0;
        }
    }
    
    example.com?param1=name&param2=&id=6
    
    $.urlParam('param1'); // name
    $.urlParam('id');        // 6
    $.urlParam('param2');   // null
    
    //example params with spaces
    http://www.jquery4u.com?city=Gold Coast
    console.log($.urlParam('city'));  
    //output: Gold%20Coast
    
    console.log(decodeURIComponent($.urlParam('city'))); 
    //output: Gold Coast
    
    function getURLParameters(paramName) 
    {
            var sURL = window.document.URL.toString();  
        if (sURL.indexOf("?") > 0)
        {
           var arrParams = sURL.split("?");         
           var arrURLParams = arrParams[1].split("&");      
           var arrParamNames = new Array(arrURLParams.length);
           var arrParamValues = new Array(arrURLParams.length);     
           var i = 0;
           for (i=0;i<arrURLParams.length;i++)
           {
            var sParam =  arrURLParams[i].split("=");
            arrParamNames[i] = sParam[0];
            if (sParam[1] != "")
                arrParamValues[i] = unescape(sParam[1]);
            else
                arrParamValues[i] = "No Value";
           }
    
           for (i=0;i<arrURLParams.length;i++)
           {
                    if(arrParamNames[i] == paramName){
                //alert("Param:"+arrParamValues[i]);
                    return arrParamValues[i];
                 }
           }
           return "No Parameters Found";
        }
    
    }
    

    Ho creato una semplice funzione per ottenere il parametro URL in JavaScript da un URL come questo:

    .....58e/web/viewer.html?page=*17*&getinfo=33
    
    
    function buildLinkb(param) {
        var val = document.URL;
        var url = val.substr(val.indexOf(param))  
        var n=parseInt(url.replace(param+"=",""));
        alert(n+1); 
    }
    buildLinkb("page");
    

    OUTPUT: 18

    Nel caso in cui abbiate l'URL come localhost / index.xsp? a = 1 # qualcosa e dovete ottenere il parametro non l'hash.

    var vars = [], hash, anchor;
    var q = document.URL.split('?')[1];
    if(q != undefined){
        q = q.split('&');
        for(var i = 0; i < q.length; i++){
            hash = q[i].split('=');
            anchor = hash[1].split('#');
            vars.push(anchor[0]);
            vars[hash[0]] = anchor[0];
        }
    }
    

    Leggera modifica alla risposta di @pauloppenheim, poiché non gestirà correttamente i nomi dei parametri che possono far parte di altri nomi di parametri.

    Ad esempio: se hai " appenv " & Amp; & Quot; env " parametri, ridisegnando il valore per "env" può ritirare " appenv " valore.

    Fix:

    var urlParamVal = function (name) {
        var result = RegExp("(&|\\?)" + name + "=(.+?)(&|$)").exec(location.search);
        return result ? decodeURIComponent(result[2]) : "";
    };
    

    Questo può aiutare.

    <script type="text/javascript">
        $(document).ready(function(){
            alert(getParameterByName("third"));
        });
        function getParameterByName(name){
            var url     = document.URL,
                count   = url.indexOf(name);
                sub     = url.substring(count);
                amper   = sub.indexOf("&"); 
    
            if(amper == "-1"){
                var param = sub.split("=");
                return param[1];
            }else{
                var param = sub.substr(0,amper).split("=");
                return param[1];
            }
    
        }
    </script>
    
    Autorizzato sotto: CC-BY-SA insieme a attribuzione
    Non affiliato a StackOverflow
    scroll top