实现网页原路返回:从哪个页面跳转过来就返回哪个页面

一、需求

        导航对于PC网站或WAP网站有着相当重要的作用,它有利于提升用户体验,不至于让用户迷路。而“返回”就是导航的功能之一,主要体现在WAP网页左上角的“返回”按钮或链接。这里“返回”是指原路返回,即从哪个页面跳转过来就返回哪个页面。或许你会想,浏览器不是有返回按钮吗?JS不是提供了history.go(-1)或history.back(-1)来实现这个功能吗?对于简单情况这是有用的,但是有两种情况或许不太适用:

(1)浏览器返回按钮和history对象提供的方法,虽然都可以返回上一页,但是返回的页面是缓存而不是最新的,尽管你可以使用其它JS方法或者设置来实现打开最新页面,但毕竟可能涉及页面过多并没有很好的可维护性。那么你可能会说,为什么一定要是最新页面呢?比如从一个数据页面跳转到另一个数据页面,现在我需要返回上一个数据页面查看最新数据呢?

(2)浏览器返回按钮和history对象提供的方法,可能造成无限循环。如:初始在A页面,点击链接进入B页面,然后再点击链接进入A页面,此时在A页面点击“返回”回到B页面,而在B页面点击“返回”又回到A页面,如此循环;又如:初始在A页面,点击链接进入B页面(因B页面需要登录故自动跳转到登录页),此时在登录页点击“返回”将先跳转到B页面又跳回登录页,如此反复。

二、方案

        要实现该功能,我们可以先配置每个页面可能的来源页面列表,并在跳转后根据来源页面去匹配关联配置,如果存在则跳转回此来源页面,否则跳回默认页面或停留在当前页面。

(1)服务端实现:将配置保存在内存或持久存储,服务端程序获取当前页面URL和来源页面URL,通过比对判断设置“返回”链接的href;

(2)浏览器端实现:将配置保存在内存、Cookie或localStorage中,JS获取当前页面URL和来源页面URL,通过比对判断设置“返回”链接的href。

        无论服务端实现还是浏览器端实现,核心思路都是配置页面关联,比对当前页面来源页面与关联配置,设置“返回”链接的href,不同之处就是配置存储在服务端还是浏览器端,本文以浏览器端为例。

三、实现

1、首先是页面关联配置,键名为当前页面过滤协议、域名和端口后的相对路径,键值为可能的来源页面相对路径的字符串数组,如:A.html页面可能从A1.html或A2.html页面跳转过来。

 

var config = {
    urlPrefix : location.origin + '/',//URL前缀,包含协议、域名、端口等,用于过滤
    pageLinkList : {
        "A.html": ["A1.html", "A2.html"],
        "B.html": ["B1.html", "B2.html"]
    }
};

 

2、页面加载完成后调用该方法获取返回URL并设置“返回”链接的href。

 

//defaultBackUrl:未找到匹配时的默认返回相对路径
var getBackUrl = function(defaultBackUrl) {
    var sIndex = location.href.indexOf(config.urlPrefix) + config.urlPrefix.length;//获取当前页面相对路径的起始索引
    var eIndex = location.href.indexOf('?');//获取当前页面相对路径的截止索引
    var page = (eIndex < 0 ? location.href.substring(sIndex) : location.href.substring(sIndex, eIndex)).toLowerCase();//获取当前页面相对路径
    if (null == config.pageLinkList[page]) return defaultBackUrl;//未匹配到则返回默认返回URL
    var referrer = document.referrer;
    for (var index = 0; index < config.pageLinkList[page].length; index++) {
        if (referrer.toLowerCase().indexOf(config.urlPrefix + config.pageLinkList[page][index]) >= 0) {
            return referrer;
        }
    });
    return defaultBackUrl;
}

 

3、对于登录页,可以传递来源页面的来源URL用于返回,传递来源页面用于登录成功后自动跳转。若不想在URL中传递,当然也可将这两个URL(即登录页的最近信息)存入在localStorage或Cookie中。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下一个示例代码,用于使小车在使用灰度传感器进行循迹后原路返回起点: ```python import RPi.GPIO as GPIO import time # 设置GPIO引脚 left_motor_input1 = 17 left_motor_input2 = 18 right_motor_input1 = 27 right_motor_input2 = 22 # 初始化GPIO设置 GPIO.setmode(GPIO.BCM) GPIO.setup(left_motor_input1, GPIO.OUT) GPIO.setup(left_motor_input2, GPIO.OUT) GPIO.setup(right_motor_input1, GPIO.OUT) GPIO.setup(right_motor_input2, GPIO.OUT) # 设置小车行驶方向的函数 def set_motor_direction(left_direction, right_direction): GPIO.output(left_motor_input1, left_direction) GPIO.output(left_motor_input2, not left_direction) GPIO.output(right_motor_input1, right_direction) GPIO.output(right_motor_input2, not right_direction) # 设置小车返回的函数 def return_car(): set_motor_direction(1, 0) # 右转 time.sleep(2) # 转弯时间 set_motor_direction(1, 1) # 直行 # 灰度传感器读取函数 def read_grayscale_sensor(): # 在这个函数中,你需要实现读取灰度传感器的逻辑,返回一个布尔值, # 表示是否检测到黑线(例如,True表示检测到黑线,False表示没有检测到黑线)。 # 根据实际情况修改这个函数来适配你所使用的灰度传感器。 pass # 记录是否到达终点的标志 reached_destination = False while True: if read_grayscale_sensor(): # 检测到黑线,前进 set_motor_direction(1, 1) else: # 没有检测到黑线,停止 set_motor_direction(0, 0) return_car() # 如果丢失黑线,则自动返回 # 在这里添加检测是否到达终点的逻辑 # 如果到达终点,设置 reached_destination 为 True if reached_destination: break # 停止小车 set_motor_direction(0, 0) # 清理GPIO设置 GPIO.cleanup() ``` 在这个示例代码中,你需要根据实际使用的灰度传感器来实现`read_grayscale_sensor()`函数,该函数应该能够读取灰度传感器并返回一个布尔值,表示是否检测到黑线。根据检测到黑线与否,设置小车的行驶方向。当丢失黑线时,调用`return_car()`函数使小车原路返回。在主循环中,你可以添加适应你的应用场景的检测是否到达终点的逻辑,并设置`reached_destination`标志。最后,停止小车并清理GPIO设置。 请注意,此示例代码仅提供了一个基本的框架,你需要根据实际情况进行适当的修改和调整,例如设置GPIO引脚编号,实现灰度传感器读取函数,以及检测到达终点的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值