最近在写电商前台页面时,遇到一个路径转义的问题,虽然数据一直都是正常展示的,但是控制台会报错:
uncaught URIError:URI malformed at decodeURIComponent

功能介绍:
用户输入内容后,点击搜现货,就调用encodeURI编码,整个页面路径更改为检索的内容,然后页面重新渲染,此时需要将页面路径中的关键字取出来,因为有时需要从别的地方跳转到此页面,因此取链接时,需要decodeURI进行转义。如果用户输入的内容中包含%,则在用decodeURI转义时,就会报错了。
一定要确定报错的是单独输入的%还是encodeURI之后的%;
出现这种报错的原因都是单独输入的%
网上给出的答案都是:

网上的解决方案就是:在进行encodeURI之前,将%转义为%25,然后再进行encodeURI;
这种方法是错误的!!!
因为encodeURI的过程就是将特殊符号编码:比如%编码为%25,空格编码为%20等。如果在encodeURI之前将%转义为%25,则经过encodeURI之后就变成了%2525,这样就更离谱了。
一定要清楚:控制台报错的原因是:encodeURI之后的%25转义后的%报的错。也就是说decodeURI不允许参数有%,而非%25,它会自动把%25转义为%,这个转义后的%导致的报错。
一个比较笨但有效的解决办法
既然decodeURI的参数中不能存在%,则在进行encodeURI之前就将%替换为一个独特的字符串,然后再进行encodeURI,decodeURI,最后再将独特的字符串转化为%,就可以了

encodeURI编码之前处理%
...
search_val = search_val.replace("%", 'baifenhao');
var url = encodeURI(search_val);
...
decodeURI处理路径参数
var s = decodeURI(window.location.href);
var startIndex = s.lastIndexOf('/') + 1;
var lastIndex = s.lastIndexOf('.');
var searchWord = '';
if (startIndex > -1 && lastIndex > -1) {
searchWord = s.substring(startIndex, lastIndex);
}
searchWord = searchWord.replace("baifenhao", "%");
问题解决!!!

1090

被折叠的 条评论
为什么被折叠?



