Pregunta

Estoy buscando un complemento jQuery que pueda obtener parámetros de URL y que admita esta cadena de búsqueda sin generar el error de JavaScript: " secuencia URI mal formada " ;. Si no hay un complemento de jQuery que admita esto, necesito saber cómo modificarlo para admitirlo.

?search=%E6%F8%E5

El valor del parámetro de URL, cuando se decodifique, debe ser:

æøå

(los caracteres son noruegos).

No tengo acceso al servidor, por lo que no puedo modificar nada en él.

¿Fue útil?

Solución 10

¡No debes usar jQuery para algo como esto!
La forma moderna es utilizar pequeños módulos reutilizables a través de un gestor de paquetes como Bower.

He creado un pequeño módulo que puede analizar la cadena de consulta en un objeto. Úsalo así:

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

Otros consejos

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

A continuación se muestra lo que he creado a partir de los comentarios aquí, así como la solución de errores que no se mencionan (como el hecho de que devuelvan un valor nulo y no 'nulo'):

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

Lo que realmente quieres es el complemento del analizador de URL jQuery . Con este complemento, obtener el valor de un parámetro de URL específico (para la URL actual) se ve así:

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

Si desea que un objeto con nombres de parámetros como claves y valores de parámetros como valores, simplemente llame a param () sin un argumento, como este:

$.url().param();

Esta biblioteca también funciona con otras direcciones URL, no solo con la actual:

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

Dado que se trata de una biblioteca de análisis de URL completa, también puede obtener otra información de la URL, como el puerto especificado o la ruta, el 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'

También tiene otras características, revisa su homepage para obtener más documentos y ejemplos.

En lugar de escribir su propio analizador URI para este propósito específico que kinda funciona en la mayoría de los casos , use un analizador URI real. Dependiendo de la respuesta, el código de otras respuestas puede devolver 'null' en lugar de null , no funciona con parámetros vacíos (? Foo = & amp; bar = x ), no puede analizar y devolver todos los parámetros a la vez, repite el trabajo si consulta repetidamente la URL para los parámetros, etc.

Use un analizador URI real, no invente el suyo.

Para aquellos aversos a jQuery, hay una versión del complemento que es JS puro .

Si no sabe cuáles serán los parámetros de la URL y desea obtener un objeto con las claves y los valores que se encuentran en los parámetros, puede usar esto:

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

Llamar a getParameters () con una url como / posts? date = 9/10/11 & amp; author = nilbus devolverá:

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

No incluiré el código aquí porque está aún más lejos de la pregunta, pero weareon.net publicó una biblioteca que permite la manipulación de los parámetros en la URL también:

Puede utilizar el navegador nativo location.search propiedad:

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

Pero hay algunos complementos de jQuery que pueden ayudarte:

Basado en la respuesta de 999 :

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

Cambios:

  • decodeURI () se reemplaza por decodeURIComponent()
  • [? | & amp;] se agrega al comienzo de la expresión regular

Es necesario agregar el parámetro i para que no distinga mayúsculas y minúsculas:

  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 ejemplo, una función que devuelve el valor de cualquier variable de 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];
        }
    }
}​

Y así es como puede usar esta función asumiendo que la URL es,

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

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

Entonces, en la variable de código anterior " tech " tendrá " jQuery " como valor y " blog " las variables serán " jquerybyexample " ;.

Después de leer todas las respuestas, terminé con esta versión con + una segunda función para usar los parámetros como indicadores

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

Aquí hay un montón de código de buggy y las soluciones de expresiones regulares son muy lentas. Encontré una solución que funciona hasta 20 veces más rápido que la contraparte de expresiones regulares y es elegantemente simple:

    /*
    *   @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 no es la solución definitiva y definitiva, para este tipo de problema, la simple manipulación de cadenas puede funcionar de manera mucho más eficiente. Fuente de código .

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

</script>

getURLParameter (id) o getURLParameter (Id) funciona de la misma manera:)

Fragmento de código de jQuery para obtener las variables dinámicas almacenadas en la url como parámetros y almacenarlas como variables de JavaScript listas para usar con sus 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";
    }

}

Creé una función simple para obtener el parámetro de URL en JavaScript desde una 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");

SALIDA: 18

En caso de que tengan la url como localhost / index.xsp? a = 1 # algo y necesitan obtener el parámetro no el 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];
    }
}

Modificación leve de la respuesta por @pauloppenheim, ya que no manejará correctamente los nombres de parámetros que pueden formar parte de otros nombres de parámetros.

Por ejemplo: si tiene " appenv " &erio; " env " parámetros, redefiniendo el valor de " env " puede recoger " appenv " valor.

Corrección:

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

Esto puede ayudar.

<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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top