Javascript.RU

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

хэш в php-переменную - возможно ли без ajax?
Сделал постраничную навигацию без перезагрузки страницы. Была проблема - невозможно передать кому-то ссылку на нужную страницу. Единственный способ как я смог решить эту проблему это при помощи ajax:

В адресной строке например вписываем: blablabla/index.php#page=2
При загрузке страницы сначала выполняется скрипт, который уже аджаксит всю страницу:
$.ajax({
    type: "POST",
    cache: false,
    url: 'ajax.php',
    data: "hash="+document.location.hash.slice(1),
    success: function($content){
        $("body").html($content);
        }
    });

Дальше дело техники, в ajax.php хэш подхватывается через $_POST и разбивается на отдельные переменные:
$_POST['hash'] = str_replace('_', '&', $_POST['hash']);
parse_str($_POST['hash'], $arr);
$_POST = array_merge($_POST, $arr);
unset($arr);
//получаем результат в $_POST['page']

Чем мне не нравится этот метод - то что страница аджаксится не только когда это нужно, тоесть при смене страниц, но и при первой загрузке страницы. Можно ли как-то передать хэш из JS в php-переменную без аджакса? Как это дело реализовано в вконтакте, кто-нибудь знает?
Ответить с цитированием
  #2 (permalink)  
Старый 23.06.2012, 15:13
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

У меня нет сейчас пхп под рукой, и не могу потестить, но попробуйте сами :
Принцип :
т.к. хеш не передаётся пхп ни в каком виде, поэтому городим костыль, превращая хеш в параметр (у Вас так же),
и передаём параметры быстро и решительно с помощью GET запроса
FOO.PHP:
<?php
if (isset($_GET["hash"])):
    echo $_GET['hash'];
else:
?>
	<script>
		// location.href -> "http://mysite.ru/foo.php?bar=ok#myHash"
    // или 
    // "http://mysite.ru/foo.php/#myHash"

		// "#myHash"
		var hash = location.hash;

		if (hash) {

			// "/foo.php"
			var pathname = location.pathname;

			// "?bar=ok"
			var search = location.search;

			// "/foo.php?bar=ok&hash=myHash"
			var res = pathname + search + ("&?".charAt(search.indexOf("?")==-1)) + "hash=" + hash.slice(1);

			// способ - GET.
			location.href = res;
		} else {
			document.write("No hash!");
		}
	</script>
<?php
endif;

echo "<br><pre>";
print_r($_GET);
echo "</pre>";
?>

Последний раз редактировалось melky, 23.06.2012 в 20:57.
Ответить с цитированием
  #3 (permalink)  
Старый 23.06.2012, 15:58
Аватар для Freakmeister
Аспирант
Отправить личное сообщение для Freakmeister Посмотреть профиль Найти все сообщения от Freakmeister
 
Регистрация: 15.01.2011
Сообщений: 61

Костыль почему-то циклится. После загрузки страницы c хэшем test в адресной строке я имею:
Код:
http://localhost/index.php?hash=test&hash=&hash=&hash=&hash=&hash=&hash=&hash=&hash=&hash=&hash=...бесконечность
А разве такой способ отправит GET-запрос на сервер? Проблема с изменением хэша в чём - это происходит только в браузере пользователя, а запрос на сервер при этом не уходит, поэтому php-скрипт не может видеть хэш. Боюсь, что с изменением location.href средствами JS будет та же фигня.

Последний раз редактировалось Freakmeister, 23.06.2012 в 16:01.
Ответить с цитированием
  #4 (permalink)  
Старый 23.06.2012, 16:51
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Freakmeister,

$.get("http://mysite.ru/foo.php?bar=ok#"+hash+"?"+Math.random(), function(data){
  alert("Data Loaded: " + data);
});
Ответить с цитированием
  #5 (permalink)  
Старый 23.06.2012, 16:53
Аватар для Freakmeister
Аспирант
Отправить личное сообщение для Freakmeister Посмотреть профиль Найти все сообщения от Freakmeister
 
Регистрация: 15.01.2011
Сообщений: 61

Что-то я не понял как это использовать. $.get отправляет запрос скрипту test.php/foo.php и получает ответ опять же в виде JS-переменной. И как мне это передать в основной php-файл, из которого запускается $.get? Что-то или товарищ Deff чушь спорол, или я дурак.
Ответить с цитированием
  #6 (permalink)  
Старый 23.06.2012, 16:58
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Freakmeister,
Хм -По моему первый Вопрос был - как передать данные ?
hash берете прям из адресного окна var hash = location.hash;
===============================================
Вопрос как перепарсить данные на клиенте alert("Data Loaded: " + data);
Зависит от формата ответа, и сложностей вродь нет

Последний раз редактировалось Deff, 23.06.2012 в 17:03.
Ответить с цитированием
  #7 (permalink)  
Старый 23.06.2012, 17:11
Аватар для Freakmeister
Аспирант
Отправить личное сообщение для Freakmeister Посмотреть профиль Найти все сообщения от Freakmeister
 
Регистрация: 15.01.2011
Сообщений: 61

Ну и что мне с этим data делать? Вживлять в страницу средствами JS? Чем это отличается от ajax-способа, приведённого в первом посте? Мне нужно, чтобы при загрузке php-скрипта, в $_POST или $_GET попадало значение хэша, и потом на основе этого хэша я мог бы вывести страницу средствами php, а не средствами JS. Похоже, это невозможно.
Ответить с цитированием
  #8 (permalink)  
Старый 23.06.2012, 17:19
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Freakmeister,
Вопрос Два:
a) Каким макаром - пользователь - переходит по ссылкам ?
b) Не проще ли, в ссылку встраивать событийный скрипт по onclick, который запрашивает аяксом прямо URL из ссылки ?

<a href="Ccылка" onclick="CallAjax(this.href); return false">Описание</a>

function CallAjax(a) {
$.get("a, function(data){
alert("Data Loaded: " + data);
});
}

Сообщение от Freakmeister
мог бы вывести страницу средствами php, а не средствами JS. Похоже, это невозможно.
Можно - но страница то обновицо - а Вы изначально желали без обновления!
Смысл городить тогда огород ?
Аякс затем и нужен, чтобы не подгружать лишнего - скрипты - заголовки стили Лого

Последний раз редактировалось Deff, 23.06.2012 в 17:27.
Ответить с цитированием
  #9 (permalink)  
Старый 23.06.2012, 20:25
Аватар для Freakmeister
Аспирант
Отправить личное сообщение для Freakmeister Посмотреть профиль Найти все сообщения от Freakmeister
 
Регистрация: 15.01.2011
Сообщений: 61

Меня интересут другой случай, если пользователю прислали ссылку в аську например на страницу 2. И я не обязательно буду аяксить весь body, это просто упрощённый пример. В общем, я вроде допёр, как можно использовать вариант товарища melky. Вконтакте это реализовано с хэшэм, поэтому я думал в этом направлении, но попробую вообще отказаться от использования хэша:

При нажатии на ссылку номера страницы, пусть делается preventdefault, href ссылки вставляется в адресную строку, как показал товарищ melky и тут же выполняется функция аджакса страницы.
PROFIT = пользователь получает ссылку вида blablabla/index.php?page=2, а при насильной вставке её в адресную строку, php-скрипт получает стандартный GET-запрос. Надеюсь сработает, если нет - отпишусь.

Последний раз редактировалось Freakmeister, 23.06.2012 в 20:30.
Ответить с цитированием
  #10 (permalink)  
Старый 23.06.2012, 20:35
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от Freakmeister
Меня интересут другой случай, если пользователю прислали ссылку в аську например на страницу 2. И я не обязательно буду аяксить весь body, это просто упрощённый пример. В общем, я вроде допёр, как можно использовать вариант товарища melky. Вконтакте это реализовано с хэшэм, поэтому я думал в этом направлении, но попробую вообще отказаться от использования хэша:
Можно перехватить клик по ссылке, в перехвате - зааяксить ссылку и не переходить по рельному клику на ссылку, а подгружать аяксом нужную страницу, - Короче Ваша идеалогия не до конца проработана - непонятно - что Вы хотите
Идея melky, так же само расчитана на аякс - ток реализована с учетом Ваших же наворотов...

- Перехват ссылки и Аякс запрос по ней и подгрузка - очевидно самое простое
Вам не надо чот переделывать для подгрузки по Аяксу(проскакивало что он загружает какой то скрипт) - он грузит в точности ту жа страницу, что и браузер, ток нун в сallback Аякса отделить небходимое для вставки, дабы не делать повторение уже загруженного и неизменяемого, в этом и смысл подгрузки без обновления страницы, ускорение процессов, отсутствие полного рендинга страницы

Последний раз редактировалось Deff, 23.06.2012 в 20:42.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать переменную с jquery в php Максим2 jQuery 14 28.07.2013 11:38
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
php session а в ajax Sadist_dead AJAX и COMET 1 19.08.2011 18:35
Необходимо передать переменную из php в функцию jQuery asp_ AJAX и COMET 4 08.01.2011 13:22
Не получается передать переменную из JS в PHP Lion_astana AJAX и COMET 2 23.11.2010 17:23