Сайт о телевидении

Сайт о телевидении

» » Библиотека JavaScript History API: Назад в будущее. Управление историей для пользы и развлечения. Когда можно будет использовать

Библиотека JavaScript History API: Назад в будущее. Управление историей для пользы и развлечения. Когда можно будет использовать

Всем привет.
Тут проскакивала эта тема, не могу найти.
Подскажите, пожалуйста - где можно скачать новый XEvil 4.0?

Очень нужно! (это программа для обхода любой капчи, включая РеКапчу2).
Отблагодарю Биткоинами!

Mashalot2017@gmail точка com



Вы будете удивлены, но это свершившийся факт,
о котором пока мало кто знает: СМИ молчат, ушалости не желая этого замечать.


Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

См. YouTube "XEvil ReCaptcha2"

Вы будете удивлены, но это свершившийся факт,
о котором пока мало кто знает: СМИ молчат, ушалости не желая этого замечать.

XEvil 4.0 - революционное приложение, способное обходить практически любую антибот-защиту.
Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

См. YouTube "XEvil ReCaptcha2"

Вы будете удивлены, но это свершившийся факт,
о котором пока мало кто знает: СМИ молчат, ушалости не желая этого замечать.

XEvil 4.0 - революционное приложение, способное обходить практически любую антибот-защиту.
Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

См. YouTube "XEvil ReCaptcha2"

XEvil 4.0 - революционное приложение, способное обходить практически любую антибот-защиту.
Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

См. YouTube "XEvil ReCaptcha2"

XEvil 4.0 - принципиально новый софт, способный обходить практически любую антибот-защиту.
Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

См. YouTube "XEvil ReCaptcha2"

XEvil 4.0 - революционное приложение, способное обходить практически любую антибот-защиту.
Распознавание капчи Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com и свыше 8400 тысяч других типов!

Подробности на официальном сайте XEvil.Net, есть бесплатная демо-версия.

См. YouTube "XEvil ReCaptcha2"

До появления HTML5 единственное, что мы не могли контролировать и управлять (без перезагрузки контента или хаков с location.hash) - это история одного таба. С появлением HTML5 history API все изменилось - теперь мы можем гулять по истории (раньше тоже могли), добавлять элементы в историю, реагировать на переходы по истории и другие полезности. В этой статье мы рассмотрим HTML5 History API и напишем простой пример, иллюстрирующий его возможности.

Основные понятия и синтаксис History API опирается на один DOM интерфейс - объект History. Каждый таб имеет уникальный объект History, который находится в window.history . History имеет несколько методов, событий и свойств, которыми мы можем управлять из JavaScript. Каждая страница таба(Document object) представляет собой объект коллекции History. Каждый элемент истории состоит из URL и/или объекта состояния (state object), может иметь заголовок (title), Document object, данные форм, позиция скролла и другую информацию, связанную со страницей.

Основные методы объекта History:

  • window.history.length: Количество записей в текущей сессии истории
  • window.history.state: Возвращает текущий объект истории
  • window.history.go(n) : Метод, позволяющий гулять по истории. В качестве аргумента передается смещение, относительно текущей позиции. Если передан 0, то будет обновлена текущая страница. Если индекс выходит за пределы истории, то ничего не произойдет.
  • window.history.back() : Метод, идентичный вызову go(-1)
  • window.history.forward() : Метод, идентичный вызову go(1)
  • window.history.pushState(data, title [, url]) : Добавляет элемент истории.
  • window.history.replaceState(data, title [, url]) : Обновляет текущий элемент истории
  • Для перехода на 2 шага назад по истории можно использовать:
    history.go(-2)
    Для добавления элементов истории мы можем использовать history.pushState:
    history.pushState({foo: "bar"}, "Title", "/baz.html")
    Для изменения записи истории мы можем использовать history.replaceState:
    history.replaceState({foo: "bat"}, "New Title") Живой пример Теперь мы знаем основы, давайте посмотрим на живой пример. Мы будем делать веб файловый менеджер, который позволит вам найти URI выбранного изображения(). Файловый менеджер использует простую файловую структуру, написанную на JavaScript. Когда вы выбираете файл или папку картинка динамически обновляется.

    Мы используем data-* атрибуты для хранения заголовка каждой картинки и используем свойство dataset для получения этого свойства:

  • crab2.png

  • Чтобы все работало быстро мы подгружаем все картинки и обновляем атрибут src динамически. Это ускорение создает одну проблему - оно ломает кнопку назад, поэтому вы не можете переходить по картинками вперед или назад.

    HTML5 history приходит на помощь! Каждый раз когда мы выбираем файл создается новая запись истории и location документа обновляется (оно содержит уникальный URL картинки). Это означает, что мы можем использовать кнопку назад для обхода наших изображений, в то время как в строке адреса у нас будет прямая ссылка на картинку, которую мы можем сохранить в закладки или отправить кому-либо.

    Код У нас есть 2 дива. Один содержит структуру папок, другой содержит текущую картинку. Все приложение управляется с помощью JavaScript. В будут освещены только самые важные моменты. Исходный код примера очень короткий (порядка 80 строк) посмотрите его после прочтения всей статьи.

    Метод bindEvents навешивает обработчики для события popstate , который вызывается, когда пользователь переходит по истории и позволяет приложению обновлять свое состояние.
    window.addEventListener("popstate", function(e){ self.loadImage(e.state.path, e.state.note); }, false);
    Объект event , который передается в обработчик события popstate имеет свойство state - это данные, которые мы передали в качестве первого аргумента pushState или replaceState .

    Мы навешиваем обработчик на событие click на див, который представляет нашу файловую структуру. Используя делегацию событий, мы открываем или закрываем папку или загружаем картинку (с добавлением записи в историю). Мы смотрим на className родительского элемента для того, чтобы понять на какой из элементов мы нажали:
    - Если это папка мы открываем или закрываем её
    - Если это картина, то мы показываем её и добавляем элемент истории

    Dir.addEventListener("click", function(e){ e.preventDefault(); var f = e.target; // Это папка if (f.parentNode.classList.contains("folder")) { // Открываем или закрываем папку self.toggleFolders(f); } // Это картинка else if (f.parentNode.classList.contains("photo")){ note = f.dataset ? f.dataset.note: f.getAttribute("data-note"); // отрисовываем картинку self.loadImage(f.textContent, note); // добавляем элемент истории history.pushState({note: note, path:f.textContent}, "", f.textContent); } }, false);
    Метод, который изменяет содержимое картинки и обновляет её подпись очень прост:
    loadImage: function(path, note){ img.src = path; h2.textContent = note; }
    Мы получили простое приложение , демонстрирующее возможности обновленного интерфейса объекта History . Мы используем pushState для добавления элемента истории и событие popstate для обновления содержимого страницы. Кроме этого при клике на картинку мы получаем в адресной строке её действительный адрес, который мы можем сохранить или отправить кому-нибудь.

    Когда можно будет использовать? Firefox 4+
    Safari 5+
    Chrome 10+
    Opera 11.5+
    iOS Safari 4.2+
    Android 2.2+
    IE ???
    Список браузеров , поддерживающих history API

    Великий и могучий Интернет прочно вошел в нашу жизнь и развивается не только высокими темпами, но и часто неисповедимыми путями. Именно поэтому многие блестящие новаторские решения вынужденно дожидаются лучших времен, т.к. не могут в полной мере функционировать в неспокойном океане сети, где браузеры, воюя за превосходство либо устанавливают свои правила, либо игнорируют чужие. Не обошла такая участь и замечательную API истории HTML5. Речь в этой статье пойдет о миниатюрной и простой библиотеке History, российского программиста Дмитрия Пахтинова, которая позволяет пользоваться всеми замечательными способностями History API без опасения быть отвергнутым старыми и/или капризными браузерами.



    Кратко напомню, что History API это небольшой набор методов JavaScript объекта window.history, которые позволяет управлять историей браузера, например записывать в историю требуемые адреса - history.pushState(), реагировать на события нажатия кнопок браузера "Вперед" и "Назад" - событие popstate, переписывать текущее состояние - history.replaceState() и т.д. Весь этот простой набор, однако позволяет разработчику создавать ультрасовременные динамические сайты, на которых подгрузка контента происходит без перезагрузки страницы, но при этом по доброй старой традиции меняется запись в адресной строке, заполняется история и поддерживается полноценная навигация по пройденным, а на самом деле - динамически подгруженным страницам.

    Такая структура очень удобна и современна, наиболее популярные сайты (читай социальные сети, и даже не будем показывать пальцем, какие) успешно взяли ее на вооружение. Страница не мелькает и не дергается при загрузке новой информации, как это обычно происходит при перезагрузке, продолжает работать запущенный медиа-плеер, или иной процесс на странице. Повторяю, это достигается отменой перезагрузки страницы при переходе по ссылкам, и манипуляцией адресной строкой и историей из JavaScript. И все бы было чудесно, но беде случилась все та же - не поддержка History API старыми браузерами. В результате, разработчикам приходилось использовать громоздкие решения сторонних библиотек и прочие костыли. Но теперь, я с удовольствием сообщаю, что проблеме пришел конец в лице программиста devote и его библиотеки history.js.

    Библиотека history.js по сути просто позволяет полноценно пользоваться способностями History API без опаски быть "непонятым" старыми браузерами и их пользователями. Так что если вы уважающий себя разработчик и желаете писать сайты по последнему слову техники, то можете смело за это браться. Библиотека history.js тестирована на таких старых браузерах как Opera 9+, FireFox3+, Internet Explorer 7+. Основные преимущества библиотеки в том, что она миниатюрна и полностью адаптивна. History.js использует стандартные методы History API, и при необходимости даже может быть легко удалена из сайта безо всякого нарушения его функциональности.

    Библиотека history.js очень проста в применении.

    Подключение библиотеки может сопровождаться внесением трех параметров:

    • basepath - базовый путь к сайту, по умолчанию имеет значение корня "/".
    • redirect - преобразование ссылок, по умолчанию true(включено).
    • type - строка начала якоря, по умолчанию ничего не подставляет

    Первый параметр необходим, если сайт помещен не в корневую директорию домена, а в одну из внутренних папок, тогда часть пути указанная в basepath будет дописываться в начало всех ссылок, обеспечивая корректные переходы Вторые два параметра служат для придания эстетической красоты ссылкам: redirect - убирает из ссылок символ якоря #, который необходим для совместимости со старыми браузерами. Дело в том, что в старых браузерах невозможно поменять ссылку в адресной строке не перезагрузив при этом страницу, и чтобы обойти это досадное свойство стали использовать метод якоря, который по спецификации ссылается на некое место текущей страницы, и не допускает обновления. А вот новые браузеры, знающие, что такое history.pushState(), не нуждаются в этом костыле, и параметр redirect умеет "очищать" ссылку для них, но добавлять символ # в адрес тем, кому history.pushState() не ведом. type - также служит для причесывания вида ссылок в строке, например чтобы якорь начинался со знака слеш.

    Параметры basepath, redirect и type можно комбинировать при вызове:

    History-1.2.6.min.js?type=/&redirect=fal se&basepath=/pathtosite/

    // порядок опций не имеет значение.

    Далее, я не стану вдаваться в подробности динамической загрузки контента, т.к. методы AJAX выходят далеко за рамки данной статьи. Основная идея состоит в том, чтобы при клике по ссылке, отменить перезагрузку (return false), подгрузить нужный контент (ajax) и записать путь в историю (pushState). Но прежде всего, нужно повесить обработчик на событие popstate, реагирующее на нажатие кнопок браузера "Вперед" и "Назад". Так разработчик описывает эту процедуру:

    на чистом JS:


    Window.onload = function() {

    // функция для ссылок обрабатывается при клике на ссылку

    Function handlerAnchors() {

    History.pushState(null, null, this.href);

    // не даем выполнить действие по умолчанию

    Return false;

    Var anchors = document.getElementsByTagName("a");

    For(var i = 0; i < anchors.length; i++) {

    Anchors[ i ].onclick = handlerAnchors;

    // вешаем событие на popstate которое срабатывает при нажатии back/forward в браузере

    Window.onpopstate = function(e) {

    // получаем нормальный объект Location

    /* заметьте, это единственная разница при работе с данной библиотекой,

    * так как объект document.location нельзя перезагрузить, поэтому

    * библиотека сформированный Location объект посылает через объект event

    Var returnLocation = e.location || document.location;

    // тут можете вызвать подгруздку данных и т.п.

    // просто сообщение

    Alert("Мы вернулись на страницу со ссылкой " + returnLocation.href);

    My Link

    Before the advent of HTML5, one thing that we — as web developers — were not able to control and manipulate is the session history of a particular browsing context. Not without incurring page reloads or relying on location.hash workarounds. This is all set to change however: the HTML5 history API provides a means to perform tasks such as moving forward and backward in the session history, adding new entries into the history, and so on. In this article we"ll look at the API"s basic syntax along with a simple example to show you what"s possible.

    Opera 11.50 and later support the complete API, including the pushState() and replaceState() methods, the history.state object, and the popstate event.

    Basic concepts and syntax

    The History API relies on a single DOM interface — the History object. There is a unique History object defined for each tab, accessed through the history attribute of the Window interface. This can be manipulated using JavaScript along with some special methods. To relate this to the actual pages in your session history, each Document object is associated with a unique instance of the tab"s History object (they all model the same underlying session history).

    History objects represent each tab"s session history as a flat, comma-separated list of session history entries. Each session history entry consists of a URL or a state object (or both), and in addition can have a title, a Document object, form data, a scroll position, and other information associated with it.

    The basic methods of the history object are:

    • window.history.length: Returns the number of entries in the joint session history.
    • window.history.state: Returns the current state object.
    • window.history.go(n) : Goes backwards or forwards by the specified number of steps in the joint session history. If the value you specify is zero, it will reload the current page. If it would cause the target position to be outside the available range of the session history, then nothing happens.
    • window.history.back() : Goes backwards by one step in the joint session history. If there is no previous page to go to, it does nothing.
    • window.history.forward() : Goes forwards by one step in the joint session history. If there is no next page to go to, it does nothing.
    • window.history.pushState(data, title [, url]) : Pushes the data specified in the arguments onto the session history, with the given title and URL (the URL is optional).
    • window.history.replaceState(data, title [, url]) : Updates the current entry in the session history, with the given data, title and URL (the URL is optional).

    For example, to navigate backwards by two history session entries, the following code can be used:

    History.go(-2)

    To add history entries with history.pushState , we"d do something like this:

    History.pushState({foo: "bar"}, "Title", "/baz.html")

    Currently the 2nd argument of pushState and replaceState — the title of the history entry — isn"t used in Opera"s implementation, but may be one day.

    To replace a history entry using history.replaceState , we would do this:

    History.replaceState({foo: "bat"}, "New Title")

    The (optional) state object argument for pushState and replaceState can then be accessed in history.state .

    A real example

    Now we"ve seen the basics, let’s look at a real example. This particular example is a web-based file explorer to help you find a URI of a particular image (view the example running live), with a simple JavaScript-based expanding/collapsing folder structure. When you select a file in the folder, the image is dynamically updated on the screen.

    We are using custom data-* attributes to store each image"s caption, and then using the dataset property to access these and print them underneath their respective images:

  • crab2.png
  • Now, there is something clever going on here - when we access the main viewer.html page with a browser that supports the history API, then open a folder and click on an image, it looks like we are visiting a new page. But in fact this is not the case - every time an image is selected, it is dynamically loaded into the viewer.html page and a new history entry is written using the history API. This way, the user experience is far snappier as we aren"t loading an entire new page each time a new image is selected, and the history API usage means that we are still able to use the back button to go between different images.

    But there"s more - each page is also available at a separate URL, as a separate HTML file, so the demo will gracefully degrade in non-supporting browsers, and you can bookmark the URLs and go straight back to them. Try for example, going straight to crab.html in a browser, even one that doesn"t support the History API, or one that has JavaScript turned off completely!

    Walking through the code

    The HTML is pretty self-explanatory — two s sat next to one another, the left one containing the folder structure inside nested lists, and the right one providing a space to display the pictures. The dynamic functionality is all controlled via the linked JavaScript file, app.js . Apart from images and CSS, the demo relies on a single constructor function, FilePreview . We"ll only highlight relevant portions here, but the code is quite short (only 80 lines) and we encourage you to have a look at it all.

    In the bindEvents method, we set up event handlers for the popstate event on the document, as that will allow the application to know that the history has been navigated and to update the page accordingly.

    Window.addEventListener("popstate", function(e){ if (history.state){ self.loadImage(e.state.path, e.state.note); } }, false);

    Note that the event object that gets passed into the listener has a state property which corresponds to the state argument (if any) of the pushState or replaceState method call of the current history entry.

    We also listen for the click event on the holding our file navigation, using event delegation to know if we should open or close a folder, or load a new image into the page (which results in a history entry being added). By inspecting the className of the parent element of the link that was clicked (with the classList API) we can find out what it is, and act accordingly:

    • If it"s a folder we open or close it.
    • If it"s a photo we load the image and update the history accordingly.
    dir.addEventListener("click", function(e){ e.preventDefault(); var f = e.target; if (f.parentNode.classList.contains("folder")) { self.toggleFolders(f); } else if (f.parentNode.classList.contains("photo")){ note = f.dataset ? f.dataset.note: f.getAttribute("data-note"); self.loadImage(f.textContent, note); history.pushState({note: note, path:f.textContent}, "", f.href); } }, false);

    The actual method that changes the image and updates the caption is pretty self-explanatory:

    LoadImage: function(path, note){ img.src = path; h2.textContent = note; }

    Summary

    Put it all together and we have a simple file-browsing app that demonstrates how to use some of the additions to the History interface, namely pushState to add entries to the browsing context"s history and the popstate event to react to state changes. What"s more, each file that has been navigated to can be accessed later at its real URL.

    This highlights the real usefulness of the history API: you can create Ajaxy navigation in the style of Facebook or Twitter, without breaking the back button or the URLs to individual pages. Although bear in mind that hashbangs don"t work if you share the URL with someone who has scripting disabled.

    Данная статья раскрывает предназначение HTML5 History API. До появления данного API мы часто использовали значение хеш-функций, для работы с тяжелыми, одностраничными приложениями, потому что изменение электронного адреса не было возможно без обновления страницы. Кроме того, когда вы изменяете значение хеш-функций для электронного адреса никакие изменения не вносятся в историю браузера.

    Однако теперь, обе операции доступны благодаря HTML5 History API. Теперь мы можем создавать одностраничные приложения, не применяя значение хеш-функций. Это также позволяет нам создавать приложения благоприятно совместимые с SEO. Кроме того, данная техника позволяет уменьшать трафик - но как?

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

    Отправка контента должна осуществляться со стороны сервера.

    Браузерная поддержка

    На время написания данной статьи HTML5 History API довольно-таки неплохо поддерживается браузерами. Однако, в самом начале скрипта мы создадим проверку. Это позволит проверить браузерную совместимость.

    Чтобы определить программным путем, поддерживает ли ваш браузер API, используйте следующую проверку:

    Return !!(window.history && history.pushState);

    Если вы используете Modernizr, то проверка будет следующей:

    If (Modernizr.history) { // History API Supported }

    Если ваш браузер не поддерживает History API, то вы можете использовать полизаполнение history.js .

    Взаимодействие с историей
  • history.pushState()
  • history.replaceState()
  • С помощью данных функций можно добавлять и обновлять состояние истории. Они работают почти одинаково и принимают один и тот же же набор параметров. В дополнение, можно упоминуть ещё об одной функции: popstate . Чуть позже мы увидим их в действии.

    Функции pushState и replaceState принимают одинаковое число параметров:

    • state строка в формате JSON.
    • title на данный момент игнорируется всеми браузерами поэтому его лучше установить как null.
    • url представляет собой любой электронный адрес. Данное значение будет обновлено в браузере. Нет разницы, существует данный URL или нет. Самое главное, что страница не будет перезагружена.

    Различия между данными методами состоит в том, что pushState добавит новую запись в историю, а replaceState заменит текущее значение. Давай рассмотрим работу данных функций на примере.

    Предположим у нас есть несколько блоков, расположенных в стеке, названные 1 и 2. Так же у нас есть блок 3. Когда мы выполним команду pushState , блок 3 добится в существующий стек. В результате в нём будет 3 блока.

    Теперь представьте ту же ситуацию. При выполнении функции replaceState , блок 2 будет заменён на блок 3. Таким образом количество блоков останется тем же.

    Наглядный пример:

    Метот popstate будет запускаться, при передвижении по истории, используя методы history.go или history.back . В браузерах WebKit команда popstate запускалась бы после события onload , но это не касается Firefox и IE.

    Примеры: HTML

    Click on Links above to see history API usage using pushState method. Home!

    Lorem Ipsum is simply dummy text of the printing and typesetting industry.

    JavaScript

    jQuery("document").ready(function(){ jQuery(".historyAPI").on("click", function(e){ e.preventDefault(); var href = $(this).attr("href"); // Getting Content getContent(href, true); jQuery(".historyAPI").removeClass("active"); $(this).addClass("active"); }); }); // Adding popstate event listener to handle browser back button window.addEventListener("popstate", function(e) { // Get State value using e.state getContent(location.pathname, false); }); function getContent(url, addEntry) { $.get(url) .done(function(data) { // Updating Content on Page $("#contentHolder").html(data); if(addEntry == true) { // Add History Entry using pushState history.pushState(null, null, url); } }); }