Вынесен polyfill для HTML5 History API #171

Merged
merged 3 commits into from Oct 22, 2013

Conversation

Projects
None yet
5 participants
Member

Lapple commented Oct 16, 2013

Предлагаю вынести polyfill для HTML5 History API за пределы noscript, в переписанном варианте вроде довольно легко вставить любой стандартный polyfill.

@Lapple Lapple commented on the diff Oct 16, 2013

src/ns.action.js
@@ -198,8 +198,8 @@ ns.action._process = function(e) {
return true;
}
- // если host ссылки не равен нашему хосту
- if (target.host != window.location.host) {
+ // если hostname ссылки не равен нашему хосту
+ if (target.hostname != window.location.hostname) {
@Lapple

Lapple Oct 16, 2013

Member

Тут поправил ошибку в IE9, там target.host возвращается с портом, а в window.location.host нет порта для 80 и 443.

@Lapple Lapple and 1 other commented on an outdated diff Oct 16, 2013

src/ns.page.js
@@ -11,14 +11,19 @@ ns.page = {};
* @type {{page: string, params: Object}}
*/
ns.page.current = {};
-ns.page.currentUrl = null;
+ns.page.currentUrl = (function(location) {
+ var origin = location.protocol + '//' + location.host;
@Lapple

Lapple Oct 16, 2013

Member

location.origin для file://localhost/... возвращает file://.

@chestozo

chestozo Oct 16, 2013

Member

Может быть всё-таки window.location?
Ну или loc, как было раньше.

Contributor

edoroshenko commented Oct 17, 2013

Вот мержим мы pull-реквест, и для того, чтобы после этого всё заработало, нужно что?

Member

Lapple commented Oct 17, 2013

Можно подключить какой-нибудь внешний polyfill, например devote/HTML5-History-API. А если не нужно поддерживать IE8-9 (что-нибудь мобильное), тогда все и так будет работать.

Member

chestozo commented Oct 17, 2013

Мне кажется, надо сделать так, чтобы работало в IE8-9 из коробки )

Member

Lapple commented Oct 17, 2013

Может в самом фреймворке достаточно отсутствия препятствий для работы в старых браузерах? Сейчас для пользователей IE уже надо подключать polyfill'ы для методов из ES5.

Contributor

edoroshenko commented Oct 17, 2013

Дык можно в коробку положить несколько полифиллов и включить их в stub project

Owner

doochik commented Oct 21, 2013

Азиз, а сделай, плиз, маленькую доку для этого, чтобы знания не потерялись.
Например, "из коробки есть только html5 history api, работайте с ним через ns.history, хотите полифил - берите отсюда, подключайте вот так"

Member

Lapple commented Oct 21, 2013

Добавил описание и немного переиначил переопределение, теперь есть метод ns.page.getCurrentUrl, который возвращает текущий URL страницы, который noscript может распознать.

@devote devote commented on the diff Oct 21, 2013

src/ns.page.js
@@ -166,6 +164,13 @@ ns.page.getDefaultUrl = function() {
};
/**
+ * Calculates current application url, fed as default value for `ns.page.go`.
+ */
+ns.page.getCurrentUrl = function() {
+ return window.location.pathname + window.location.search;
+};
@devote

devote Oct 21, 2013

Можно просто написать:

ns.page.getCurrentUrl = function() {
    var location = window.history.location || window.location;
    return location.pathname + location.search;
}

и не нужно будет писать вот этого кода:

if (history.emulate) {
    ns.page.getCurrentUrl = function() {
        return history.location.pathname + history.location.search;
    };
}
@Lapple

Lapple Oct 21, 2013

Member

Дело в том, что мы не включаем HTML5-History-API в noscript по умолчанию: страница ns.history.md — это как раз краткое руководство по подключению.

window.location.history появляется, насколько я понял, при подключении polyfill'а, значит код window.history.location || window.location должен лежать как минимум в приложении. Ну а там, как мне кажется, яснее один раз определиться, как мы считаем текущий URL.

@devote

devote Oct 21, 2013

не вижу ничего ужасного в добавлении условия window.history.location || window.location в ваш код, это не 500 строк кода, а лишь одна. Не мешающая работе, но дающая возможность другим не задумываться о том какие нужно делать манипуляции при подключении полифила HTML5-History-API.

Но это лишь мое мнение, решать конечно автору приложения о котором тут ведется речь)

@devote devote and 1 other commented on an outdated diff Oct 21, 2013

doc/ns.history.md
+## Polyfill для IE
+
+В качестве полифилла можно использовать [devote/HTML5-History-API](https://github.com/devote/HTML5-History-API). Скрипт предоставляет стандартизированное API и будет использовать смену хеш-фрагмента URL для навигации.
+
+ /notes/141 -> /#/notes/141
+
+Кроме подключения самого скрипта на страницу нужно проделать небольшую работу:
+
+1. Организовать редирект до старта приложения:
+
+```js
+if (window.history.emulate) {
+ // Тут может произойти смена URL и перезагрузка, поэтому какие-нибудь
+ // ручки до редиректа запрашивать бессмысленно.
+ window.history.redirect();
+}
@devote

devote Oct 21, 2013

.redirect() полезно использовать и в новых браузерах, что бы было автоматическое преобразование из ссылок вида: /#/notes/141 в ссылки вида: /notes/141

Но вам виднее конечно.

@Lapple

Lapple Oct 21, 2013

Member

О, спасибо за комментарий, это правда полезнее. Да и вообще, спасибо за библиотеку.

doochik merged commit d844821 into master Oct 22, 2013

1 check passed

default The Travis CI build passed
Details

doochik deleted the drop-history-api-support-for-legacy-browsers branch Oct 22, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment