返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript如何防止页面退格键回退
  • 465
分享到

JavaScript如何防止页面退格键回退

JavaScript防止回退JavaScript回退JavaScript退格键回退 2023-05-19 11:05:19 465人浏览 薄情痞子
摘要

目录什么是退格键思路概述具体实现兼容性处理焦点问题处理history.back()问题在 Vue 中使用方案一:自定义指令方案二:Vue Mixin总结在一个网页中,当我们在输入框内

在一个网页中,当我们在输入框内输入文字或者进行密码输入时,我们并不希望用户通过按下退格键来操作历史记录和回退到上一个页面。因此,我们往往需要编写代码来阻止这个默认行为。本文将介绍如何使用js来实现这个过程,并展示此方法可以在不同的场景下调用。

什么是退格键

最初的Unix终端是Teletype ASR33,由纸带穿孔机以及纸带阅读机和键盘组成。Backspace和Delete并不属于该键盘上的按键

在键入内容的时候如果出错,则需要按下^(ctrl)+H向teletype发送一个退格命令,使得穿孔机移回之前的位置,然后按下Rubout键再发送一个删除命令才能做到删除对应位置内容

之后为了方便开始制造带有backspace按键的终端,同时完成退格和删除两个功能

后来Rubout键被改名为Delete,一些Unix公司决定在键盘中加入Delete键(用于删除一个字符),这些公司决定用Delete代替^+H代表退格。因此,情况变成了一些键盘可以按下Backspace删除字符,另一些要按下Delete。

对于现在的键盘来讲,实际情况是有Backspace键时按下后则会触发退格加删除两个操作,此时的Delete键的作用只对应删除这一个操作,因此Backspace键删除的都是光标之前的字符,Delete键删除的是光标之后的字符;如果没有Backspace键则用Delete键来代替(也是退格加删除两个操作)。

思路概述

首先,通过键盘事件检查用户的按键,判断对于的键是否是“退格键”。如果是,则阻止默认行为,即不允许回退。该过程可以分为以下几步:

  • 注册键盘事件监听器;
  • 获取当前被按下的键名称;
  • 判断是否对应“退格键”;
  • 阻止事件的默认行为。

具体实现

document.onkeydown = function(event) {
  var e = event || window.event;
  var keyCode = e.keyCode || e.which;
  // 判断是否为退格键
  if (keyCode == 8) {
    if (e.preventDefault) {
      e.preventDefault();
    } else {
      e.returnValue = false;
    }
  }
}

以上代码展示了具体实现过程。其中,我们通过keyCodewhich获取当前键位,使用if语句判断是否为退格键(退格键的keycode为8),如果是则执行preventDefault()阻止默认行为,否则放行。

兼容性

该方法与不同的浏览器兼容性良好。以上代码中处理退格键的keyCode属性已被所有现代浏览器所支持,同时也被IE等老旧浏览器所支持。

但是,为了保证屏幕能够实时响应用户的操作,我们还应该考虑到一些其他因素。例如:

  • 输入框焦点问题;
  • 操作历史记录问题(比如在Firefox上,无法通过上述方式堵住history.back())。

处理焦点问题

因为我们只想阻止用户在当前输入框输入时使用退格键进行“回退”操作,因此如果用户焦点不在一个输入框内(例如按下Tab键)而按下退格键,我们可以不做任何处理。下面展示了如何根据焦点状态来判断是否进行回退处理。(在本例中,我们选择使用Jquery库)

$(document).on('keydown', function (event) {
  if (event.keyCode == 8) {
    var doPrevent = false;
    var target = event.target;
    if (target.isContentEditable || 
      (target.nodeName.toLowerCase() == 'input' && 
        (target.type.toLowerCase() == 'text' || target.type.toLowerCase() == 'passWord' || target.type.toLowerCase() == 'email'))) {
      // 在输入框或可编辑区域
      doPrevent = false;
    } else {
      doPrevent = true;
    }
    if (doPrevent) {
      event.preventDefault();
    }
  }
});

处理history.back()问题

如果用户使用退格键作为history.back()方法的替代品,那么我们需要捕获该事件并进行处理。在这种情况下,我们不应该阻止跳转,而是在回退前弹出一个警告框,让用户来确认是否想要撤销操作。

$(document).on("keydown", function(event) {
    var doPrevent = false;
    if ((event.ctrlKey || event.metaKey) && (event.keyCode == 78 || event.keyCode == 82)) {
        doPrevent = true;
    }
    if (event.keyCode == 8) {
        var target = event.target;
        if (target.isContentEditable || 
          (target.nodeName.toLowerCase() == 'input' && 
            (target.type.toLowerCase() == 'text' || target.type.toLowerCase() == 'password' || target.type.toLowerCase() == 'email'))) {
            // 在输入框或可编辑区域
            doPrevent = false;
        } else {
            doPrevent = true;
        }
    }
    if (doPrevent) {
        event.preventDefault();
        window.history.back();
        if (typeof window.history.back.callback === "function") {
            window.history.back.callback();
        } else {
            window.history.back.callStack = window.history.back.callStack || [];
            window.history.back.callStack.push(window.history.back);
        }
        setTimeout(function() {
            var r = confirm("确认要现在离开该页面吗?");
            if (r == true) {
                window.location = "/loGout";
            } else {
                window.history.forward();
                if (window.history.back.callStack.length > 0) {
                    var c = window.history.back.callStack.pop();
                    c();
                }
            }
        }, 100);
        return true;
    }
});

如上代码所示,我们将用户的操作记录压入一个callStack数组中,并弹出确认框来防止过快跳转影响用户体验。如果用户选择“确认”,则返回到主页并进行相关处理;否则,程序将在call stack数组中找到最有一个未执行的回调函数,再次执行。

在 Vue 中使用

方案一:自定义指令

Vue v-on 指令支持警告修饰符 .prevent 来停止事件冒泡并防止热键。我们可以创建一个自定义指令来触发该修饰符。

main.js 文件中注册指令:

Vue.directive('prevent-back', {
  bind: function (el, binding, vnode) {
    var handler = function (event) {
      if (event.keyCode === 8) {
        event.preventDefault();
        vnode.elm.dispatchEvent(new Event('input'));
      }
    };
    el.addEventListener('keydown', handler);
    el.addEventListener('blur', function() {
      el.removeEventListener('keydown', handler);
    });
  }
});

在模板中使用自定义指令:

<template>
  <div>
    <input type="text" v-prevent-back />
  </div>
</template>

方案二:Vue Mixin

Vue Mixin 可以让我们在组件中混入同样的数据和方法,从而复用代码。我们可以创建一个全局的 Mixin,在需要阻止回退键的组件中混入该 Mixin。

main.js 文件中定义 Mixin:

Vue.mixin({
  methods: {
    preventBackspace: function(event) {
      if (event.keyCode === 8) {
        event.preventDefault();
      }
    },
    addKeyListener: function() {
      window.addEventListener('keydown', this.preventBackspace, true);
    },
    removeKeyListener: function() {
      window.removeEventListener('keydown', this.preventBackspace, true);
    }
  }
})

在组件中混入 Mixin:

import Vue from 'vue';
export default {
  mixins: [Vue.mixin],
  mounted() {
    this.addKeyListener();
  },
  destroyed() {
    this.removeKeyListener();
  }
}

总结

本文详细介绍了如何实现屏蔽页面退格键回退的方法。同时,我们讨论了如何在不同环境下确保其兼容性和正确性。通过使用jQuery库和一些看似简单但微不足道的技巧,我们成功地在几个关键点上解决了各种问题。我相信读完这篇文章后,你已经能够轻松地在其他网站上使用此方法并应用到自己的项目中去啦!

到此这篇关于javascript如何防止页面退格键回退的文章就介绍到这了,更多相关JavaScript防止退格键回退内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript如何防止页面退格键回退

本文链接: https://lsjlt.com/news/213079.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JavaScript如何防止页面退格键回退
    目录什么是退格键思路概述具体实现兼容性处理焦点问题处理history.back()问题在 Vue 中使用方案一:自定义指令方案二:Vue Mixin总结在一个网页中,当我们在输入框内...
    99+
    2023-05-19
    JavaScript防止回退 JavaScript回退 JavaScript 退格键回退
  • js如何屏蔽退格键
    这篇文章主要介绍了js如何屏蔽退格键,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。没有绝对的屏蔽,最好是js结合服务端混合用。服务端通过判断...
    99+
    2024-04-02
  • js如何禁止浏览器页面后退功能
    小编给大家分享一下js如何禁止浏览器页面后退功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实例如下所示:<script...
    99+
    2024-04-02
  • php如何跳转到上级页面或退回前一个页面
    本篇内容介绍了“php如何跳转到上级页面或退回前一个页面”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!要理解如何跳转到上级页面或者退回到前一...
    99+
    2023-07-05
  • js如何解决文本框设置只读后按退键后退页面问题
    小编给大家分享一下js如何解决文本框设置只读后按退键后退页面问题,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! js解决文本框...
    99+
    2024-04-02
  • js如何禁止浏览器的回退事件
    小编给大家分享一下js如何禁止浏览器的回退事件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!查找了好多资料才找到的,这种方式,可...
    99+
    2024-04-02
  • win11退回win10按键没反应如何解决
    本篇内容介绍了“win11退回win10按键没反应如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先我们点击任务栏的开始菜单,然后点...
    99+
    2023-07-01
  • 如何使用ionic点击系统返回键退出App
    本篇文章给大家分享的是有关如何使用ionic点击系统返回键退出App,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在安卓下,如果不处理系统返回...
    99+
    2024-04-02
  • ionic+html5+API如何实现双击返回键退出应用
    这篇文章主要介绍ionic+html5+API如何实现双击返回键退出应用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用ionic+MUI联合开发app,鉴于ionic单方面实现的...
    99+
    2024-04-02
  • Pyqt5如何设置返回键和跳转页面键
    这篇文章主要介绍了Pyqt5如何设置返回键和跳转页面键,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。例子一import sysfrom PyQt5.QtW...
    99+
    2023-06-14
  • uniapp小程序中的导航如何设置图片 自定义导航栏 +页面跳转+页面回退
    要让uniapp中的背景图片全屏,可以在标签中添加以下样式:  page {     background-image: url('/static/bg.jpg');     background-size: cover;     ba...
    99+
    2023-09-02
    vue.js
  • 微信小程序如何禁止页面返回
    微信小程序禁止页面返回的案例:微信小程序中不允许用户返回上一页的操作代码。//用wx.redirectTo来做跳转页面wx.redirectTo({url: '/pages/index/index'})移动端小程序...
    99+
    2024-04-02
  • web中如何处理重复提交、重复刷新、防止后退的问题
    这篇文章主要介绍web中如何处理重复提交、重复刷新、防止后退的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一。前言 你在任何一个比较专业的BBS都会看到这样的问题,即使你Google一下,也会发现有很多的人在关...
    99+
    2023-06-08
  • web中如何防止点击链接,后页面会跳动
    这篇文章主要介绍web中如何防止点击链接,后页面会跳动,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!有些时候做的东西刚好要用到链接,但又不需要去链接,只需要对onclick事件进行处理,但它却这样子写 <a h...
    99+
    2023-06-08
  • 如何处理防止页面url缓存中ajax中post请求
    这篇文章将为大家详细讲解有关如何处理防止页面url缓存中ajax中post请求,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。防止页面url缓存中ajax中post请求的处...
    99+
    2024-04-02
  • JavaScript如何实现页面一键全选或反选
    这篇文章主要介绍“JavaScript如何实现页面一键全选或反选”,在日常操作中,相信很多人在JavaScript如何实现页面一键全选或反选问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript如...
    99+
    2023-07-02
  • pushState、replaceState、onpopstate如何实现Ajax页面的前进后退刷新功能
    这篇文章主要介绍pushState、replaceState、onpopstate如何实现Ajax页面的前进后退刷新功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用Ajax可以异步获取数据,可以更高效地渲染页面...
    99+
    2023-06-08
  • 在浏览器加载CSS时如何防止影响页面渲染
    本篇内容介绍了“在浏览器加载CSS时如何防止影响页面渲染”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!&n...
    99+
    2024-04-02
  • 如何使用JavaScript把页面上的表格导出为Excel文件
    本篇内容主要讲解“如何使用JavaScript把页面上的表格导出为Excel文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用JavaScript把页面上的表格导出为Excel文件”吧!...
    99+
    2023-06-04
  • 如何解决Vue.js应用回退或刷新界面时提示用户保存修改问题
    这篇文章给大家分享的是有关如何解决Vue.js应用回退或刷新界面时提示用户保存修改问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在实际应用中,运营人员在编辑数据时不希望因不小...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作