Pergunta

Eu estou procurando um plugin jQuery que pode obter parâmetros de URL, e apoiar esta cadeia de pesquisa sem saída o erro JavaScript: "malformados seqüência URI". Se não houver um plugin jQuery que suporta esta, eu preciso saber como modificá-lo para suportar isto.

?search=%E6%F8%E5

O valor do parâmetro de URL, quando decodificado, deve ser:

æøå

(os personagens são norueguês).

Eu não tenho acesso ao servidor, por isso não pode modificar qualquer coisa sobre ele.

Foi útil?

Solução 10

Você não deve usar jQuery para algo como isto!
A maneira moderna é usar pequenos módulos reutilizáveis ??através de um pacote-manager como Bower.

Eu criei uma pequena módulo que pode analisar a string de consulta em um objeto. Usá-lo como este:

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

Outras dicas

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

Abaixo está o que eu criei a partir dos comentários aqui, bem como correção de bugs não mencionados (como realmente retornar nulo, e não 'null'):

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

O que você realmente quer é o jQuery URL Analisador plug-in . Com este plugin, recebendo o valor de um parâmetro URL específica (para a URL atual) se parece com isso:

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

Se você quer um objeto com nomes de parâmetros como chaves e valores de parâmetros como valores, você apenas chamar param() sem um argumento, como este:

$.url().param();

Esta biblioteca também trabalha com outras urls, não apenas o atual:

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

Uma vez que esta é uma biblioteca inteira URL parsing, você também pode obter outras informações a partir do URL, como a porta especificada, ou o caminho, o protocolo etc:

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'

Ele tem outras características, bem como, verificar a sua homepage para mais docs e exemplos.

Em vez de escrever seu próprio analisador URI para este fim específico que tipo trabalha em a maioria casos, use um analisador real URI. Dependendo da resposta, o código de outras respostas podem retornar 'null' vez de null, não funciona com parâmetros vazios (?foo=&bar=x), não é possível analisar e devolver todos os parâmetros de uma vez, repete o trabalho se você consultar repetidamente o URL para os parâmetros etc. .

Use um analisador real URI, não inventar o seu próprio.

Para aqueles avessos a jQuery, há uma versão do plugin que é JS puros .

Se você não sabe quais são os parâmetros de URL será e deseja obter um objeto com as chaves e valores que estão nos parâmetros, você pode usar isto:

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;
}

Chamando getParameters () com uma URL como /posts?date=9/10/11&author=nilbus voltaria:

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

Eu não vou incluir o código aqui, uma vez que é ainda mais longe da pergunta, mas weareon.net postou uma biblioteca que permite a manipulação dos parâmetros na URL demasiado:

Você pode usar o navegador location.search propriedade nativa:

function getParameter(paramName) {
  var searchString = window.location.search.substring(1),
      i, val, params = searchString.split("&");

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

Mas existem alguns plugins jQuery que podem ajudá-lo:

Com base na 999 da resposta :

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

As alterações:

  • decodeURI() é substituído por decodeURIComponent()
  • [?|&] é adicionado no início do regexp

Necessidade de adicionar o parâmetro i para torná-lo insensível caso:

  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");

Por exemplo, uma função que devolve o valor de qualquer variável parâmetros.

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];
        }
    }
}​

E é assim que você pode usar esta função assumindo a URL é,

"http://example.com/?technology=jquery&blog=jquerybyexample".

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

Assim, em variável código acima "tech" terá "jQuery", como valor e "blog" da variável será "jquerybyexample".

Depois de ler todas as respostas acabei com esta versão com + uma segunda função de parâmetros de uso como bandeiras

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)
}

Há um monte de código de buggy aqui e soluções regex são muito lento. Eu encontrei uma solução que funciona até 20x mais rápido do que a contrapartida regex e é elegantemente simples:

    /*
    *   @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 não é o estar-todo e extremidade-toda solução, para este tipo de problema simples manipulação de string pode trabalhar uma quantidade enorme de forma mais eficiente. código fonte .

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

</script>

getURLParameter(id) ou getURLParameter(Id) Funciona da mesma:)

código jQuery trecho de obter as variáveis ??dinâmicas armazenadas no url como parâmetros e guardá-las como variáveis ??JavaScript pronto para uso com seus scripts:

$.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";
    }

}

Eu criei uma função simples para obter URL parâmetro no JavaScript a partir de uma URL como esta:

.....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");

SAÍDA: 18

Apenas no caso de vocês têm a url como localhost / index.xsp? A = 1 # alguma coisa e você precisa para obter o param não o 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];
    }
}

Ligeira modificação da resposta por @pauloppenheim, pois não irá lidar corretamente com os nomes dos parâmetros que podem ser uma parte de outros nomes de parâmetro.

Por exemplo:. Se você tem "appenv" e os parâmetros "env", redeaing o valor para "env" pode pick-up "appenv" value

Fix:

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

Esta ajuda pode.

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top