
23.06.2012, 14:48
|
 |
Аспирант
|
|
Регистрация: 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-переменную без аджакса? Как это дело реализовано в вконтакте, кто-нибудь знает?
|
|

23.06.2012, 15:13
|
sinistral
|
|
Регистрация: 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.
|
|

23.06.2012, 15:58
|
 |
Аспирант
|
|
Регистрация: 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.
|
|

23.06.2012, 16:51
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Freakmeister,
$.get("http://mysite.ru/foo.php?bar=ok#"+hash+"?"+Math.random(), function(data){
alert("Data Loaded: " + data);
});
|
|

23.06.2012, 16:53
|
 |
Аспирант
|
|
Регистрация: 15.01.2011
Сообщений: 61
|
|
Что-то я не понял как это использовать. $.get отправляет запрос скрипту test.php/foo.php и получает ответ опять же в виде JS-переменной. И как мне это передать в основной php-файл, из которого запускается $.get? Что-то или товарищ Deff чушь спорол, или я дурак.
|
|

23.06.2012, 16:58
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Freakmeister,
Хм -По моему первый Вопрос был - как передать данные ?
hash берете прям из адресного окна var hash = location.hash;
===============================================
Вопрос как перепарсить данные на клиенте alert("Data Loaded: " + data);
Зависит от формата ответа, и сложностей вродь нет
Последний раз редактировалось Deff, 23.06.2012 в 17:03.
|
|

23.06.2012, 17:11
|
 |
Аспирант
|
|
Регистрация: 15.01.2011
Сообщений: 61
|
|
Ну и что мне с этим data делать? Вживлять в страницу средствами JS? Чем это отличается от ajax-способа, приведённого в первом посте? Мне нужно, чтобы при загрузке php-скрипта, в $_POST или $_GET попадало значение хэша, и потом на основе этого хэша я мог бы вывести страницу средствами php, а не средствами JS. Похоже, это невозможно.
|
|

23.06.2012, 17:19
|
без статуса
|
|
Регистрация: 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.
|
|

23.06.2012, 20:25
|
 |
Аспирант
|
|
Регистрация: 15.01.2011
Сообщений: 61
|
|
Меня интересут другой случай, если пользователю прислали ссылку в аську например на страницу 2. И я не обязательно буду аяксить весь body, это просто упрощённый пример. В общем, я вроде допёр, как можно использовать вариант товарища melky. Вконтакте это реализовано с хэшэм, поэтому я думал в этом направлении, но попробую вообще отказаться от использования хэша:
При нажатии на ссылку номера страницы, пусть делается preventdefault, href ссылки вставляется в адресную строку, как показал товарищ melky и тут же выполняется функция аджакса страницы.
PROFIT = пользователь получает ссылку вида blablabla/index.php?page=2, а при насильной вставке её в адресную строку, php-скрипт получает стандартный GET-запрос. Надеюсь сработает, если нет - отпишусь. 
Последний раз редактировалось Freakmeister, 23.06.2012 в 20:30.
|
|

23.06.2012, 20:35
|
без статуса
|
|
Регистрация: 25.05.2012
Сообщений: 8,219
|
|
Сообщение от Freakmeister
|
Меня интересут другой случай, если пользователю прислали ссылку в аську например на страницу 2. И я не обязательно буду аяксить весь body, это просто упрощённый пример. В общем, я вроде допёр, как можно использовать вариант товарища melky. Вконтакте это реализовано с хэшэм, поэтому я думал в этом направлении, но попробую вообще отказаться от использования хэша:
|
Можно перехватить клик по ссылке, в перехвате - зааяксить ссылку и не переходить по рельному клику на ссылку, а подгружать аяксом нужную страницу, - Короче Ваша идеалогия не до конца проработана - непонятно - что Вы хотите
Идея melky, так же само расчитана на аякс - ток реализована с учетом Ваших же наворотов...
- Перехват ссылки и Аякс запрос по ней и подгрузка - очевидно самое простое
Вам не надо чот переделывать для подгрузки по Аяксу(проскакивало что он загружает какой то скрипт) - он грузит в точности ту жа страницу, что и браузер, ток нун в сallback Аякса отделить небходимое для вставки, дабы не делать повторение уже загруженного и неизменяемого, в этом и смысл подгрузки без обновления страницы, ускорение процессов, отсутствие полного рендинга страницы
Последний раз редактировалось Deff, 23.06.2012 в 20:42.
|
|
|
|