以下小的HowTo是对通过不同的字符串处理方法获取某些cookie值的原始问题的汇编。
原始问题发布如下:
你好如您所见,拆分方法可能存在问题。 下面的简短文章介绍了解决这个可能无法解决的问题的方法,但是我们有时可能会遇到。 如果没有其他问题,那么所显示的改编将有助于理解如何检索cookie值或使用不同的js方法处理字符串值。 首先,我们测试拆分方法,因为Atli猜测它可能存在问题:
以为我会和你分享我遇到的一个小问题。
查看此代码。
这段代码基本上采用了整个document.cookie字符串,并在每个';'处进行分割。 然后在每个名称的开头搜索“名称”。var ca = document.cookie.split(';'); var value = ""; for (var x = 0; x < ca.length; x++) { if (ca[x].indexOf(name) == 0) { var start = ca[x].indexOf('=') + 1; var length = ca[x].length - start; value = ca[x].substr(start, length); } }
这在IE中工作正常,但在我检查过的所有其他浏览器(Firefox,Opera,Netscape)中均失败。
事实证明,除了MS决定的所有人以外,在split命令的每个部分之前都留一个空格(ascii nr 32),这使indexOf返回1而不是0。
现在我要问.. WTF?!?
无论如何,请谨慎使用split命令。
-AtliÞór
split命令在FF 2.0.0.9中效果很好:
我使用了以下代码:
var val = 'a=1;b=2;c=3'
var arr = val.match(/[^;]+/g);
// arr is ["a=1", "b=2", "c=3"] now
arr = val.split(';');
// arr is ["a=1", "b=2", "c=3"] now
因此它可以按预期工作,我只是使用regEx来显示另一种从字符串“ val”创建数组的方法。
两种方法是等效的。
接下来,我检查了indexOf代码……也按预期工作:
// lets assume we want to alert the value of c
var name = 'c';
for(var x = 0; x < arr.length; x++) {
if (arr[x].indexOf(name) == 0) {
var start = arr[x].indexOf('=') + 1;
var length = arr[x].length - start;
var value = arr[x].substr(start, length);
alert(value);
}
}
但是我们也可以在这里使用regEx:
for (var x = 0; x < arr.length; x++) {
if ((new RegExp('^' + name)).test(arr[x])) {
var value = arr[x].match(/[^=]+$/);
alert(value);
}
}
所以我找不到indexOf或split的任何问题...但是在有问题的情况下,我们有选择权来解决它们的问题:)
因此,现在我们发现问题可能是分裂方法之外的另一个问题。 Atli回应:
regEx技巧肯定会派上用场。因此,我们可以再次使用regExp来处理该问题,以防出现真正的问题:
现在回头看,我发现我仅使用Cookie中的数据测试了此问题。 了解M $遵循标准的程度,以及它们与众不同的程度后,我认为问题很可能出在Cookie数据而非split命令上。
IE很有可能在一个空白字符串中创建cookie,而其他浏览器在值之间添加一个空格,因此当我在每个分号上分割它时,会导致有多余的空间。
var value = ' c=1';
value = value.replace(/^\s+/, '');
// now value has 'c=1' assigned
只会在字符串值的开头删除所有空格。
现在,编解码器介入并提供了从w3schools派生的getCookie函数,使我们回到了最初的问题:
function getCookie(name) {
if (document.cookie.length > 0) {
start = document.cookie.indexOf (name + "=");
if (start != -1) {
start += name.length + 1;
end = document.cookie.indexOf(";",start);
if (end == -1) end = document.cookie.length;
return unescape(document.cookie.substring(start,end));
}
}
return "";
}
[改编自W3Schools JavaScript Cookies ]
因此,此HowTo是一个有关如何遇到问题以及如何解决和/或回到基本问题的小案例研究... :),它再次表明,与之一起处理代码,效率更高一个人,因为我们可以从一开始就了解到问题可能并不十分清楚,所以我们总是可以找到一种绕过一种特殊代码用法的方法,并且关注原始问题始终是一个优势:)
本文探讨了在不同浏览器中一致地读取和解析Cookie值的挑战,特别是针对IE和其他浏览器在Cookie处理上的差异。通过对比split和正则表达式方法,文章提供了一种可靠的跨浏览器解决方案。
642

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



