删除URL参数而不刷新页面

2024-04-27

我试图删除“?”之后的所有内容在文档准备好的浏览器 URL 中。

这是我正在尝试的:

jQuery(document).ready(function($) {

var url = window.location.href;
    url = url.split('?')[0];
});

我可以做到这一点并看到它的工作原理如下:

jQuery(document).ready(function($) {

var url = window.location.href;
    alert(url.split('?')[0]);
});

TL;DR

  1. To modify当前网址和添加/注入 it (新修改的网址)作为历史列表的新 URL 条目,使用pushState:

    window.history.pushState({}, document.title, "/" + "my-new-url.html");

  2. To replace当前网址不添加它到历史记录条目,使用replaceState:

    window.history.replaceState({}, document.title, "/" + "my-new-url.html");

  3. 取决于在你的商业逻辑, pushState在以下情况下会很有用:

    • 你想支持浏览器返回键

    • 你想要create a new URL, add/插入/推new URL to history条目,并将其设置为当前 URL

    • 允许用户bookmark具有相同参数的页面(显示相同的内容)

    • 以编程方式access the data通过stateObj然后从锚点解析


据我从您的评论中了解到,您希望清理您的网址而不再次重定向。

请注意,您无法更改整个 URL。您只需更改域名后面的内容即可。这意味着你无法改变www.example.com/但你可以改变之后发生的事情.com/

www.example.com/old-page-name => can become =>  www.example.com/myNewPaage20180322.php

背景

我们可以用:

  1. The pushState() method https://developer.mozilla.org/en-US/docs/Web/API/History/pushState如果你想添加a new修改了历史记录条目的 URL。

  2. The replaceState() method https://developer.mozilla.org/en-US/docs/Web/API/History/replaceState如果你想更新/替换current历史条目。

    .replaceState()运作方式完全一样.pushState()除了那个.replaceState() 修改当前历史记录条目而不是创建一个新条目。请注意,这不会阻止在全局浏览器历史记录中创建新条目。


    .replaceState()当您想要时特别有用update状态对象或URL响应某些用户操作的当前历史记录条目。


Code

为此,我将使用PushState() 方法 https://developer.mozilla.org/en-US/docs/Web/API/History/pushState对于此示例,其工作方式类似于以下格式:

var myNewURL = "my-new-URL.php";//the new URL
window.history.pushState("object or string", "Title", "/" + myNewURL );

随意更换pushState with replaceState根据您的要求。

您可以替换该参数"object or string" with {} and "Title" with document.title所以最终的语句将变成:

window.history.pushState({}, document.title, "/" + myNewURL );

Results

前两行代码将生成一个 URL,例如:

https://domain.tld/some/randome/url/which/will/be/deleted/

成为:

https://domain.tld/my-new-url.php

Action

现在让我们尝试一种不同的方法。假设您需要保留文件名。文件名位于最后一个之后/和查询字符串之前?.

http://www.someDomain.com/really/long/address/keepThisLastOne.php?name=john

Will be:

http://www.someDomain.com/keepThisLastOne.php

像这样的事情就会让它工作:

 //fetch new URL
 //refineURL() gives you the freedom to alter the URL string based on your needs. 
var myNewURL = refineURL();

//here you pass the new URL extension you want to appear after the domains '/'. Note that the previous identifiers or "query string" will be replaced. 
window.history.pushState("object or string", "Title", "/" + myNewURL );


//Helper function to extract the URL between the last '/' and before '?' 
//If URL is www.example.com/one/two/file.php?user=55 this function will return 'file.php' 
 //pseudo code: edit to match your URL settings  

   function refineURL()
{
    //get full URL
    var currURL= window.location.href; //get current address
    
    //Get the URL between what's after '/' and befor '?' 
    //1- get URL after'/'
    var afterDomain= currURL.substring(currURL.lastIndexOf('/') + 1);
    //2- get the part before '?'
    var beforeQueryString= afterDomain.split("?")[0];  
 
    return beforeQueryString;     
}

UPDATE:

对于 One liner 粉丝,请在控制台/firebug 中尝试一下,此页面 URL 将发生变化:

    window.history.pushState("object or string", "Title", "/"+window.location.href.substring(window.location.href.lastIndexOf('/') + 1).split("?")[0]);

此页面 URL 将从:

http://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page/22753103#22753103

To

http://stackoverflow.com/22753103#22753103

Note: as 塞缪尔·刘在下面的评论中指出,此功能仅适用于HTML5.

另一种方法是实际重定向您的页面(但您将丢失查询字符串“?”,是否仍然需要它或数据已被处理?)。

window.location.href =  window.location.href.split("?")[0]; //"http://www.newurl.com";

Note 2:

火狐浏览器似乎忽略了window.history.pushState({}, document.title, '');当最后一个参数是空字符串时。添加斜杠 ('/')按预期工作并删除了 url 字符串的整个查询部分。 Chrome 似乎可以使用空字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除URL参数而不刷新页面 的相关文章

  • 返回 false 不停止表单提交

    我的目的 如果用户字段和密码字段为空 我想停止表单提交 这是我正在尝试的代码
  • 将键值对添加到数组中的所有对象

    我想向数组中的所有对象添加一个键 值参数 eg var arrOfObj name eve name john name jane 现在我想向所有对象添加一个新参数 isActive 以便生成的数组如下所示 eg name eve isAc
  • Dojo DataGrid (DGrid) 添加复选框列

    我在用DojoDgrid 但是我正在尝试添加一个复选框列 但我不确定该方法 我一直在看的大多数教程都遵循不同的代码结构 我无法创建复选框列 我想创建一个复选框列来选择行 Code 这里还有一个Fiddle http jsfiddle net
  • 类型错误:无法读取未定义的属性“存在”

    我正在尝试为 jsx 文件编写一个测试用例 在此我能够传递 proptypes 但不是我正确传递 proptypes 的地方 当我运行测试用例时出现错误 下面提供我的错误 测试用例和代码 类型错误 无法读取未定义的属性 存在 不知道如何让它
  • 如何防止机器人程序和垃圾邮件 API 请求?

    我正在使用react native 开发一个Android 应用程序 该应用程序与我正在为该应用程序开发的API 进行通信 该 API 是使用 Laravel 和 Laravel Passport 构建的 我知道 Android 应用程序可
  • jQuery:评估 ajax 响应中的脚本

    来自我的 web 应用程序的 XML 响应既有要添加到页面的 HTML 也有要运行的脚本 我正在尝试从我的网络应用程序发回 XML 例如
  • 获取 Html.TextBoxFor 字段的 HTML id

    有没有办法在 Javascript 中获取 ASP NET MVC 控件生成的客户端 ID Html TextBoxFor m gt m Name 像这样 Html IdFor m gt m Name
  • 开始拖动另一个元素

    是否可以用另一个元素开始拖动 例如 http jsbin com igohod edit preview http jsbin com igohod edit preview 我想开始拖动 ct当我点击 icon 尤其 icon不是后裔 c
  • 为什么 Jqgrid 冻结列似乎不能与过滤器行和过滤器标题一起使用?

    我无法让冻结列与 jqgrid 4 3 0 一起使用 我唯一能想到的是我有一些不是开箱即用的具体东西 我在顶部使用过滤行 我使用 cloneToTop true 显示网格顶部的所有按钮 我有以下代码 用于在 jqggrid 顶部显示过滤器状
  • 检查 IE8 是否使用纯 Javascript [重复]

    这个问题在这里已经有答案了 我以前是这样检查的 browser msie browser version 8 但似乎 browser已从 jQuery 的更高版本中删除 So 我怎样才能用纯javascript检查这一点 I tried i
  • Nodejs Base64 中的读取文件

    我正在尝试从客户端读取以 base64 编码的图像 如何使用nodejs进行阅读 My code add to buffer base64 image var encondedImage new Buffer image name base
  • datatables.search 函数修改后的奇怪行为

    这个问题是后续问题这个问题 https stackoverflow com questions 54671211 overriding datatables js search behavior 我已经创建了这个 JSFiddle http
  • 通过 javascript 将 onsubmit 添加到表单

    您将如何仅通过 Javascript 将 OnSubmit 属性插入到表单中 我对 javascript 还很陌生 所以如果您能够提供详细的示例代码 那将是最有帮助的 情况是这样的 我通过 Chargify 支付平台 使用托管注册页面来处理
  • ASP.NET 中的 JavaScript 事件处理程序

    我有以下 iframe 控件 旨在成为类似 facebook 的按钮 iframe gt 我在上面定义了 javascript 函数 如下所示
  • jQuery UI 和原型冲突

    我正在 Perl 中向我们的网站添加一个新表单 不是我的选择 表单会自动生成大量 html 以创建一致的外观 我的问题在于遗留系统在整个页面 包括加载时 中使用原型来处理各种事情 不过我想使用 jQuery 主要是 jQuery UI 中的
  • Firebase Storage put() 方法上传数字数组而不是字符串

    我想将字符串上传到 Firebase 存储文件 我尝试过 let myString storage ref path child file txt putString myString raw and with let myString s
  • XHR 调用是宏任务还是微任务?

    Ajax 调用被安排为微任务还是宏任务 浏览器之间有什么区别吗 在 JavaScript Ninja 的秘密 第二版一书中 作者指出网络事件被安排为宏任务 因此 XHR 回调与宏任务一起排队
  • 过早退出 Qualtrics 中的循环和合并块

    我目前正在进行一项 Qualtrics 调查 受访者必须解决一长串字谜问题 然后回答一些人口统计问题 为了使变位词部分更容易 我使用了循环和合并块 第一个字段是要解决的变位词 第二个字段是变位词的解决方案 因此调查可以根据受访者的答案来检查
  • 让 hashchange 事件在所有浏览器(包括 IE7)中工作

    我有一些代码 由另一位开发人员编写 在 WordPress 内部进行 AJAX 页面加载 例如 没有页面重新加载 当您单击导航项时 AJAX 会刷新主要内容区域 我的问题是它在 IE7 中被破坏了 我不知道从哪里开始调试 最初的开场白是 v
  • vuejs2复制剪贴板问题

    我正在尝试使用https alligator io vuejs vue clipboard copy https alligator io vuejs vue clipboard copy 对于 Vue js 中的复制剪贴板功能 它对于字符

随机推荐

  • Android 模拟器出现错误:冷启动:快照不存在

    我在使用 Android 模拟器 7 8 天后就遇到了问题 起初它根本没有运行 现在重新安装模拟器解决了这个问题 但又产生了新的问题 每当我运行模拟器时 都会花费很长时间 大约 5 6 分钟 然后显示错误 Cold Boot Snapsho
  • Android facebook 4.0.0 分享对话框不分享内容

    几个小时以来 我一直在尝试通过 facebook 4 0 0 sdk 分享我的 android 应用程序中的内容 我完全按照Facebook 分享文档 https developers facebook com docs sharing a
  • 多个 nginx 入口重写的默认路径

    这是我的情况 我在 kubernetes 入口 上 有两个 docker 镜像 一个专用于 Web 第二个专用于 api 在下一个配置下 在消息末尾 web将显示将进行一些调用的前端 api 那里一切都好 but 是 404 因为没有定义任
  • 使用多个条件更新 mongodb 中嵌套数组中的对象

    mongo 中的示例文档如下所示 但是我的集合有几千个文档 其中一些具有以下所有测试 有些仅具有以下测试的子集 id ObjectId 52435f0f6f73205f7d37a2b0 ID schoolID 1234 institutio
  • accept() 创建一个新套接字是什么意思?

    我的问题基于以下理解 套接字由 ip port 定义 服务器和客户端都有自己的套接字 Socket连接由五组server ip server port client ip client port protocol定义 套接字描述符是标识套接
  • 如何将带有嵌套节点(父/子关系)的 XML 导入 Access?

    我正在尝试将 XML 文件导入 Access 但它创建了 3 个不相关的表 也就是说 子记录被导入到子表中 但无法知道哪些子记录属于哪个父记录 如何导入数据来维护父子节点 记录 之间的关系 以下是 XML 数据的示例
  • 将目录从 Assets 复制到本地目录

    我正在尝试使用资产文件夹中的目录并将其作为File 是否可以访问 Assets 目录中的某些内容File 如果没有 如何将 Assets 文件夹中的目录复制到应用程序的本地目录 我会像这样复制一个文件 try InputStream str
  • Tkinter 嵌套主循环

    我正在写一个视频播放器tkinter python 所以基本上我有一个可以播放视频的 GUI 现在 我想实现一个停止按钮 这意味着我将有一个mainloop 对于 GUI 还有另一个嵌套mainloop 播放 停止视频并返回 GUI 启动窗
  • JyNI Eclipse 设置

    我在 Eclipse 中有以下 Java 文件 package java python tutorial import org python core PyInstance import org python util PythonInte
  • 仅使用 NumPy einsum 处理上三角元素

    我使用 numpy einsum 来计算形状为 3 N 的列向量 pts 数组与其自身的点积 从而得到形状为 N N 的矩阵 dotps 与所有点积 这是我使用的代码 dotps np einsum ij ik gt jk pts pts
  • 为什么 Ruby 解析文件时常量不像局部变量那样被初始化?

    在 Ruby 中 我知道我可以做这样的事情 if false var Hello end puts var 应用程序不会崩溃 并且var只需设置为nil 我读到 这种情况的发生是由于 Ruby 解析器的工作方式造成的 为什么同样的方法不适用
  • 在 MVC 5 中,如何在单个 Ajax POST 请求中发送 ViewModel 和文件?

    我有一个 ASP NET MVC 5 应用程序 我正在尝试发送带有模型数据的 POST 请求 并且还包括用户选择的文件 这是我的 ViewModel 为了清晰起见进行了简化 public class Model public string
  • 给GAC,还是不给GAC?

    我有一个用 ASP NET 3 5 编写的数据访问层 DAL 并使用 Microsoft 模式和实践库 以下简称 P P 来完成其数据访问 我安装了 P P 它驻留在我的 GAC 中 因此 从逻辑上讲 我的 DAL 在 GAC 中引用它 因
  • `checkout` = `reset` + `symbolic ref`?

    Suppose a branch是一个现有分支 指向与之前不同的提交HEAD指着 HEAD可能直接或通过某些方式指向提交branch 以下命令等效吗 git checkout a branch and git symbolic ref HE
  • 分布式张量流中的并行进程

    我有带有训练参数的张量流神经网络 它是代理的 策略 网络正在核心程序的主张量流会话的训练循环中进行更新 在每个训练周期结束时 我需要将该网络传递给几个并行进程 工作人员 这些进程将使用它来从代理策略与环境的交互中收集样本 我需要并行执行 因
  • 没有传输安全性的 WCF 可靠会话不会按时发生故障事件

    我遇到了可靠会话的一个非常有趣的行为 我使用的是netTcp绑定 双工通道 可靠会话 当我尝试侦听channel faulted时 如果安全模式设置为transport 则当客户端断开连接时 故障事件将立即触发 但是 当我将绑定的安全模式设
  • 在实体框架中附加集合

    使用实体框架 我可以使用附加单个对象 entity Attach 但是 我没有看到任何方法允许我将多个对象的集合 数组添加到实体 我必须循环遍历集合中的每个项目并调用entity Attach 每一次 是的 您必须循环遍历子集合并Attac
  • 在 MySQL 中存储 IPv6 地址

    正如 需要支持 ipv6 的 inet aton 和 inet ntoa 函数 http bugs mysql com bug php id 34037 目前没有用于存储 IPv6 地址的 MySQL 函数 用于存储 插入的推荐数据类型 函
  • 如何在 CSS 中用 SVG 图标替换 Web 字体(Font Awesome)?

    我注意到在我的 CSS 文件中 有一些使用 Font Awesome Web 字体的规则 如下所示 ul fancy li before category page ul li before display none font style
  • 删除URL参数而不刷新页面

    我试图删除 之后的所有内容在文档准备好的浏览器 URL 中 这是我正在尝试的 jQuery document ready function var url window location href url url split 0 我可以做到