我已经构建了下面的示例应用程序,允许用户使用触摸手势在各个部分中左右滑动,在页面中上下滑动:http://preview.na-software.co.uk/Demo/FutureLearning2/
它使用Hammer JS进行手势操作,并使用hashchange插件来跟踪用户历史记录,使其能够轻松返回到相同的位置,使用浏览器按钮在历史记录中前后导航。
问题出现在从一个页面导航到一个没有对应页面的部分时,因为我希望始终将其默认为零(即使在该部分中有匹配页面时)当从一个部分移动到另一个部分时。
因此,如果您从http://preview.na-software.co.uk/Demo/FutureLearning2/#/section-1/page-1开始,然后尝试访问其他部分向左或向右滑动,您会发现它将您返回到该部分的页面0。然而,这会导致hashchange被多次调用,意味着您无法使用浏览器的后退按钮进行导航,而是会卡在该部分和页面上......
您有什么想法,如何防止这种情况发生?
hashchange监听器如下:
问题出现在从一个页面导航到一个没有对应页面的部分时,因为我希望始终将其默认为零(即使在该部分中有匹配页面时)当从一个部分移动到另一个部分时。
因此,如果您从http://preview.na-software.co.uk/Demo/FutureLearning2/#/section-1/page-1开始,然后尝试访问其他部分向左或向右滑动,您会发现它将您返回到该部分的页面0。然而,这会导致hashchange被多次调用,意味着您无法使用浏览器的后退按钮进行导航,而是会卡在该部分和页面上......
您有什么想法,如何防止这种情况发生?
hashchange监听器如下:
$(window).hashchange( function(){
var nums = location.href.match(/(section|page)-\d+/g).map(
function(x){ return +x.replace(/\D/g,"") }
);
currentSection = nums[0];
currentPage = nums[1];
if( $('.section[data-section=section-'+currentSection+']').find('.page[data-page=page-'+currentPage+']').length < 1) {
currentPage = 0;
}
loadPage(currentSection, currentPage);
hCarousel.showPane(currentSection, true);
vCarousel.showPane(currentPage, true);
});
在 hashchange 事件触发时,通过向每个实例的 showPane 方法传递当前页和章节信息,确保两个旋转木马知道发生了什么变化。
if 语句用于检查页面是否有效(存在于该章节中),如果无效则默认为0。
在旋转木马方法中,也会调用 hashchange,这样当用户滑动时就会更新历史记录,并通过检查当前哈希值是否与新哈希值匹配来防止反复调用,以免在历史记录中产生重复条目。