c
https://pq.equalearning.net/assessment/379208869278126080?userId=23ebb&origin=https://www.equalearning.net&fname=I'm&lname=happy
在上面的例子中,fname=I'm,其中单引号'
被转义为'
, 而如果使用下面的代码,因为在URL中,&符号是一个特殊字符,用于分隔不同的参数。所以当试图获取fname参数的值时,URLSearchParams对象会在遇到第一个&符号时停止
所以获取fname的值得到的是 I而不是 "I'm"
c
let url = 'https://pq.equalearning.net/assessment/379208869278126080?userId=23ebb&origin=https://www.equalearning.net&fname=I'm&lname=happy';
url = decodeURIComponent(url);
let params = new URLSearchParams((new URL(url)).search);
console.log(params.get('fname')); // 输出 "I"
就算使用了decodeURIComponent函数,得到的还是'I'
因为链接中的'
不是URI编码的字符,而是HTML实体
在JavaScript中,您可以使用DOMParser API来解码HTML实体
c
function decodeHtml(html) {
var txt = document.createElement("textarea");
txt.innerHTML = html;
return txt.value;
}
let url = 'https://pq.equalearning.net/assessment/379208869278126080?userId=23ebb&origin=https://www.equalearning.net&fname=I'm&lname=happy';
url = decodeHtml(url);
let params = new URLSearchParams((new URL(url)).search);
console.log(params.get('fname')); // Outputs "I'm"
在上面的代码中,首先使用decodeHtml函数对URL中的HTML实体进行解码,该函数创建一个临时的textarea元素,并使用其innerHTML属性对HTML实体进行解码。然后,我们创建一个URL对象,并使用URLSearchParams对象来解析查询字符串并获取fname参数的值。
请注意,此解决方案需要DOM环境,因此它可以在浏览器中工作,但在没有DOM实现的Node. js环境中则不行。