从昨天开始小张就开始搞点击一个按钮自动将网址和填写的参数复制到剪切板的事情,
今天下午3点钟还没折腾出来。我就问他遇到了什么技术问题,他说”我的方案是用javascript将原参数值替换成当前填写的数值,但是其它参数都可以替换唯独CreditAmount不能替换。搞了快一天了,还没搞出来,真郁闷!” (例如将http://kedufg.807.sql.sh.cn/FirstPage.htm?MonthTotal=20000&CreditAmount=1000&MonthCost=3000中的数值替换掉,其中MonthTotal和MonthCost的数值都成功替换了)
没搞出来早点说嘛,我来帮你看看
原来核心的js方法中如下
function changeURLPar(destiny, par, par_value) {
var pattern = par + '=([^&]*)';
var replaceText = par + '=' + par_value;
if (destiny.match(pattern)) {
var tmp = '/\' + par + '=[^&]*/';
tmp = destiny.replace(eval(tmp), replaceText);
return (tmp);
}
else {
if (destiny.match('[\?]')) {
return destiny + '&' + replaceText;
}
else {
return destiny + '?' + replaceText;
}
}
return destiny + '\n' + par + '\n' + par_value;
}
而且经过调试就是红色部分未起到作用,那问题肯定在这里
然后小张就纠结在这里,一直想有什么样的可能造成这个问题的,是顺序问题还是什么什么,
而我就开始问他,eval()是启什么作用,他也不清楚,于是百度:该函数可计算某个字符串,并执行其中的 JavaScript 代码,
那么tmp(内容是“/\CreditAmount=[^&]*/”)又是什么意思呢?
接着百度:两侧的/表示正则表达式从开始和结束,而[^&]*表示0或更多个非&字符(也就是数值部分),CreditAmount=肯定是纯字符串了,
那\是什么意思呢?继续百度:将下一字符标记为特殊字符、文本、反向引用或八进制转义符。接着我在http://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.80).aspx中发现还有一个\cx表示:匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是“c”字符本身。
于是得出结论:很有可能\CreditAmount中的\Cr被当作Control-R了
然后果断把js中的
var tmp = '/\' + par + '=[^&]*/';
修改成
var tmp = '/' + par + '=[^&]*/';
问题解决!
这个经验告诉我们,调试的时候必须搞清楚关键步骤的每个细节才能找到问题的根本所在,而不能仅仅靠猜想