?

Log in

No account? Create an account
Разбираю гуманитарные вопросы на винтики, функции, алгоритмы. Оживляю технологии
Совмещаю гуманитарный и технический пласты знаний в единое мировоззрение
jQuery POST link 
8th-Apr-2016 01:49 am
HTTP методом GET, зачастую, можно передавать данные весьма ограниченного размера. Ограничения может накладывать как браузер, так и HTTP-сервер. Конечно, всегда можно заменить ссылку с очень длинным URL на web-форму, работающую посредством метода POST.

Но, что если надо "на лету" преобразовать слишком длинную ссылку в "POST-ссылку", т.е. в POST-форму, имеющую вид ссылки? Согласитесь, не слишком элегантное, но полезное решение.

В одном из скриптов переделывать генерацию HTML было "себе дороже", а исправить отдельные неработающие из-за чрезмерной длины ссылки надо было. Поискал готовое решение и ничего не нашел.
Что ж, берем дело в собственные руки:

    <script type="text/javascript" src="/js/jquery/jquery.min.js"></script>

    <script type="text/javascript">
        var $j = jQuery.noConflict();

        /*
            Преобразование длинных GET-ссылок в POST-ссылки
        */
        $j(document).ready( function()
            {
                $j('a').postLink(4096);
            }
        );

        (function($)
        {
            jQuery.fn.postLink = function(max_get_size)
            {
                var make = function()
                {
                    max_get_size = max_get_size || 4096;
                    var href = this.href;
                    var len = href.length;

		// Сквозной счетчик как часть уникальности ID формы
                    if ( ! window['$gid'] ) {
                        window.$gid = 1;
                    }

                    // если ссылка длинее указанной длины (4Кб), превращаем её в post-форму
                    if ( len > max_get_size )
                    {
                        // Сформируем уникальный идентификатор формы
                        var unique = 'f' + window.$gid + '_' + len;
                        window.$gid++;

                        var $this = $(this);

                        var GET_param = href.substring( href.indexOf('?') + 1 ).split('&');
                        var link = href.substring( 0, href.indexOf('?') );

                        var this_form = $('<form/>')
                            .attr('method', 'post')
                            .attr('target', $this.attr('target') || '_self')
                            .attr('action', link)
                            .attr('id', unique)
                            .addClass( "no_padding" );

                        for ( id in GET_param )
                        {
                            var prm = GET_param[id].split('=');
                            var input = $('<input/>')
                                .attr('type', 'hidden')
                                .attr('name', prm[0])
                                .attr('value', prm[1])
                                    .appendTo( $(this_form) );
                        }

                        // получим родителя
                        var parent = $this.parent();

                        // Забиндим сабмит формы на ссылку
                        $this.bind('click', function() {
                            $('#' + unique).submit();
                            return false;
                        } )
                            .attr('href', '')
                            .appendTo( $(this_form) );

                        $(this_form).appendTo( $(parent) );
                    }
                };

                return this.each(make);
            };
        })(jQuery);
    </script>

Вышел небольшой jQuery-плагинчик postLink, который преобразовывает GET-ссылки в выбранном контексте (в примере - все на странице, но работает с любым списочным контекстом jQuery) в POST-ссылки.

Пользуйтесь на здоровье!

Желающие также могут убрать лишние отступы, выставив для задаваемого форме (той, что ссылку подменяет) "по умолчанию" класса no_padding описание
.no_padding {
    padding: 0px;
    margin: 0px;
}

Скачать .js файлом.

Комментарии 
8th-Apr-2016 03:17 am (UTC)
лучше подскажи какой длины должн быть юрл страницы карточки товара в интернет-магазине, что бы роботы нормально индексировали. А то в сети пишут всякое.

Edited at 2016-04-08 06:18 am (UTC)
8th-Apr-2016 01:43 pm (UTC)
Я не СЕОшниу, тему знаю плохо. Могу лишь сказать, что нормальной длиной ЧПУ ссылки поисковики считают 70-75 символов.
10th-Apr-2016 08:24 am (UTC)
есть разное толкование.
Требуют название ссылок на транслите - совпадение названия товара. Но длинные ссылки не любят роботы, вот и появилась цифра с потолка - 70-75.
This page was loaded Oct 21st 2018, 3:04 pm GMT.