模拟window的history对象

window的history是历史条目对象,在浏览器里,历史条目是保存在一个历史记录栈里,并通过go()等一系列函数进行操作。

最近遇到一个项目,主要需求是HTML页面放到App里,App包含一个webView来显示HTML,并提供两个按钮,一个关闭按钮(关闭webView并返回app其他界面),一个是后退按钮,后退页面,也就是浏览器的后退按钮。需求要求所有页面不能跳转,也就是需要通过div的切换来模拟多个页面。

如此原生的history对象我们就不能用了,但是借鉴原理设计一个自己的历史记录栈还是可行的,并且需求不涉及前进,只关注后退。具体思路如下:

一、定义一个数组来模拟堆栈,并且我们知道JavaScript的数组具有pop和pusp函数,这样我们把数组做为一个历史记录栈。

二、给每个div分配一个变量(或者直接用id)来标识div。

三、定义goto()函数,根据参数(实际上就是出栈次数)进行出栈。

四、每一个div切换都需要div的id入栈。

以下代码并没有什么实际意义,只是让文章看着字数多点,具体如何把Array实例做成完善的栈对象,主要还是按照自己的思路来设计为好,具体的实现会多种多样的。

var historystack         = new Array();                  // 页面历史堆栈

// 后退一次
function goto( step ) {                                  // 给App用的函数
    var stackLength = historystack.length;               // 获取栈长度(内容个数)
    if ( stackLength === 0 ) {
        return 0;
    }
    msg( stackLength );                                  //debug信息
    msg( historystack[ stackLength-1 ] );                //debug信息,取出来的id
    showDiv( historystack[ stackLength-1 ], false );     //获取栈顶id,false随便写
}
// 根据id参数显示div
function showDiv() {
    var elem, nextElem,
        elemClass, nextElemClass,
            argLength = arguments.length;

    switch ( argLength ) {
    case 1:
        // 入栈显示
        elem           = document.getElementById( thisDivId );          //获取当前页面dom
        nextElem       = document.getElementById( arguments[0] );       //获取下一页dom
        elemClass       = classList(elem);                              // 模块用
        nextElemClass = classList(nextElem);                            // 模块用
        elemClass.remove( "show" );                                     // 隐藏当前页
        nextElemClass.add( "show" );                                    // 显示下一页
        historystack.push( thisDivId );                                 //把需要隐藏的页压入栈内
        thisDivId       = arguments[0] ;                                // 保存当前页id
        try {
            mobileAndroidApp.isBack( true );                            // 告诉sdk变成后退按钮
        }
        catch (err) {
            alert(err.message);
        }
        break;
    case 2:
        //出栈显示
        elem             = document.getElementById( thisDivId );        //获取当前页面dom
        nextElem         = document.getElementById( arguments[0] );     //获取下一页dom
        elemClass         = classList(elem);                            // 模块用
        nextElemClass     = classList(nextElem);                        // 模块用
        elemClass.remove( "show" );                                     // 隐藏当前页
        nextElemClass.add( "show" );                                    // 显示上一页
        thisDivId         = historystack.pop();                         // 出栈,保存当前显示页id
        if ( historystack.length === 0 ) {                              // 栈里没东西了,表示第一页
            try {
                mobileAndroidApp.isBack( false );                       // 告诉sdk变成关闭按钮
            }
            catch (err) {
                alert(err.message);
            }
        }
        break;
    default:
        return 0;
        break;
    }

    console.dir( historystack );                                       //显示栈状态
}
时间: 2024-10-08 04:49:58

模拟window的history对象的相关文章

《JAVASCRIPT高级程序设计》window/location/navigator/screen/history对象

如果要在web中使用JAVASCRIPT,那么BOM(浏览器对象模型)毫无疑问是最重要的部分.BOM提供了很多对象,例如,window.location.navigator.screen.history对象,下面我们来一一介绍这些对象的相关功能.先从window对象开始,它表示浏览器的一个实例. window对象: 一.全局作用域 window对象在ECMAScript扮演者global对象的角色,因此在全局作用域中声明的变量和函数都会成为window对象的属性和方法:但是通过这两种方式定义的属

Window History对象

History 对象属性 length 返回浏览器历史列表中的 URL 数量. History 对象方法 back() 加载 history 列表中的前一个 URL. window.history.back() forward() 加载 history 列表中的下一个 URL. window.history.forward() go() 加载 history 列表中的某个具体页面. window.history.go(-1)

JavaScript 计时器,History 对象(window),Location对象(window),Navigator对象

1,计时器setInterval()  在执行时,从载入页面后每隔指定的时间执行代码. setInterval(代码,交互时间); 2,计时器setTimeout(),在载入后延迟指定时间后,去执行一次表达式,仅执行一次. 递归,就是在运行的过程中调用自己.setTimeout()计时器,在载入后延迟指定时间后,去执行一次表达式,仅执行一次. setTimeout(代码,延迟时间); function startCount() { document.getElementById('count')

JavaScript之DOM-7 Window常用子对象(navigator对象、location对象、history对象、screen对象)

一.navigator对象 navigator对象的作用 - navigator 对象包含有关浏览器的信息 - 常用于获取客户端浏览器和操作系统信息 常用属性和方法 二.location 对象 location 对象的作用 - location 对象包含有关当前 URL 的信息 - 常用于获取和改变当前浏览器的网址 常用属性和方法 三.history对象 history对象的作用 - history对象包含用户(在浏览器窗口中)访问过的URL的历史记录 常用属性和方法 四.screen对象 sc

【JavaScript】BOM对象——Window对象&History对象&Location 对象

1.Window对象: 表示浏览器中打开的窗口 setInterval():它有一个返回值,主要是提供给 clearInterval 使用. setTimeout():它有一个返回值,主要是提供给 clearTimeout 使用. clearInterval():该方法只能清除由 setInterval 设置的定时操作. clearTimeout():该方法只能清除由 setTimeout 设置的定时操作. 代码: <script> // //确认弹出框 // confirm("确定

JavaScript---Bom树的操作,内置方法和内置对象(window对象,location对象,navigator对象,history对象,screen对象)

JavaScript---Bom树的操作,内置方法和内置对象(window对象,location对象,navigator对象,history对象,screen对象) 一丶什么是BOM ???????Bom:Browser Object Model,浏览器对象模型.操作浏览器部分的功能的API(事件/函数). 结构图: ???分析:1.window对象是Bom的顶层对象.所有的对象都是从windom延伸出来的,称其为window子对象. ?????? 2.dom是bom的一部分 ?????? 3.

BOM之history对象

前面的话 history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起.由于安全方面的考虑,开发人员无法得到用户浏览器的URL,但借由用户访问过的页面列表,可以在不知道实际URL的情况下实现后退和前进.本文将详细介绍BOM中的history对象 length history.length属性保存着历史记录的URL数量.初始时,该值为1.如果当前窗口先后访问了三个网址,history.length属性等于3 由于IE10+浏览器在初始时返回2,存在兼容性问题,所以该值并不常用 histor

html5之history对象 控制浏览器前进或后退事件

一.摘要: 总结用history对象操作浏览器的历史记录的方法,在项目中使用的是mui框架,总结中包括我在实际项目中遇到的问题. 二.总结: 实现效果: 实现代码: 上面的编辑页面加载的时候就要先调用一次pushHistory()方法,如果不先调用一遍,在第一次点击浏览器上的返回按钮时,不会弹出提示框,必须在你按过一次手机页面上的返回键之后,你点击了提示框上的取消按钮,你再按浏览器上的返回键页面才能弹出提示框. js关键代码:  下面总结history对象的用法: a)历史记录 前进和后退的方法

HTML5实战与剖析之历史管理(history对象)

HTML5新添加了对历史的管理,更新了history对象让管理历史状态更加方便了.在现代Web应用中,用户可以通过"前进"和"后退"按钮进行历史页面的切换.这让一些不在新页面中打开的新页面前进后退自如,提高了用户体验. 通过haschange事件,可以知道URL的参数什么时候发生了变化,也就是什么时候该有所反应.通过状态管理的API,能够在不加载新页面的情况下改变浏览器的URL.所以需要使用history.pushState()方法.history.pushStat