- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图找到一个干净的解决方案,以最有效的方式使用浏览器历史记录。(我正在使用GWT,但这个问题实际上比那个问题更普遍。)
我的情况是这样的(我认为这很正常):
我有一个web应用程序,它有几个不同的页面/位置/位置(无论您想怎么称呼它),我会根据浏览器历史记录的更改显示这些页面/位置。除了通常的“主页”、“功能”、“联系人”等大多是静态HTML页面之外,还有一个“用户”部分,用户可以登录到他们的用户帐户,还有(我们称之为“项目”部分,用户可以在其中处理他们的项目。
所以,现在我只需要使用名为“主页”、“功能”、“联系人”等的本地链接,以及“用户”、“项目”来访问不同的页面。一切都很好,除了以下情况:
例如,如果有人打开链接项目,则会显示一个项目登录对话框。这个登录对话框有一个cancel按钮,我只想通过从我的应用程序调用浏览器的back按钮来实现(非常简单)。我想这么做的原因有两个:
您可以从应用程序中的几个不同位置以及书签访问此登录对话框,使用此方法,我不需要跟踪用户的来源。
更重要的是:如果我确实记得用户来自何方(例如家)并将用户“转发”链接到返回该位置,我将获得以下效果:
假设用户访问主页,然后访问功能,然后单击项目登录。
如果用户单击“取消”按钮,然后我将其“转发”到“功能”,则单击浏览器的“后退”按钮后将返回登录对话框,然后再次单击“功能”,最后返回“主页”。不是你所期望的那样。
相反,如果我只是通过浏览器的back函数实现cancel,那么您会希望立即返回到Home。
在这一点上,一切都很好,除了用户最初通过一个指向#项目的直接书签链接进入这个登录对话框。因为这样,如果我简单地将cancel=back设置为back,那么用户将从页面完全返回到浏览器的起始页或以前的任何位置。所以,在这种情况下,我需要将“forward”链接到“Home”。
现在,我试着想出了几种方法来解决这个问题,并提出了一些解决方案,但对我来说,似乎没有一个是非常可取的,但让我分享一下,也许可以激发一些创造力:
当页面第一次打开时,获取历史标记。如果是#Project或#User或其他任何触发可取消对话框的项,请将以下项放入历史堆栈:#Home,#Project,其中最后一项是保存的初始令牌。这样,我的取消按钮就可以正常工作了。。。一次。。。但是,如果用户随后单击后退,他将再次获得登录对话框(因为原始历史标记仍在历史堆栈中,我不知道如何清除它)。单击“取消”将使他离开页面(不一致的行为)。
相反,我可以将Project放在堆栈上,这样我就可以捕捉到一个back-click,它可以检测到这个链接并简单地将Home标记重新添加到堆栈上,从而让用户离开页面。这将解决问题,总体上工作得很好,除了我讨厌网站,不让你退出他们没有锤回按钮足够快。。。
最干净的解决方案是,如果我能以某种方式跟踪历史堆栈的长度,就我的应用程序中的位置而言。一开始就很简单:上面有一个项目。但如果我得到一系列这样的地方:家,特色,家呢?用户是否单击“上一步”返回“主页”,即历史记录现在在浏览器中的长度为1,或者单击“主页”链接,即历史记录的长度为3?我的想法是:
定义一下,家和家是一样的。
使页面链接中的所有链接仅指向链接的大写版本。
每当您收到以
大写字母,立即在历史记录中添加两项,
第一个以小写字母开头,第二个也以大写字母开头。也就是说,家变成了家。
如果你得到一个以小写字母开头的历史记录更改,你知道用户只是点击了后退而不是链接,你只需再点击两次后退,他就可以真正回到上一页。
现在您可以区分“向后”和“向前”链接,并在代码中维护准确的历史模型。
但是,不幸的是,这有两个问题:第一,浏览器的历史记录中充斥着垃圾(不是很优雅),第二,系统开始崩溃,如果用户点击足够快,以至于你的应用没有时间对消息做出反应。
看起来这应该是一个非常普遍的问题,我希望你们中的一个能给我指出一个比我目前的想法更有用的方向。
最佳答案
window.history
有一个length
属性,它将显示当前选项卡的历史记录中有多少个条目。不幸的是,它是不可过滤的(所以没有办法说window.history.localURLs.length
)。
如果您几乎完全是在客户端(即部分更新、很少的完整页面加载、使用散列或history.(push|pop)State
API)执行此操作,那么您可能需要考虑将客户端路由框架合并到应用程序中,以避免重新发明控制盘。
关于javascript - 浏览器历史记录管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13576848/
我有一个网站。 必须登录才能看到里面的内容。 但是,我使用此代码登录。 doc = Jsoup.connect("http://46.137.207.181/Account/Login.aspx")
我正在尝试为我的域创建一个 SPF 记录并使我的邮件服务器能够对其进行评估。我在邮件服务器上使用 Postfix 并使用 policyd-spf (Python) 来评估记录。目前,我通过我的私有(p
我需要为负载平衡的 AWS 站点 mywebsite.com 添加 CName 记录。记录应该是: @ CNAME mywebsite.us-east-1.elb.amazon
我目前正在开发一个相当大的多层应用程序,该应用程序将部署在海外。虽然我希望它在解聚后不会折叠或爆炸,但我不能 100% 确定这一点。因此,如果我知道我可以请求日志文件,以准确找出问题所在以及原因,那就
我使用以下命令从我的网络摄像头录制音频和视频 gst-launch-0.10 v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1
我刚刚开始使用 ffmpeg 将视频分割成图像。我想知道是否可以将控制台输出信息保存到日志文件中。我试过“-v 10”参数,也试过“-loglevel”参数。我在另一个 SO 帖子上看到使用 ffmp
我想针对两个日期查询我的表并检索其中的记录。 我这样声明我的变量; DECLARE @StartDate datetime; DECLARE @EndDate datetime; 并像这样设置我的变量
在 javascript 中,我可以使用简单的 for 循环访问对象的每个属性,如下所示 var myObj = {x:1, y:2}; var i, sum=0; for(i in myObj) s
最近加入了一个需要处理大量代码的项目,我想开始记录和可视化调用图的一些流程,让我更好地理解一切是如何组合在一起的。这是我希望在我的理想工具中看到的: 每个节点都是一个函数/方法 如果一个函数可以调用另
如何使用反射在F#中创建记录类型?谢谢 最佳答案 您可以使用 FSharpValue.MakeRecord [MSDN]创建一个记录实例,但是我认为F#中没有任何定义记录类型的东西。但是,记录会编译为
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
我是 Sequelize 的新手并且遇到了一些语法问题。我制作了以下模型: // User sequelize.define('user', { name: { type: DataTyp
${student.name} Notify 这是我的output.jsp。请注意,我已经放置了一个链接“Notify”以将其转发到 display.jsp 上。但我不确定如何将 Stud
例如,这是我要做的查询: server:"xxx.xxx.com" AND request_url:"/xxx/xxx/xxx" AND http_X_Forwarded_Proto:(https O
我一直在开发大量 Java、PHP 和 Python。所有这些都提供了很棒的日志记录包(分别是 Log4J、Log 或logging)。这在调试应用程序时有很大帮助。特别是当应用程序 headless
在我的Grails应用程序中,我异步运行一些批处理过程,并希望该过程记录各种状态消息,以便管理员以后可以检查它们。 我考虑过将log4j JDBC附加程序用作最简单的解决方案,但是据我所知,它不使用D
我想将进入 MQ 队列的消息记录到数据库/文件或其他日志队列,并且我无法修改现有代码。是否有任何方法可以实现某种类似于 HTTP 嗅探器的消息记录实用程序?或者也许 MQ 有一些内置的功能来记录消息?
如果我有一条包含通用字段的记录,在更改通用字段时是否有任何方法可以模仿方便的 with 语法? 即如果我有 type User = // 'photo can be Bitmap or Url {
假设我有一个名为 Car 的自定义对象。其中的所有字段都是私有(private)的。 public class Car { private String mName; private
当记录具有特定字段时,我需要返回 true 的函数,反之亦然。示例: -record(robot, {name, type=industrial, ho
我是一名优秀的程序员,十分优秀!