当我执行以下JavaScript函数时,收到以下错误:
'2'为空或不是对象。
来自txtRawCardData
元素的输入是一个包含^
字符的字符串,我将其拆分为字符串数组。
更新
只有在Internet Explorer 7中运行jQuery代码时才会收到此错误。运行FireFox 3.5.6时,我不会收到此错误。
更新2:
此错误还会阻止我为任何ASP.NET CustomValidator
控件编写的任何JavaScript函数触发。
示例输入:
%B1234123412341234 ^ JOHNSON /黑猩猩^ 1234123412345700000000123000000;?1234123412341234 = 123443211234567
function ProcessCCInfo() {
var rawData = $('#txtRawCardData').val();
rawData = rawData.replace('\n\r', '');
var CCArray = rawData.split('^');
//format the card holder name
var NameArray = CCArray[1].split('/');
var CCName = NameArray[1] + ' ' + NameArray[0];
var CCNumber = CCArray[0].replace('%B', '');
var CCExpiration = CCArray[2].substring(0,4) //this is the line generating the error!
var FormattedDate = CCExpiration.substring(2,4) + '/' + CCExpiration.substring(0,2);
$('#spanCardHolderName').attr('innerHTML', CCName);
$('#spanCCNumber').attr('innerHTML', CCNumber);
$('#spanCCExpirationDate').attr('innerHTML', FormattedDate);
setTimeout("$('#txtCustomerId').focus()", 1000);
}
有人知道为什么会抛出这个错误吗?
答案 0 :(得分:0)
以下代码在firebug控制台中有效,可能输入值错误:
function readCard(){
var rawData = '%B13241234134^first/last^201111';
rawData = rawData.replace('\n\r', '');
var CCArray = rawData.split('^');
//format the card holder name
var NameArray = CCArray[1].split('/');
var CCName = NameArray[1] + ' ' + NameArray[0];
var CCNumber = CCArray[0].replace('%B', '');
var CCExpiration = CCArray[2].substring(0,4)
return [CCName, CCNumber, CCExpiration]}
readCard()
答案 1 :(得分:0)
当您遇到这样的问题时,请尝试检查您的假设。打印出(或alert()
)一些中间值,以确保它们符合您的想法。尝试将其简化为一个简短的示例,以便您可以测试它的输入类型。
这是一个例子。我从函数中提取了文本处理,以查看它是否有效:
function test(rawData) {
rawData = rawData.replace('\n\r', '');
var CCArray = rawData.split('^');
//format the card holder name
var NameArray = CCArray[1].split('/');
var CCName = NameArray[1] + ' ' + NameArray[0];
var CCNumber = CCArray[0].replace('%B', '');
var CCExpiration = CCArray[2].substring(0,4) //this is the line generating the error!
var FormattedDate = CCExpiration.substring(2,4) + '/' + CCExpiration.substring(0,2);
return CCName + " " + CCNumber + " " + CCExpiration + " " + FormattedDate;
}
现在,在Firebug或WebKit检查器或Spidermonkey或IE 8 JavaScript调试器或您可以找到的任何其他JavaScript read-eval-print循环中,您可以尝试使用此功能,并使用不同的输入进行测试:
> test("12345^Last/First^0102")
"First Last 12345 0102 02/01"
> test("12345^Last/First")
TypeError: Result of expression 'CCArray[2]' [undefined] is not an object.
所以,我猜你传递的某种字符串中没有两个^
个字符。在您从元素中取出alert(rawData)
之后粘贴alert(CCArray)
,然后在出现错误的行之前粘贴{{1}},它会让您看到值是什么,这可以帮助您弄清楚发生了什么。
答案 2 :(得分:0)
请记住,rawData = rawData.replace('\n\r', '');
只会替换它遇到的第一个'\ n \ r'而不是所有这些......
替换所有使用带有全局标志的正则表达式
rawData = rawData.replace(/(\r\n|[\r\n])/g, '');