Добавление параметра к URL с JavaScript

Вызов mongoose.model устанавливает имя коллекции, к которой привязана модель, причем по умолчанию используется имя с множественным номером с нижней обложкой. Таким образом, с вашим кодом это будет 'models'. Чтобы использовать модель с коллекцией files, измените эту строку на:

var Model = mongoose.model("Model", fileSchema, "files");

или

var Model = mongoose.model("file", fileSchema);

230
задан Lessan Vaezi 28 January 2009 в 08:33
поделиться

7 ответов

Базовое внедрение, которое необходимо будет адаптировать, выглядело бы примерно так:

function insertParam(key, value)
{
    key = encodeURI(key); value = encodeURI(value);

    var kvp = document.location.search.substr(1).split('&');

    var i=kvp.length; var x; while(i--) 
    {
        x = kvp[i].split('=');

        if (x[0]==key)
        {
            x[1] = value;
            kvp[i] = x.join('=');
            break;
        }
    }

    if(i<0) {kvp[kvp.length] = [key,value].join('=');}

    //this will reload the page, it's likely better to store this until finished
    document.location.search = kvp.join('&'); 
}

Это приблизительно дважды с такой скоростью, как regex или основанное на поиске решение, но это зависит полностью от длины querystring и индекса любого соответствия

<час>

медленный regex метод, с которым я сравнил для пользы завершений (приблизительно на +150% медленнее)

function insertParam2(key,value)
{
    key = encodeURIComponent(key); value = encodeURIComponent(value);

    var s = document.location.search;
    var kvp = key+"="+value;

    var r = new RegExp("(&|\\?)"+key+"=[^\&]*");

    s = s.replace(r,"$1"+kvp);

    if(!RegExp.$1) {s += (s.length>0 ? '&' : '?') + kvp;};

    //again, do what you will here
    document.location.search = s;
}
179
ответ дан Nick Volynkin 4 November 2019 в 13:15
поделиться

Хорошо здесь я сравниваю Две функции, один сделанный один (regExp) и другой сделанный (annakata).

массив Разделения:

function insertParam(key, value)
{
    key = escape(key); value = escape(value);

    var kvp = document.location.search.substr(1).split('&');

    var i=kvp.length; var x; while(i--) 
    {
        x = kvp[i].split('=');

        if (x[0]==key)
        {
                x[1] = value;
                kvp[i] = x.join('=');
                break;
        }
    }

    if(i<0) {kvp[kvp.length] = [key,value].join('=');}

    //this will reload the page, it's likely better to store this until finished
    return "&"+kvp.join('&'); 
}

метод Regexp:

function addParameter(param, value)
{
    var regexp = new RegExp("(\\?|\\&)" + param + "\\=([^\\&]*)(\\&|$)");
    if (regexp.test(document.location.search)) 
        return (document.location.search.toString().replace(regexp, function(a, b, c, d)
        {
                return (b + param + "=" + value + d);
        }));
    else 
        return document.location.search+ param + "=" + value;
}

случай Тестирования:

time1=(new Date).getTime();
for (var i=0;i<10000;i++)
{
addParameter("test","test");
}
time2=(new Date).getTime();
for (var i=0;i<10000;i++)
{
insertParam("test","test");
}

time3=(new Date).getTime();

console.log((time2-time1)+" "+(time3-time2));

кажется, что даже с простым решением (когда regexp используют только тест и не вводят функцию .replace), это еще медленнее, чем разделение... Хорошо. Regexp является довольно медленным, но... uhh...

0
ответ дан Paweł Witkowski Photography 4 November 2019 в 13:15
поделиться

Это было моей собственной попыткой, но я буду использовать ответ annakata, поскольку это кажется намного более чистым:

function AddUrlParameter(sourceUrl, parameterName, parameterValue, replaceDuplicates)
{
    if ((sourceUrl == null) || (sourceUrl.length == 0)) sourceUrl = document.location.href;
    var urlParts = sourceUrl.split("?");
    var newQueryString = "";
    if (urlParts.length > 1)
    {
        var parameters = urlParts[1].split("&");
        for (var i=0; (i < parameters.length); i++)
        {
            var parameterParts = parameters[i].split("=");
            if (!(replaceDuplicates && parameterParts[0] == parameterName))
            {
                if (newQueryString == "")
                    newQueryString = "?";
                else
                    newQueryString += "&";
                newQueryString += parameterParts[0] + "=" + parameterParts[1];
            }
        }
    }
    if (newQueryString == "")
        newQueryString = "?";
    else
        newQueryString += "&";
    newQueryString += parameterName + "=" + parameterValue;

    return urlParts[0] + newQueryString;
}

кроме того, я нашел этот плагин jQuery из другого сообщения на stackoverflow, и если Вам нужно больше гибкости, Вы могли бы использовать это: http://plugins.jquery.com/project/query-object

я думал бы, что код будет (не протестировали):

return $.query.parse(sourceUrl).set(parameterName, parameterValue).toString();
3
ответ дан Lessan Vaezi 4 November 2019 в 13:15
поделиться

У меня есть 'класс', который делает это, и здесь это:

function QS(){
    this.qs = {};
    var s = location.search.replace( /^\?|#.*$/g, '' );
    if( s ) {
        var qsParts = s.split('&');
        var i, nv;
        for (i = 0; i < qsParts.length; i++) {
            nv = qsParts[i].split('=');
            this.qs[nv[0]] = nv[1];
        }
    }
}

QS.prototype.add = function( name, value ) {
    if( arguments.length == 1 && arguments[0].constructor == Object ) {
        this.addMany( arguments[0] );
        return;
    }
    this.qs[name] = value;
}

QS.prototype.addMany = function( newValues ) {
    for( nv in newValues ) {
        this.qs[nv] = newValues[nv];
    }
}

QS.prototype.remove = function( name ) {
    if( arguments.length == 1 && arguments[0].constructor == Array ) {
        this.removeMany( arguments[0] );
        return;
    }
    delete this.qs[name];
}

QS.prototype.removeMany = function( deleteNames ) {
    var i;
    for( i = 0; i < deleteNames.length; i++ ) {
        delete this.qs[deleteNames[i]];
    }
}

QS.prototype.getQueryString = function() {
    var nv, q = [];
    for( nv in this.qs ) {
        q[q.length] = nv+'='+this.qs[nv];
    }
    return q.join( '&' );
}

QS.prototype.toString = QS.prototype.getQueryString;

//examples
//instantiation
var qs = new QS;
alert( qs );

//add a sinle name/value
qs.add( 'new', 'true' );
alert( qs );

//add multiple key/values
qs.add( { x: 'X', y: 'Y' } );
alert( qs );

//remove single key
qs.remove( 'new' )
alert( qs );

//remove multiple keys
qs.remove( ['x', 'bogus'] )
alert( qs );

я переопределил toString метод, таким образом, нет никакой потребности назвать QS:: getQueryString, можно использовать QS:: toString или, поскольку я сделал в примерах просто, полагаются на объект, принуждаемый в строку.

19
ответ дан meouw 4 November 2019 в 13:15
поделиться

Попробуйте это.

// uses the URL class
function setParam(key, value) {
            let url = new URL(window.document.location);
            let params = new URLSearchParams(url.search.slice(1));

            if (params.has(key)) {
                params.set(key, value);
            }else {
                params.append(key, value);
            }
        }
1
ответ дан 23 November 2019 в 03:29
поделиться

Спасибо всем за ваш вклад. Я использовал код annakata и изменил его, чтобы также включить случай, когда в URL-адресе вообще нет строки запроса. Надеюсь, это поможет.

function insertParam(key, value) {
        key = escape(key); value = escape(value);

        var kvp = document.location.search.substr(1).split('&');
        if (kvp == '') {
            document.location.search = '?' + key + '=' + value;
        }
        else {

            var i = kvp.length; var x; while (i--) {
                x = kvp[i].split('=');

                if (x[0] == key) {
                    x[1] = value;
                    kvp[i] = x.join('=');
                    break;
                }
            }

            if (i < 0) { kvp[kvp.length] = [key, value].join('='); }

            //this will reload the page, it's likely better to store this until finished
            document.location.search = kvp.join('&');
        }
    }
63
ответ дан 23 November 2019 в 03:29
поделиться

Вот значительно упрощенная версия, в которой делается компромисс между удобочитаемостью и меньшим количеством строк кода вместо микрооптимизированной производительности (и мы говорим о разнице в несколько миллисекунд, реально ... из-за природы этого (работа на местоположение текущего документа), скорее всего, это будет выполнено один раз на странице).

/**
* Add a URL parameter (or changing it if it already exists)
* @param {search} string  this is typically document.location.search
* @param {key}    string  the key to set
* @param {val}    string  value 
*/
var addUrlParam = function(search, key, val){
  var newParam = key + '=' + val,
      params = '?' + newParam;

  // If the "search" string exists, then build params from it
  if (search) {
    // Try to replace an existance instance
    params = search.replace(new RegExp('([?&])' + key + '[^&]*'), '$1' + newParam);

    // If nothing was replaced, then add the new param to the end
    if (params === search) {
      params += '&' + newParam;
    }
  }

  return params;
};

Затем вы могли бы использовать это так:

document.location.pathname + addUrlParam(document.location.search, 'foo', 'bar');
33
ответ дан 23 November 2019 в 03:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: