Javascript 如何修改jQuery移动历史后退按钮行为
我将从我已经研究过的一点开始,但是没有一个解决方案能够解决看起来应该是一个简单的JQM修改的问题 我有一个wine review webapp,它具有以下视图用户流: 葡萄酒类型>葡萄酒列表>葡萄酒详情>葡萄酒评论(通过django backto重定向)>从评论更新的葡萄酒详情 我想要发生的是,当用户按下后退按钮时,它应该返回到酒单。当前发生的情况是重新加载葡萄酒细节视图。要想回到酒单上,需要按三次后键-( 我解决这个问题的想法有两个:Javascript 如何修改jQuery移动历史后退按钮行为,javascript,django,jquery-mobile,browser-history,Javascript,Django,Jquery Mobile,Browser History,我将从我已经研究过的一点开始,但是没有一个解决方案能够解决看起来应该是一个简单的JQM修改的问题 我有一个wine review webapp,它具有以下视图用户流: 葡萄酒类型>葡萄酒列表>葡萄酒详情>葡萄酒评论(通过django backto重定向)>从评论更新的葡萄酒详情 我想要发生的是,当用户按下后退按钮时,它应该返回到酒单。当前发生的情况是重新加载葡萄酒细节视图。要想回到酒单上,需要按三次后键-( 我解决这个问题的想法有两个: 如果历史堆栈中的最后一个项目是Wine Review,请
var last_hist = $.mobile.urlHistory.getActive();
last_hist.data.pageURL;
$('div#wine_detail').live('pageshow',function(event, ui){
$("a.ui-btn-left").bind("click", function(){
location.replace("/wines/{{wine.wine_type}}/#");
});
});
window.history.go(-3)
从控制台上看,它正是我所需要的
所以我试着用“后退”按钮将其绑定如下:
$('div#wine_detail').live('pageshow',function(event, ui){
var last = $.mobile.urlHistory.stack.length - 1;
var last_url = $.mobile.urlHistory.stack[last].url;
var review_url = /review/g;
if (last_url.match(review_url) )
{
$('div#wine_detail a.ui-btn-left').bind( 'click', function( ) {
console.log("click should be bound and going back in time...")
window.history.go(-2);
});
}
else
{
console.log('err nope its: ' + last_url);
}
});
没有骰子,有东西打断了交易…我不想用urlHistory拼接/pop/push。在页面上重定向怎么样
$(document).on("pagebeforechange", function (e, data) {
var overrideToPage;
// some for-loop to go through the urlHistory TOP>DOWN
for (var i = $.mobile.urlHistory.activeIndex - 1; i >= 0; i--) {
// this checks if # = your target id. You probably need to adapt this;
if ($.mobile.urlHistory.stack[i].url = $('#yourPageId').attr('id')) {
// save and break
overrideToPage = $.mobile.urlHistory.stack[i].url;
break;
}
// set new Page
data.toPage = overrideToPage;
}
});
$('#some_popup').popup( { history: false } );
这将捕获您的后退按钮更改页面调用并重定向到您想要的页面。当然,您也可以直接设置data.toPage=winelist
我只在内部页面上做这件事,但用winelist.html等设置这件事应该不会太难
有关更多信息,请查看JQM中的事件页面,这样解决方案就接近我发布的更新。以前的解决方案的问题是有很多东西绑定到“后退”按钮。虽然我的新绑定操作有时可能会起作用,但其他操作也会发生,我尝试了
unbind()
,但仍然没有工作
我的解决方案是有点冒烟和镜像。我检查上一页是否是审查页,如果是,我将旧的后退按钮替换为新的人造按钮,历史后退步骤如下:
$('div#wine_detail').live('pageshow',function(event, ui){
var last = $.mobile.urlHistory.stack.length - 1;
var last_url = $.mobile.urlHistory.stack[last].url;
var review_url = /review/g;
if (last_url.match(review_url) )
{
$('a.ui-btn-left').replaceWith('<a href="" id="time_machine" class="ui-btn-left ui-btn ui-btn-icon-left ui-btn-corner-all ui-shadow ui-btn-up-a" data-icon="arrow-l"><span class="ui-btn-inner ui-btn-corner-all"><span class="ui-btn-text">Back</span><span class="ui-icon ui-icon-arrow-l ui-icon-shadow"></span></span></a>');
$('#time_machine').bind( 'click', function( ) {
console.log("click should be bound and going back in time...")
window.history.go(-3);
});
}
else
{
console.log('err nope its: ' + last_url);
}
$('div#wine_detail').live('pageshow',函数(事件,用户界面){
var last=$.mobile.urlHistory.stack.length-1;
var last_url=$.mobile.urlHistory.stack[last].url;
var review\u url=/review/g;
如果(最后一个url.match(查看url))
{
$('a.ui-btn-left')。替换为('';
$('time_machine').bind('click',function(){
日志(“应该绑定单击并及时返回…”)
window.history.go(-3);
});
}
其他的
{
log('err nope its:'+last_url);
}
它看起来一模一样,没有人比它更聪明。它可能可以通过使用jQm方法
pagebeforeshow
来改进,这样用户就永远看不到交换了。希望这对其他人有所帮助。为什么不在页面的页眉部分设置一个后退按钮呢?类似这样的内容:
<div data-role="header">
<a data-direction="reverse" data-role="button" href="#winelist" data-icon="back">Back</a>
<h1>Wine Detail</h1>
</div><!-- /header -->
葡萄酒细节
如果您希望关闭按钮指向任意(不是最后一个)页面,也可以先切换到目标页面,然后打开对话框。因此,对话框中的关闭按钮将打开目标页面
// First: change to the target page
$.mobile.changePage('#target_page');
然后像这样打开对话框
// Second: change to the dialog
window.setTimeout(
// for some reason you have to wrap it in a timeout
function(){
$.mobile.changePage('#dialog');
},
1
);
现在,您可以打开该对话框,关闭按钮将打开#target_页面
优点:
- 解决方案适用于单个对话框,而不是从所有对话框中删除所有关闭按钮
- 单点代码上的无缝集成
- 历史操作是不需要的
$(document).on("pagebeforechange", function (e, data) {
var overrideToPage;
// some for-loop to go through the urlHistory TOP>DOWN
for (var i = $.mobile.urlHistory.activeIndex - 1; i >= 0; i--) {
// this checks if # = your target id. You probably need to adapt this;
if ($.mobile.urlHistory.stack[i].url = $('#yourPageId').attr('id')) {
// save and break
overrideToPage = $.mobile.urlHistory.stack[i].url;
break;
}
// set new Page
data.toPage = overrideToPage;
}
});
$('#some_popup').popup( { history: false } );
谢谢你,我很快就会结帐!我也喜欢不要混淆历史的想法。感谢agian的回答。我注意到代码中有一些东西。if有一个比较,而不是赋值运算符。修复了这个问题。还缺少a),但如果我正确阅读了该代码,任何页面更改都不会触发该按钮,而不仅仅是后退按钮。也许这就是我需要调整的地方?使用上述代码设计解决方案的尝试很好,但应用程序本身,可能jQm不一致地使用历史API。一些标记使用内部页面#wine_blah“vs.“/wines/reds”/“因此需要编写更多的处理。我用:
$('div#wine_detail a.ui-btn-left').bind('click',function(){$.mobile.changePage(“/wines/whites/”,{transition:'slide});})捕获了后退按钮操作);
但我得到一个静默事件,重新加载同一页面,然后最终返回到我想要的视图,但也不一致。可能我需要在django中创建一个视图堆栈…这引入了一个名为I;)的全局变量,我在哪里可以获得有关$.mobile.urlHistory的更多信息?嗨,Marcelo,我不太清楚你的意思。$.mobile.urlHistory