Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » jQuery » Как научить скрипт работать с несколькими значениями одного поля?

Как научить скрипт работать с несколькими значениями одного поля?


     22.03.2016    Все вопросы » jQuery    1613

вопрос
Доброго времени!

Есть скрипт, который вставляет параметры полей в поля формы из адресной строки (GET-запрос)
(function($){
    jQuery.fn.grabgets = function(options){
        options = $.extend({hidden: true}, options);
        $.extend({
            getUrlVars: function(){
                var vars = [], hash;
                var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
                var h0,h1;
                for(var i = 0; i < hashes.length; i++)
                {
                    hash = hashes[i].split('=');
                    h0 = decodeURIComponent(hash[0]).replace(/\+/g, ' ');
                    h1 = (hash[1] ? decodeURIComponent(hash[1].replace(/\+/g, ' ')) : hash[1]);
                    if (vars[h0]) {
                        if (!$.isArray(vars[h0])) vars[h0] = [vars[h0]];
                        vars[h0].push(h1);
                    } else {
                        vars[h0] = h1;
                    }
                }
                return vars;
            }
        });
        var form = $(this);
        var make = function(){
            var arr = $.getUrlVars();
            if (form.length != 0) {
                form.find('input[type="text"], input[type="number"], input[type="date"], input[type="color"], input[type="range"], input[type="month"], input[type="week"], input[type="time"], input[type="datetime"], input[type="datetime-local"], input[type="email"], input[type="search"], input[type="tel"], input[type="url"]').each( function() {
                    var iname = $(this).attr('name');
                    var ival = arr[iname];
                    if (ival)
                    {
                        $(this).val(ival)
                    };
                });
                if ( options.hidden ) {
                        form.find('input[type="hidden"]').each( function() {
                        var iname = $(this).attr('name');
                        var ival    = arr[iname];
                        if (ival) {
                            $(this).val(ival);
                        }
                });
                }
                form.find('textarea').each( function() {
                    var iname = $(this).attr('name');
                    var ival    = arr[iname];
                    if (ival) {
                        $(this).html(ival);
                    }
                });
                form.find('select').each( function() {
                    var iname = $(this).attr('name');
                    $(this).find('option').each( function() {
                     var ival = $(this).val();
                        if ( arr[iname] == ival || $.inArray(ival, arr[iname]) != -1 ) {
                            $(this).prop('selected', true)
                        }
                    });
                });
                form.find('input[type="checkbox"], input[type="radio"]').each( function() {
                    var iname = $(this).attr('name');
                    var ival = $(this).val();
                    if ( arr[iname] == ival || $.inArray(ival, arr[iname]) != -1 ) {
                        $(this).attr('checked', 'checked');
                    }
                });
            };
        };
        return form.each(make);
    };
})(jQuery);
$(document).ready(function(){
    $('#form').grabgets({hidden:false});
});

Все в принципе работает. Но только в том случае, если не передаются несколько значений одного поля (или селекта), т.е. если указать name="fieldname[]", то параметры не вставляются обратно.

Помогите пожалуйста решить данную проблему, если это решаемо.

Ответил: Sander


Для параметров fieldname[]
var ival = arr[iname];

Нужно указывать порядковый номер:
var ival = arr[iname][0];



Как вариант (не тестировал):
if ($.isArray(arr[iname])) var ival = arr[iname].shift();
else var ival = arr[iname];

2 комментария

LazyDev
PHP-developer

LazyDev - 22 марта 2016 23:30 -

Вот держи нормальный скрипт вставки :
$(function(){

    var filterSearch = decodeURIComponent(location.search).slice(1).split('&');

    for(var i = 0; i < filterSearch.length; i++){
        filterSearch[i] = filterSearch[i].split('=');
        filterSearch[i][0] = filterSearch[i][0].replace(/\+/g, " ");
        filterSearch[i][1] = filterSearch[i][1].replace(/\+/g, " ");
    }

    if(filterSearch.length != 0){
        $('input[type="text"]').each(function(i){
            for(var i = 0; i < filterSearch.length; i++){
                if($(this).attr('name') == filterSearch[i][0]){
                    $(this).val(filterSearch[i][1]);
                }
            }
        });

        $('input[type="hidden"]').each(function(i){
            for(var i = 0; i < filterSearch.length; i++){
                if($(this).attr('name') == filterSearch[i][0]){
                    $(this).val(filterSearch[i][1]);
                }
            }
        });

        $('select').each(function(i){
            for(var i = 0; i < filterSearch.length; i++){
                if($(this).attr('name') == filterSearch[i][0]){
                    $(this).children('option').each(function(n){
                        if($(this).val() == filterSearch[i][1]){
                            $(this).attr('selected', true);
                        }
                    });
                }
            }
        });

        $('input[type="radio"], input[type="checkbox"]').each(function(i){
            for(var i = 0; i < filterSearch.length; i++){
                if($(this).attr('name') == filterSearch[i][0] && $(this).val() == filterSearch[i][1]){
                    $(this).attr('checked', 'checked');
                }
            }
        });
    }

});

Мой блог: LazyDev.pro

Помогаю с решением проблем на платной основе.

ravchik
Юзер

ravchik - 23 марта 2016 08:36 -

не работает...
правда у меня адресная строка немного другая, вида
site.ru/s/field1:value1/field2:value2

поэтому немного изменил код
$(function(){

    var filterSearch = decodeURIComponent(location.search).slice(2).split('/');

    for(var i = 0; i < filterSearch.length; i++){
        filterSearch[i] = filterSearch[i].split(':');
        filterSearch[i][0] = filterSearch[i][0].replace(/\+/g, " ");
        filterSearch[i][1] = filterSearch[i][1].replace(/\+/g, " ");
    }

    if(filterSearch.length != 0){
        $('input[type="text"]').each(function(i){
            for(var i = 0; i < filterSearch.length; i++){
                if($(this).attr('name') == filterSearch[i][0]){
                    $(this).val(filterSearch[i][1]);
                }
            }
        });

        $('input[type="hidden"]').each(function(i){
            for(var i = 0; i < filterSearch.length; i++){
                if($(this).attr('name') == filterSearch[i][0]){
                    $(this).val(filterSearch[i][1]);
                }
            }
        });

        $('select').each(function(i){
            for(var i = 0; i < filterSearch.length; i++){
                if($(this).attr('name') == filterSearch[i][0]){
                    $(this).children('option').each(function(n){
                        if($(this).val() == filterSearch[i][1]){
                            $(this).attr('selected', true);
                        }
                    });
                }
            }
        });

        $('input[type="radio"], input[type="checkbox"]').each(function(i){
            for(var i = 0; i < filterSearch.length; i++){
                if($(this).attr('name') == filterSearch[i][0] && $(this).val() == filterSearch[i][1]){
                    $(this).attr('checked', 'checked');
                }
            }
        });
    }

});

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

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

наверх