jQuery / JavaScript函数中出现此错误的原因是什么?

时间:2010-01-05 23:06:49

标签: asp.net javascript jquery validation

当我执行以下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);
}

有人知道为什么会抛出这个错误吗?

3 个答案:

答案 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, '');