Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >HTML5历史API演示

HTML5历史API演示
EN

Stack Overflow用户
提问于 2012-05-13 04:30:57
回答 2查看 4.5K关注 0票数 3

我一直在阅读关于HTML5历史API的文章,到目前为止,我还没有找到一个简单的工作演示来展示使用代码的机制。

这里是一个工作 小提琴:4个按钮和4个div.当用户按下一个按钮时,它会显示相应的面板。

我想做的是:

代码语言:javascript
运行
AI代码解释
复制
1) rewrite the URL so that when the user is on panel 4 the url ends with /Panel4
2) make the back button and forward button work with the history API.

我知道有history.js插件,但我想了解API是如何以最简单的形式工作的。

希望,jsfiddle将帮助其他人谁将来到这个页面寻找一个代码演示。

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-16 08:51:04

好的,我创建了我认为最简单的历史API演示.

它不能在小提琴中工作,因为它需要在自己的窗口中运行。但是,如果您在记事本中复制粘贴代码,在指定的位置添加对jquery的引用,并将其保存在桌面上作为html文件,它就会工作。当然,它在IE中不起作用,但我们都知道。我提供了两个版本:一个在没有URL重写组件的情况下工作(它将从您的桌面上运行),我还注释掉了您可以操作URL的版本。对于后者,您需要从远程或本地服务器运行它。

我很难让它在所有浏览器上运行,因为Chrome、Safari和Firefox的工作方式不同!下面是代码:

代码语言:javascript
运行
AI代码解释
复制
    <html>
    <head>
    <style type="text/css">

    .Panel{
       width:200px;
       height:100px;
       background:red;
       display:none;
       color:white;
       padding:20px 20px;}

    .ChangeButton{
       margin:10px 10px;
       float:left;}   

    </style>

   // add reference to jquery.js file here 
   // <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>        

    <script type="text/javascript">

    var TheURL; // if you don't need URL rewrite, then we're always going to 
                // show the same URL. Remove this line if you want URL rewrite.

    var MyDivs = { // this object stores the name and the URL of each possible state
       ShowPanel1: {panelID:'Panel1', DisplayURL:'/panel1'},
       ShowPanel2: {panelID:'Panel2', DisplayURL:'/panel2'},
       ShowPanel3: {panelID:'Panel3', DisplayURL:'/panel3'},
       ShowPanel4: {panelID:'Panel4', DisplayURL:'/panel4'},
    };

    $(document).ready(function () {

    TheURL = document.URL; // You can remove this line if you're doing
                           // URL rewrite

    window.addEventListener('popstate', function (event) {

       //cross-browser nightmare here!!!!!
       var HistoryState = history.state;

       if (HistoryState === null || HistoryState === undefined) {
            HistoryState = event.state; }

       if (HistoryState === null || HistoryState === undefined) {
            HistoryState = window.event.state; }

       SwitchPanel(HistoryState);
    });

    $('.ChangeButton').click(function () {
           DoChange(parseInt($(this).attr('id').charAt(6), 10)); });

    DoChange(1);

    });

    function DoChange(ButtonID) {

       switch (ButtonID) {

       // here's the 2-version option: 
       // toggle the commented and uncommented history.pushState
       // lines to see the change to the URL in action
       case 1:
           SwitchPanel(MyDivs.ShowPanel1.panelID);
           history.pushState(MyDivs.ShowPanel1.panelID, "", TheURL);
           // history.pushState(MyDivs.ShowPanel1.panelID, "", MyDivs.ShowPanel1.DisplayURL);
           break;
       case 2:
           SwitchPanel(MyDivs.ShowPanel2.panelID);
           history.pushState(MyDivs.ShowPanel2.panelID, "", TheURL);
           // history.pushState(MyDivs.ShowPanel2.panelID, "", MyDivs.ShowPanel2.DisplayURL);
           break;
       case 3:
           SwitchPanel(MyDivs.ShowPanel3.panelID);
           history.pushState(MyDivs.ShowPanel3.panelID, "", TheURL);
           // history.pushState(MyDivs.ShowPanel3.panelID, "", MyDivs.ShowPanel3.DisplayURL);
           break;
       case 4:
           SwitchPanel(MyDivs.ShowPanel4.panelID);
           history.pushState(MyDivs.ShowPanel4.panelID, "", TheURL);
           // history.pushState(MyDivs.ShowPanel4.panelID, "", MyDivs.ShowPanel4.DisplayURL);
           break;
       }
    }

    function SwitchPanel(PanelID) {

       if (PanelID === null) {return false;}

       $('.Panel').hide();
       $('#' + PanelID).fadeIn('medium');
    }

    </script>
    </head>

    <body>

    <input type="button" id="Button1" class="ChangeButton" value="panel 1" />
    <input type="button" id="Button2" class="ChangeButton" value="panel 2" />
    <input type="button" id="Button3" class="ChangeButton" value="panel 3" />
    <input type="button" id="Button4" class="ChangeButton" value="panel 4" />

    <div id="PanelContainer" style="clear:both;">

       <div class="Panel" id="Panel1">panel 1</div>
       <div class="Panel" id="Panel2">panel 2</div>
       <div class="Panel" id="Panel3">panel 3</div>
       <div class="Panel" id="Panel4">panel 4</div>

    </div>

    </body>
    </html>

如果它对你有用的话,那就投票吧。

好好享受!

票数 2
EN

Stack Overflow用户

发布于 2012-05-13 06:28:34

好的,我给你做了个例子。从HTML代码(index.html)开始:

代码语言:javascript
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
    <head>
        <title>Stackoverflow</title>
        <script type="text/javascript" src="sof.js"> </script>
    </head>
    <body onLoad="load();">
        <ul id="menu">
            <li><a href="/home">home</a></li>
            <li><a href="/about">about</a></li>
            <li><a href="/blog">blog</a></li>
            <li><a href="/photos">photos</a></li>
        </ul>
        <button onclick="back ();">Back</button>
        <button onclick="ff ();">Forward</button>
        <div>
            Action: <span id="action"></span><br/>
            Url: <span id="url"></span><br/>
            Description: <span id="description"></span>
        </div>
    </body>
</html>

然后是javascript文件(sof.js):

var菜单,url,描述,动作,数据,historyState,act;

代码语言:javascript
运行
AI代码解释
复制
function $ (id) {return document.getElementById (id);}

// Updates infos
function update (state) {
    action.innerHTML = act;
    url.innerHTML = state.url;
    description.innerHTML = state.description;
}

// Goes back
function back () {
    act = 'Back';
    history.back ();
}

// Goes forward
function ff () {
    act = 'Forward';
    history.forward ();
}

function load () {
    menu = $ ('menu');
    url = $ ('url');
    description = $ ('description');
    action = $ ('action');

    // State to save
    historyState = {
        home: {
            description: 'Homepage'
        } ,
        about: {
            description: 'Infos about this website'
        } ,
        blog: {
            description: 'My personal blog'
        } ,
        photos: {
            description: 'View my photos'
        }
    };

    // This is fired when history.back or history.forward is called
    window.addEventListener ('popstate', function (event) {
        var hs = history.state;

        if ((hs === null) || (hs === undefined)) hs = event.state;
        if ((hs === null) || (hs === undefined)) hs = window.event.state;

        if (hs !== null) update (hs);
    });

    menu.addEventListener ('click', function (event) {
        var el = event.target;
        // Prevents url reload
        event.preventDefault ();

        // Handles anchors only
        if (el.nodeName === 'A') {
            // Gets url of the page
            historyState[el.innerHTML].url = el.getAttribute ('href');
            // Creates a new history instance and it saves state on it
            history.pushState (historyState[el.innerHTML], null, el.href);
            act = 'Normal navigation';
            update (historyState[el.innerHTML]);
        }
    });

    // Handles first visit navigation
    var index = location.pathname.split ('/');
    index = index[index.length-1];
    if (index !== '') {
        historyState[index].url = location.pathname;
        history.pushState (historyState[index], null, location.pathname);
        act = 'First visit';
        update (historyState[index]);
    }
}

以及直接请求的.htaccess

代码语言:javascript
运行
AI代码解释
复制
RewriteEngine On

RewriteRule ^home$ ./index.html
RewriteRule ^about$ ./index.html
RewriteRule ^blog$ ./index.html
RewriteRule ^photos$ ./index.htm

每次单击锚点时,都会将一个新的历史实例推送到历史堆栈上,并保存一个对象(称为状态):本地url被更改,但加载由'event.preventDefault()‘方法停止。此外,还更新了一些信息(如URL、Description和Action)。

然后,使用“后退”和“前进”按钮,您可以遍历历史记录,并使用“history.state”(或event.state或window.event.state,取决于浏览器)检索当前状态。

最后,如果将整个url直接输入地址栏,则它与上面的.htaccess一样工作;)

我希望这个例子对你有帮助;)

再见

威尔克

PS:欲知详情:

  1. 操纵浏览器历史记录
  2. 历史对象
  3. 历史如何
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10571734

复制
相关文章
第89天:HTML5中 访问历史、全屏和网页存储API
history新增的两个方法history.replaceState()和history.pushState()方法属于HTML5浏览器新增的属性,所以IE9以下的是不支持的。
半指温柔乐
2018/09/11
1.1K0
HTML5 File API
在 HTML5 的 input 标签中,新增了一个 type=file 属性的表单控件。这个控件可以让我们能调出文件选择窗口然后读取这些文件的内容成为可能。
多云转晴
2019/10/23
1.8K0
HTML5 File API
HTML5:File API
FileReader 是一种异步文件读取机制,用于读取File、Blob中的文件数据。
WEBJ2EE
2019/07/19
9130
HTML5:File API
HTML5之API
  加载时直接播放音频的方式:new Audio("BY2.mp3").play();
JQ实验室
2022/02/09
5410
HTML5 性能监控API - timing API
HTML5 的 performance timing API 统计了一个浏览器窗口从卸载当前页面开始到加载完毕目标页面的整个流程中,每个节点的时间戳 通过这些节点的时间戳,我们可以计算出很多有用的信息 例如 DNS 查询耗时 TCP连接耗时 request请求耗时 解析dom树耗时 …… 在GitHub上找到一个很实用的JS代码,统计出了各项耗时数据 地址是:https://github.com/CraryPrimitiveMan/performance-tool 下面列出其中的各项数据
dys
2018/04/03
1.5K0
HTML5(五)——Canvas API
Canvas API(画布)提供了一个通过 javascript 和 html 的 canvas 元素来在网页上实时绘制图形的方式。可用于动画、游戏、图标、图片编辑等多个方面。
呆呆
2021/09/29
6590
HTML5的Histroy API
比较典型的是GitHub,在点击代码文件夹和文件时,会发现它的url地址栏变换了、标题栏变化了、前进后退按钮也变化了(跟新开了一个新页面感觉一样),但体验起来很平滑(外层框架的内容没有重新加载,例如:登录信息、是否关注主人等),然后是ajax载入新内容。
meteoric
2018/11/15
8810
HTML5(五)——Canvas API
Canvas API(画布)提供了一个通过 javascript 和 html 的 canvas 元素来在网页上实时绘制图形的方式。可用于动画、游戏、图标、图片编辑等多个方面。
呆呆
2021/11/26
4780
HTML5的File API
说到File API,比如有意思就是图片上传了。国外有一个网站叫min.us  用户只需要把图片拖到网页面中,然后自己进行排序就OK了,很方便。
meteoric
2018/11/15
1.9K0
HTML5 Canvas API详解
HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4。HTML5 是一个 W3C “工作草案” — 意味着它仍然处于开发阶段 — 它包含丰富的元素和属性,它们都支持现行的 HTML 4.01 版本规范。它还引入了几个新元素和属性,它们适用许多使用 web 页面的领域 — 音频、视频、图形、数据存储、内容呈现,等等。本文主要关注图形方面的增强:canvas。 新的 HTML5 canvas 是一个原生 HTML 绘图簿,用于 JavaScript 代码,不使用第三方工具。跨所有 web 浏览器的完整 HTML5 支持还没有完成,但在新兴的支持中,canvas 已经可以在几乎所有现代浏览器上良好运行了,但 Windows® Internet Explorer® 除外。幸运的是,一个解决方案已经出现,将 Internet Explorer 也包含进来。 本质上,canvas 元素是一个白板,直到您在它上面 “绘制” 一些可视内容。与拥有各种画笔的艺术家不同,您使用不同的方法在 canvas 上作画。您甚至可以在 canvas 上创建并操作动画,这不是使用画笔和油彩所能够实现的。
业余草
2019/01/21
2.1K0
HTML5的Geolocation API
Geolocation API用于将用户当前地理位置信息共享给信任的站点,这涉及用户的隐私安全问题,所以当一个站点需要获取用户的当前地理位置,浏览器会提示用户是“允许” or “拒绝”。
meteoric
2018/11/15
1.6K0
HTML5学习—Canvas API入门
在Canvas出来之前,开发人员要在浏览器中绘图,必须使用Adobe的Flash或者SVG(Scalable Vector Graphices,可缩放矢量图形)插件。但是HTML5 Canvas出来之后,很多动态生成或者展示图形、图表、图像或者动画的功能都由Canvas来完成。同时开发人员会用SVG和Canvas进行比较,因为SVG在很多场合下比Canvas优秀。
八哥
2022/05/11
6240
HTML5学习—Canvas API入门
让Flash内心崩溃的HTML5小历史
戳蓝字“IMWeb前端社区”关注我们哦! 文/韩翔 移动平台游戏制作人 链接:http://www.techug.com/post/html5-history.html 1写在前面 对于HTML5,在今天这个互联网时代,大部分人应该至少都听说过这个名字,或许很多人对HTML5的了解都起于一句话:FLASH杀手。 HTML5其实早已不是什么新鲜的事物了,其最初的雏形早在2004年就诞生了,虽然整个标准的制定过程极其漫长,然而即便只关注最终标准确定,也已经是2014年的事了。 开始常规提问,什么是HTML5?
用户1097444
2022/06/29
4450
让Flash内心崩溃的HTML5小历史
通过Zabbix API获取历史监控数据
Zabbix API可以通过JSON RPC协议来获取历史数据。 可以采用脚本或者任何支持JSON RPC的工具来使用API。
星哥玩云
2022/06/30
2.3K0
用API获取Bigone历史成交记录
Bigone中查看历史交易的功能并不友好,只能按时间范围查询,如果一笔订单分为许多次成交,界面里就列出多少条,而且还混杂着其它币种,想查清楚自己在哪个价格卖出多少,又在哪个价格买入了多少,只能手工一条一条地统计。看来bigone的程序员小哥自己肯定不炒币。
申龙斌
2018/07/27
7190
用API获取Bigone历史成交记录
HTML5 性能监控API - 计时
计时API可以测量两个预定义标记之间的性能,仅需要分别定义测量的开始和结束标记 例如 var start = performance.now(); ... var start = performance.now(); 这个方式和我们通常使用Date获取时间戳的方式很像,他们的主要区别有两个 (1)now能够精确到千分位小数的毫秒值,Date时间戳得到的是毫秒 (2)now是从浏览器浏览开始事件触发时到现在的毫秒数,时间戳是当前时间的毫秒数 示例 - 分析一个图片的加载时间 <img src="
dys
2018/04/03
1.2K0
html5 文件api使用示例
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>html5文件API</title> <script type="text/javascript"> function getName(){ var file = document.getElementById("file"); //document.getElementById("file").files // 返回 FileList对象
好派笔记
2021/11/02
7640
HTML5 拖放API简单介绍
1、给可以拖动的元素添加属性 draggable=‘true’,绑定dragstart事件,用于给传输对象保存内容,使用event.dataTransfer获取到数据传输对象,绑定selectstart事件,阻止默认行为,用于防止选中文本。
前Thoughtworks-杨焱
2021/12/07
1K0
HTML5 File API 使用技巧
在 HTML5 的 input 标签中,新增了一个 type=file 属性的表单控件。这个控件可以让我们能调出文件选择窗口然后读取这些文件的内容成为可能。
多云转晴
2019/10/22
2.6K0
HTML5管理与实际历史的分析(history物)
在现代Web应用。用户”前进”和”退却”button切换历史页面。这使得新的页码不会打开一个新的网页前进和后退自如,改善用户体验。
全栈程序员站长
2022/07/06
4180

相似问题

HTML5 -历史API

123

HTML5历史API MVC

11

HTML5历史API返回按钮

14

引导模式与HTML5历史API

12

html5历史api删除url哈希

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档