Skip to content

Instantly share code, notes, and snippets.

@believer-ufa
Last active August 29, 2015 14:26
Show Gist options
  • Save believer-ufa/0817b7066e729308da84 to your computer and use it in GitHub Desktop.
Save believer-ufa/0817b7066e729308da84 to your computer and use it in GitHub Desktop.
Инструменты для реализации аякс-навигации на сайте
Navigation = new function() {
this.ajaxObj = ''; // Объект ajax-загрузки
this.content = '#content'; // Объект, содержащий в себе весь HTML-контент страницы
this.history = {};
this.reloadFullPage = function (link) {
if (link == undefined || link == '') link = document.location.href;
document.location.href = link;
};
this.refreshPage = function () {
this.loadPage(document.location.href, true);
};
// Установить новый контент на странице
this.setContent = function(content) {
this.content.html(content);
};
// Установим новую страницу
this.setPage = function (link, html_data, old_history_page) {
// Расскажем Гуглу о том, что мы загрузили новую страницу
if (typeof(_gaq) != 'undefined') {
_gaq.push(['_trackPageview', link]);
_gaq.push(['_trackEvent', 'Forms', 'AJAX Form']);
}
// Если браузером поддерживается хистори, используем это
if (supports_history_api()) {
if (typeof(window.history.state) == 'number' && old_history_page !== true) {
this.history[window.history.state].scroll = document.documentElement.scrollTop;
}
var time = new Date().getTime();
this.history[time] = {
html : html_data,
scroll : 0
};
if (old_history_page !== true) {
history.pushState(time, null, link);
} else {
history.replaceState(time, null, document.location.href);
}
}
this.setContent(html_data);
};
/*
* Функция загружает контент с сервера.
* http_link куда отправлять запрос
* */
this.loadPage = function (http_link, old_history_page) {
var $this = this;
// Если уже был отправлен какой-либо запрос, отменим его
if (typeof(this.ajaxObj) == 'object') this.ajaxObj.abort();
this.ajaxObj = jQuery.ajax({
type: "GET",
url: http_link,
data: { ajaxload: '1' },
dataType: 'html',
success: function (data) {
if (typeof(Progress) != 'undefined') Progress.done();
$this.setPage(http_link, data, old_history_page);
},
error: function (data, status, e) {
if (typeof(Progress) != 'undefined') Progress.done();
if (e != 'abort') {
var errm = '<h3>Ошибка загрузки страницы</h3><p>Причина: ' + e
+ '</p><p>Попробуйте <a href="#" onclick="Navigation.refreshPage(); return false;">обновить страницу</a>.</p>';
$this.setPage(http_link, errm);
}
}
});
if (http_link.lastIndexOf('#') == -1)
return true;
else
return false;
};
this.setTitle = function(name,desc) {
document.title = name;
$('.page-title').html(name);
$('meta[name="description"]').attr('content',desc);
};
this.scrollToAnkor = function(str,speed) {
if (typeof(speed) === 'undefined') {
speed = 300;
}
var aname = str.substring(str.lastIndexOf('#')+1);
var link = jQuery('.'+aname).get(0);
if (typeof link == 'object') {
var linkcoords = getElementPosition(link);
App.elements.scroll_container.stop().scrollTo(linkcoords.top-120,speed);
}
};
};
$(document).ready(function() {
Navigation.content = jQuery(Navigation.content);
// Нажатие на ссылки
$('body').on('click', 'a', function () {
var $this = jQuery(this);
var cleared_href = this.href.substring(0, this.href.lastIndexOf('#'));
var cleared_lasturl = document.location.href.substring(0, document.location.href.lastIndexOf('#'));
var link_host = this.href.replace(/https?:\/\/([^\/]+)(.*)/, '$1');
// Если в ссылке есть якорь, и ссылка является точно такой же, как текущая страница,
// то просто переместим страницу на нужный якорь
if ((this.href.indexOf('#') !== -1) && (cleared_lasturl === cleared_href)) {
Navigation.scrollToAnkor(this.href);
return false;
} else {
if (($this.attr('target') !== '_blank')
&& (this.href[this.href.length - 1] !== '#')
&& (!$this.hasClass('showmessage'))
&& (!$this.hasClass('showimage'))
&& (!$this.parent().hasClass('cke_button'))
&& (!$this.parent().parent().hasClass('redactor_toolbar'))
&& (!$this.parent().hasClass('pluso-wrap'))
&& ( $this.attr('data-toggle') == undefined)
&& (!$this.hasClass('showmodal'))
&& (!$this.hasClass('senddata'))
&& (link_host == location.host) // Предотвращает попытки скачать контент с другого хоста
&& (!$this.hasClass('senddata-token')))
{
if ($this.attr('onclick'))
{
return false;
} else {
Navigation.loadPage(this.href);
return false;
}
}
if (this.href[this.href.length-1] == '#' && $this.attr('data-toggle') == undefined) {
return false;
}
return true;
}
});
});
// Добавим в текущее состоянеие истории текущую страницу
if (supports_history_api()) {
var time = new Date().getTime();
history.replaceState(time, null, document.location.href);
Navigation.history[time] = {
html : $(Navigation.content).html(),
scroll : 0
};
}
function supports_history_api() {
return !!(window.history && history.pushState);
}
if (supports_history_api()) {
$(window).bind('popstate', function() {
var time = window.history.state;
if (typeof(history.state) === 'number' && typeof(Navigation.history[time]) === 'object') {
var html = Navigation.history[time].html;
var scroll = Navigation.history[time].scroll;
if (Navigation.content.html() !== html) {
Navigation.setContent(html);
}
} else {
Navigation.loadPage(document.location.href,true);
}
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment