Я изучаю пригодность управления историей jQM для мобильного веб-сайта моей организации. Частью нашего требования является то, что когда пользователь публикует форму, он публикует с помощью Ajax. Когда пользователь нажимает «назад», а затем «вперед» кнопки браузера, нам нужно повторно опубликовать форму, используя Ajax снова. Вот схема:
- [home.php: опубликовать в new.php] =>
- [new.php: опубликовать в list.php] =>
- [из list.php, дважды нажмите на home.php] =>
- [* home.php: нажмите fwd, выполняет запрос GET для new.php *] =>
- [* new.php: нажмите fwd, выполняет GET-запрос к list.php *]
[*] не то поведение, которое я хочу. Я хочу повторно отправить данные из шагов 1 и 2
На шагах 4 и 5 я хочу перехватить выполнение jQM в событии «pagebeforeload» (кажется, что это правильное место) и изменить data.options.data (чтобы включить сериализованные данные поста) и data.options .type (to POST) свойства объекта данных, который передается в обработчик событий. Тогда я бы позволил процессу загрузки страницы продолжить с измененными значениями. Это, я думаю, дало бы мне то поведение, которое я хочу.
Пока я вижу, что могу перехватить событие pagebeforeload и изменить значения с помощью обработчика событий ниже:
$(document).bind("pagebeforeload",
function( e, data ) {
console.log(data.toPage);
console.log(data.options);
data.options.type = "POST";
data.options.data = "edit=Hanford";
}
);
Но пропущен кусок, как я могу «сохранить» информацию на шагах 1 и 2, чтобы при перехвате события pagebeforeload в 4 и 5 я мог знать, как изменить свойства «type» и «data» должным образом.
Я сделал прототип jquery / browser History, чтобы проиллюстрировать поведение, которое я хотел бы получить от jQuery Mobile. Код JavaScript:
$(window).load(function() {
//listen to the history popstate event
$(window).bind('popstate',
function(e) {
if (e.originalEvent.state && e.originalEvent.state.type && e.originalEvent.state.type == "post") {
//do an ajax post based on what is stored in history state
$.post(e.originalEvent.state.path,
e.originalEvent.state.data,
function(data) {jaxer(data,'POST')});
} else if (e.originalEvent.state !== undefined){
//do an ajax get
$.get(location.pathname,
function(data) {jaxer(data,'GET')});
}
});
//add event listeners
addClickHandler();
});
function jaxer(data, msg) {
if (msg) {console.log(msg+' request made using ajax');}
$('#slider')[0].innerHTML = data;
addClickHandler();
}
//hijax hyperlinks and form submissions
function addClickHandler() {
$('a').click(function(e) {
history.pushState({
path: this.path
},
'', this.href);
$.get(this.href,
function(data) {jaxer(data,'GET')});
e.preventDefault()
});
$('form').submit(function(e) {
var formData = $(this).serialize();
console.log('saving serialized form data into historyState: '+formData);
history.pushState({path: this.action, data: formData, type: "post"},'',this.action);
$.post(this.action,
$(this).serialize(),
function(data) {jaxer(data,'POST')});
e.preventDefault();
});
//add the form submit button to the form as a hidden input such that it will get serialized
$('form input[type="submit"]').click(function() {
$(this.form).append("<input type='hidden' name='" + this.name + "' value='" + this.value + "'/>");
});
console.log("event handlers added to DOM");
};
Когда происходит инициируемый пользователем POST, я помещаю сериализованные данные POST в объект состояния истории. Затем, когда происходит событие popstate, я могу запросить у объекта состояния эту информацию. Если я найду его, я смогу выполнить ajax POST. Я хотел бы получить такую же функциональность при обработке истории jQuery Mobile. Таким образом, я могу воспользоваться анимацией смены страницы и т. Д.