【问题标题】:What is the reason for this error in jQuery/JavaScript function?jQuery/JavaScript 函数中出现此错误的原因是什么?
【发布时间】:2010-01-05 23:06:49
【问题描述】:

当我执行以下 JavaScript 函数时,我收到以下错误:

'2' 为 null 或不是对象。

txtRawCardData 元素的输入是一个包含^ 字符的字符串,我将其拆分为一个字符串数组。

更新

仅当我在 Internet Explorer 7 中运行我的 jQuery 代码时才会收到此错误。当我运行 FireFox 3.5.6 时我没有收到此错误。

更新 2:

此错误还会阻止我为任何 ASP.NET CustomValidator 控件编写的任何 JavaScript 函数触发。

示例输入:

%B1234123412341234^JOHNSON/JOCKO^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);
}

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

【问题讨论】:

  • 我假设您已经验证 CCArray[2] 不为 null 或为空?
  • @Nathan Taylor - CCArray[2] 确实包含一个值,因为它正在填充 CCExpiration 变量
  • @Michael 你能展示一个输入的例子吗(显然是假卡数据)?您能否在我在答案中输入的函数中尝试该输入,并告诉我您是否仍有问题?
  • @Brian - 我提供了一个示例跟踪数据示例。此外,它会在处理访问CCArray 变量中的数组位置的任何代码行中引发错误
  • @Michael 嗯,奇怪。让我确定我理解你。 var NameArray = ...var CCNumber = ...var CCExpiration = 行都抛出错误?但是var CCName = ... 没有?你运行的是什么浏览器?

标签: asp.net javascript jquery validation


【解决方案1】:

以下代码在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()

【讨论】:

    【解决方案2】:

    当您遇到此类问题时,请尝试检查您的假设。打印出(或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),它将让您查看值是什么,这可以帮助您弄清楚发生了什么开。

    【讨论】:

    • @Brian - 我用attr 语句中的CCArray 值修改了我的代码和局部变量,它们都包含值。
    【解决方案3】:

    请记住,rawData = rawData.replace('\n\r', ''); 只会替换它遇到的第一个 '\n\r' 而不是全部...

    用全局标志替换所有使用正则表达式

    rawData = rawData.replace(/(\r\n|[\r\n])/g, '');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多