Запросы к JavaScript

    Есть необходимость: передавать параметры непосредственно JavaScript.
    Мы можем передавать параметры через GET, POST, но при передаче этих параметров просто будет загружаться новая страница, т.е. если в кеше браузера есть

    some.so/index.php?id=2

    а мы запрашиваем

    some.so/index.php?id=3

    то сервер для нас сгенерирует новую страницу, он не будет брать из кеша some.so/index.php?id=2 (и правильно будет делать).

    Таже самая ситуация и с POST, поэтому говорить о том, что методами GET и POST можно передать параметры яваскрипту конечно можно, но это будет не совсем правдой. Т.к. параметры передаются на сервер, там генерируется новый контент, а там можно что угодно делать. Хоть напрямую GET переменные брать из window.location.href, хоть как-то серверным языком каждый раз заново генерить JavaScript. а это всё только имитация запросов к JavaScript.

    Однако, есть один символ в стандарте URL, который нам поможет.



    Это символ решетки (#), хотя некоторые говорят, что это символ английской денежной единицы, но сейчас это не важно.

    Весь фокус в том, что если в кеше есть

    some.so/index.php#id:2

    а мы запросим

    some.so/index.php#id:3

    то вторая страница будет взята из кеша (в который она попала после первого запроса).

    Итак, перейдем к делу: после символа решетки в URL разрешено использовать символы
    : _ — .
    и любые латинские символы.

    Пусть пара (ключ: значение) у нас будут разделяться точкой; сам ключ отделяться от значения двоеточием, а экранирование будем делать при помощи подчеркивания.

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

    some.so/index.php#id:2.par2:dgsdgd

    если хотим передать символы точки, двоеточия или не латинские символы, то делаем это так:

    some.so/index.php#id:_56_34.par2:_21_20_54

    От обычных ссылок some.so/index.php#chapter7 такие запросы к JavaScript (jR = JavaScript Request) можно отличать по наличию двоеточия (:) после #, т.к. я не разу не видел, чтобы там кто-то ставил двоеточие.

    Написать js функции, которые будут обрабатывать jR не составляет труда, — берем window.location.href, обрезаем его регэкспом, сплитим строку в массив, сплитим элементы массива на ключ и значение. Вот и всё.

    Это реально работает, и реально бережет трафик, дает веселые эффекты с AJAX, в общем, экспериментируйте.

    Конечно, ТБЛ не очень бы порадовался такому использованию, но всё таки, думаю, клиентский JavaScript заслужил то, что теперь он будет иметь возможность получать параметры непосредственно для себя. Ура!
    Поделиться публикацией

    Комментарии 25

      +1
      А где это может пригодится? можете привести пример сценария?
        0
        к примеру фотогалерея на аяксе
        ссылка вида some.so/gallery#photo12 откроет галерею, а там яваскрипт просмотрит есть ли чтонибудь в параметрах window.location.hash (это как раз все после решетки)

        правда были заковырки с эксплорером, при указании window.location.hash = 'something', он не обновлял адресую строку. Когдато я с этим боролся, но не помню на чем остановился.

        Плюс для полноценного использования эти переходы должны запоминаться в history. В эксплорере опять же с этим были проблемы, нужно было создавать iframe и в нем реально чтото листать. В лисе все было без заковырок.
          0
          за такое на проекте у нас бьют по рукам. и правильно.
            0
            не понял :(
            это для того, чтобы не перегружать всю страницу целиком, а изменить только фотографию?
              0
              именно
              основная проблема этого подхода в том что поисковики не проиндексируют этот контент никак

              а сам топик мутный совершенно
                0
                смутно начинаю представлять: в линках "к следующей фотографии" и "к предыдущей" будет стоять вот такая ссылка, как Вы описали в статье, к ссылке привязан обработчик события (или обработчик нужно привязывать к событию onload() всей страницы? уточните пожалуйста) который асинхронно подгружает фотку и описание.
                если обычный браузер щелкает по ссылкам, то с сервера грузится только описание и фотография, если же поисковик, то грузится вся страница с описанием и фотографией.
                правильно я понимаю?
                  0
                  разберемся последовательно:
                  - статью писал не я
                  - событие onload не сработает так как не было перезагрузки страницы
                  еcли уж сильно хочется такое событие сделать то можно переодически проверять не изменился ли window.location.hash
                  - поисковики вроде яваскрипт пока не исполняют и то что они увидят по адресу http://sss.aa/ddd ничем не будет отличатся от http://sss.aa/ddd#asda


                  Подобную систему в работе я видел в гугловских фотогалереях picasaweb.google.com
                  Им индексация и не тарахтела )))
            0
              0
              Ух ты, спасибо. Вот и применение в реально работающем проекте.
              Хотя я конечно догадывался, что не первые мы стали такое внедрять. Все кто хотели увидеть применения, — ссылка выше.
            0
            я почему-то думал, что # - это якорь
              +1
              Я и сейчас так думаю. А параметры в яваскрипт сервер должен передавать через тег SCRIPT и не как иначе.
                –1
                поддерживаю на 100%. автор, вероятно, не знает, что такое копаться в коде, который был написал пол-года назад.
                  0
                  Если застандартизировать jR, то никто путаться не будет, а копаться в коде, который был написан полгода назад всегда будет сложно.
                    0
                    объясните мне следующее. как после перезагрузки страницы перепрыгнуть к определенному элементу, если использовать ваш, так называемый, jR?
                    у нас на проекте это реально используется. я на собственном опыте знаю, чем все такое заканчивается. пишется "свой собственный под-фреймворк", который выбрасывается в следующей фазе, так как он становится настоолько неуправляемым, что поддерживать его становится себе дороже.
                    в Вашем случае необходимо будет различать, это реально якорь, или просто параметры для js, появятся общие функции, которые будут каждый раз это все дело парсать и все это превратиться в неуправляемый флейм на страницах и в коде. _imho_, гораздо дешевле придерживаться стандартов (в данном случае, передавать параметры через GET, POST, куки), чем изобретать велосипед и прикручиваить к нему костыли, чтобы поддержать стандартную функциональность.
                      +1
                      При всем уважении к вашему опыту, всё таки считаю, что технология имеет право на жизнь.

                      Отделять обычные якори от jR предполагается (в большом тексте это написано) по простому правилу: есть двоеточие после символа решотки, — значит, — jR, нету, — значит обычный якорь. Всё это решаемо.

                      Ещё раз повторю: это не «стандартная функциональность». И я не вижу сейчас способов сделать что-то подобное по-другому.
                0
                Якорь. Вы имеете конструкцию
                Да так было в HTML, но с приходом XML/XHTML/RDF его можно и нужно использовать для других целей. Т.е. теперь это, — указатель на какую-то часть, допустим, XML документа.

                Конечно, использования '#' для передачи параметров JavaScript не описано стандартом, но и не особо запрещено, если честно.

                Всё что там сказано, — это то, что часть после решотки должна удовлетворять [a-zA-Z][a-zA-Z_.:-]*
                +1
                Зачем необходимо загрязнять URL, если можно, к примеру, свободно манипулировать глобальными javascript-переменными или скрытыми полями.

                Не совсем понятно применение данной методики?
                Можно пример?
                  +1
                  В ряде случаев (в качестве примитивного примера - поиск) загрязнение URL может быть полезным - человек может скопировать URL из адресной строки и передать его кому-либо, вместо объяснения "набери в строке поиска такую-то фразу и выставь такие-то параметры поиска (при использовании расширенного поиска)".
                  Но. # - это все же якорь и не стоит использовать его иначе без необходимости, хотя бы из уважения к стандартам и чтобы не путать пользователей, которые могут воспринять этот символ буквально - как якорь.
                  Переменные при обновлении страницы через AJAX можно хранить как угодно - ничего с ними не сделается. Чтобы передавались в JS при переходе по ссылке с внешнего ресурса - обычные GET-запросы (пусть хоть сервером обрабатываются, хоть JS - зависит от задачи).
                  Остается одна проблема - продемонстрировать переход к новой информации в строке адреса для пользователя. Наверняка есть какое-то решение без использования символа "#".
                    0
                    Остается одна проблема - продемонстрировать переход к новой информации в строке адреса для пользователя. Наверняка есть какое-то решение без использования символа "#".

                    К сожалению, нет. Если вы меняете url, то запрос будет отправляться на сервер если точно такого-же запроса небыло раньше. Единственное исключение, — это использовать символ '#'. Если бы в W3C сделали подобные конструкции в URL, то я бы и не предлагал использовать '#'.
                    0
                      0
                      Передача через GET кирилицы, — это не большее загрязнение URL, чем использование jR. Одинако это грязно.
                      HTTP GET и jR были созданы для разных потребностей, их нельзя сравнивать, просто лучше выписать, — какие характеристики имеет один способ, какие другой.

                      Если коротко, — то при использовании jR не происходит обращение к серверу (если страница в кеше), а GET удобно использовать для seo-шников совместно с mod_rewrite, допустим (чтоб красиво было).

                      Каждый метод хорош, и имеет свои характерные отличия от других.
                      +2
                      и вот ведь что любопытно... флешеры подобную технику уже несколько лет как используют. и уже наспотыкались и обошли кучу граблей, даже тех о которых комментаторы пока не догадываются :)
                      попробуйте подсмотреть у них
                        0
                        Огромное спасибо за подсказку.
                          0
                          да не за что.
                          новое обычно это либо хорошо забытое старое, либо еще не подсмотренное из других(иногда смежных) областей знаний :)
                          +1
                          Здесь, кстати, и кроется ответ на то, о чем все спорят выше.

                          На сегодняшний день Rich Internet Applications (RIA) и AJAX, — две технологии, которые могут быть использованы для написания полноценных web applications.

                          Первая, — flash based, вторая, — JavaScript based.

                          При достижении определенного уровня и объема приложения (сервиса, сайта, называйте как хотите) появилось желание передавать параметры непосредственно этому приложению (которое физически находится в кеше браузера), — без запросов к серверу.

                          А раз появляется желание, то мы его и удовлетворили, для этого заюзали что могли, — символ решетки.

                          Думаю, кстати, что если ТБЛ написать, то он возможно согласится, что в URL просто тупо надо добавить возможность таких запросов, только уже не полулегальным через решетку а цивилизованным, — через специальные конструкции, — возможно какой-то другой символ.

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое