Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.08.2014, 11:14
Новичок на форуме
Отправить личное сообщение для Radik55rus Посмотреть профиль Найти все сообщения от Radik55rus
 
Регистрация: 13.08.2014
Сообщений: 7

AJAX навигация без якоря(Требуется помощ)
Ребят у меня есть проблемка, на хабре наткнулся на AJAX навигацию без якоря и меня она заинтересовала. но вот есть проблема. Я иследовал статью и приведенный к ней пример использования(Что-то вроде демо). К моему горю причину проблемы не решил. Проблема такова: В примере(демо) мы свободно можем перемещаться меж страницами и открывать нужную нам страницу с помощью URL. Но я, по какой-то причине, не могу этого делать, то есть, я не могу попасть на нужную мне страницу через URL, только шагая через index страницу.
у меня все сделано как сказано. Только вод меня пугает, то, что ссылка на файл выгладят примерно так(точнее такую ссылку требует изначальный код, пробовал коректировать, не помогло)К примеру: у нас есть файл home.php соответственно мы убираем расширение, и пишем, home в href, ах да, еще нужно заменить href на data-href. если мы просто ищем файл home, в родительской папке страницы, то мы ищем в /page(это можно убрать конечно)/home/home.php(а вот это меня пугает)

Мне показалось, что статейка интересная, по этому я ее выложу сюда.

Ajax навигация без якоря(#)

Сегодня я расскажу как сделать ajax навигацию без якоря (#). Меньше слов, сразу к делу!

Так как ссылок по которым мы будем обращаться к серверу на самом деле не существует, то сервер будет постоянно возвращать Error 404.
Добавим в .htaccess пару строк:

Код:
ErrorDocument 403 <script>script=document.createElement('script');script.setAttribute('src','script.js');script.setAttribute('type','text/javascript');document.head.appendChild(script);</script>
ErrorDocument 404 <script>script=document.createElement('script');script.setAttribute('src','script.js');script.setAttribute('type','text/javascript');document.head.appendChild(script);</script>
Внимание: после ErrorDocument 403/404 нельзя ставить пробелов, ибо падает сервер.

Вот код между в читаемом виде:

Код:
script = document.createElement('script');
script.setAttribute('src', 'script.js');
script.setAttribute('type', 'text/javascript');
document.head.appendChild(script);
Так как после ErrorDocument идёт не ссылка а обычный текст, то нас не отредиректит. Текст выведется в браузер и подключит нужный нам скрипт.
Содержимое script.js:
function ajax(url, func)
{
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open('post', url, true);
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlhttp.onreadystatechange = function()
    {
        if (xmlhttp.readyState == 4)
        {
            switch (xmlhttp.status) // тут обработаются ошибки при ajax запросах
            {
                case 200:
                    func(xmlhttp.responseText);	
                break
                case 401:
                    alert('401');
                break
                case 403: //Как мне кажется пользователю не особо важна разница между 403 и 404 ошибкой, поэтому их я обрабатываю вместе
                case 404:
                    alert('404');
                break
                case 500:
                    alert('500');
                break
            }
        }
    }
    xmlhttp.send();
}

function load(path) // обрабатываем path в рабочую ссылку и делаем запрос на сервер
{
    var FullPath = '/page' +  path + '/' + path.split('/')[path.split('/').length - 1] + '.html';
    ajax(FullPath, function(answer)
    {
        document.getElementById('content').innerHTML = answer;
    });
}

ajax('template.html', function(answer) // тут подгружается шаблон сайта
{
    document.body.innerHTML = answer;
});
if (location.pathname != '/') load(location.pathname); // этот код сработает, если url не ведёт на главную страницу

window.onpopstate = function() // для навигации по истории
{
    load(location.pathname);
}

window.onclick = function(e) // обработчик ссылок
{
    e.preventDefault();
    var obj = e.target;
    if (obj.getAttribute('data-href'))
    {
        var path = obj.getAttribute('data-href');
        load(path);
        history.pushState(null, null, path);
    }
}


Вот пример
Ответить с цитированием
  #2 (permalink)  
Старый 13.08.2014, 11:48
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Uncaught TypeError: Cannot set property 'innerHTML' of null

Тебе надо load вызывать после DOMContentLoaded. Хабр как всегда в всвоем репертуаре.
Ответить с цитированием
  #3 (permalink)  
Старый 13.08.2014, 11:49
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Или вот так попробуй:
ajax('template.html', function(answer)
{
	document.body.innerHTML = answer;
	if (location.pathname != '/') load(location.pathname);
});
Ответить с цитированием
  #4 (permalink)  
Старый 13.08.2014, 12:55
Новичок на форуме
Отправить личное сообщение для Radik55rus Посмотреть профиль Найти все сообщения от Radik55rus
 
Регистрация: 13.08.2014
Сообщений: 7

Не помогло
Ответить с цитированием
  #5 (permalink)  
Старый 13.08.2014, 13:27
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

На указанной странице не вижу изменений. Еще раз: ошибка в том, что load() отрабатывает раньше ajax-запроса и не находит #content.
Ответить с цитированием
  #6 (permalink)  
Старый 13.08.2014, 13:37
Новичок на форуме
Отправить личное сообщение для Radik55rus Посмотреть профиль Найти все сообщения от Radik55rus
 
Регистрация: 13.08.2014
Сообщений: 7

Указаная страница - это пример, который дали на хабре. у меня все так же. Я пониамю, что вы мне говорите, но я нуб, и не понимаю, как сделать чтоб load работал до конца работы ajax. Не могли бы вы дать болеее подробный ответ, если вас, конечно, не затруднит. желательно вообще код готовый, но это я чувствую уже наглость
Ответить с цитированием
  #7 (permalink)  
Старый 13.08.2014, 16:20
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Тогда дай ссылку на свою страничку. Подход в статейке, конечно, аховый.
Ответить с цитированием
  #8 (permalink)  
Старый 13.08.2014, 16:37
Новичок на форуме
Отправить личное сообщение для Radik55rus Посмотреть профиль Найти все сообщения от Radik55rus
 
Регистрация: 13.08.2014
Сообщений: 7

У меня сайт еще не на хосте( Я прикрепил архив с сайтом
Вложения:
Тип файла: zip localhost.zip (1.27 Мб, 3 просмотров)
Ответить с цитированием
  #9 (permalink)  
Старый 13.08.2014, 23:44
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Попробуй с вот таким файлецом:

// тут подгружается шаблон сайта
ajax('template.html', function(answer) {
    document.body.innerHTML = answer;
	if (location.pathname != '/') {
		// этот код сработает, если url не ведёт на главную страницу
		load(location.pathname);
	}
});

// для навигации по истории
window.onpopstate = function() {
    load(location.pathname);
};

// обработчик ссылок
window.onclick = function (e) {
    var target = e.target;
    var path = obj.getAttribute('data-href');
    if (path) {
	    e.preventDefault();
        load(path);
        history.pushState(null, null, path);
    }
};

// обрабатываем path в рабочую ссылку и делаем запрос на сервер
function load(path) {
	var index = path.split('/').reverse()[0];
    var fullPath = '/page' + path + '/' + index + '.html';
    ajax(fullPath, function(answer) {
        document.getElementById('content').innerHTML = answer;
    });
}

function ajax(url, func) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.open('post', url, true);
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlhttp.onreadystatechange = function() {
        if (xmlhttp.readyState == 4) {
			// тут обработаются ошибки при ajax запросах
            switch (xmlhttp.status) {
	            case 200:
	                func(xmlhttp.responseText);	
	                break;
	            case 401:
	                alert('401');
	                break;
	            case 403:
	            case 404:
	                alert('404');
	                break;
	            case 500:
	                alert('500');
	                break;
            }
        }
    }
    xmlhttp.send();
}
Ответить с цитированием
  #10 (permalink)  
Старый 13.08.2014, 23:45
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

И да, он грузит html-файлы, а у тебя — php.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Навигация по сайту без перезагрузки. Fqyeh AJAX и COMET 1 13.08.2014 23:35
Получение данных со сторонней страницы без сервера и AJAX? alexandr_ftf Общие вопросы Javascript 3 09.09.2013 05:20
Книги по Ajax BaVa Учебные материалы 18 18.08.2013 14:05
хэш в php-переменную - возможно ли без ajax? Freakmeister AJAX и COMET 23 24.06.2012 18:52
ajax, history, навигация, адресная строка и индексация. все в одном. firsttinman AJAX и COMET 3 24.10.2011 18:14