javascript是当今最愚蠢的体验

javascript是当今最愚蠢的体验,javascript,jquery,Javascript,Jquery,有人会认为,将3个字符的缩写转换为数字表示将是一项简单的任务。JavaScript说“不!” 即使代码有效且有效,我的控制台仍会出现以下错误: 未捕获的TypeError:无法调用未定义的方法“toString” 这完全没有意义,因为选择器的文本被正确替换(至少根据眼睛) 当我声明'monthStr'变量时,问题似乎就开始了。例如,如果我将其设置为静态“MAR”,并从“month”变量定义中删除“.toString()”,则错误不再发生 此外,保存代码的唯一方法是前面提到的my month变量的

有人会认为,将3个字符的缩写转换为数字表示将是一项简单的任务。JavaScript说“不!”

即使代码有效且有效,我的控制台仍会出现以下错误:

未捕获的TypeError:无法调用未定义的方法“toString”

这完全没有意义,因为选择器的文本被正确替换(至少根据眼睛)

当我声明'monthStr'变量时,问题似乎就开始了。例如,如果我将其设置为静态“MAR”,并从“month”变量定义中删除“.toString()”,则错误不再发生

此外,保存代码的唯一方法是前面提到的my month变量的“.toString()”转换。如果它不在那里,我将得到一个“未定义”的值

我只是想和大家分享一下我在JavaScript方面的愚蠢经历,希望有人能详细说明为什么会抛出这个错误,即使代码工作得很完美。

使用
trim

 var monthStr = $(this).text().match(/[^\/]*/)[0];
    monthStr = monthStr.trim();

    var months = {
            "JAN": 1,
            "FEB": 2,
            "MAR": 3,       
        };

        var month = months[monthStr].toString();
        alert(month);
使用
trim

 var monthStr = $(this).text().match(/[^\/]*/)[0];
    monthStr = monthStr.trim();

    var months = {
            "JAN": 1,
            "FEB": 2,
            "MAR": 3,       
        };

        var month = months[monthStr].toString();
        alert(month);

问题很可能与以下方面有关:

$(选择器).each(函数(){…})

选择器是什么,选择了多少个DOM对象?可能正在选择的DOM对象没有日期作为文本

下面是一个重现错误的示例:(请参阅控制台)

控制台:“未捕获的TypeError:无法调用未定义的”的方法“toString”

<p>MAR/26/2013</p>
<p>Hello world!</p>

$('p').each(function() {
    var month = $(this).text().match(/[^\/]*/)[0];

    var months = {
        MAR: 3
    };

    alert(months[month].toString());
});
2013年3月26日

你好,世界

$('p')。每个(函数(){ var month=$(this.text().match(/[^\/]*/)[0]; 风险值月份={ 三月三日 }; 警报(月[month].toString()); });
这是因为我们选择了两个
元素,只有一个元素的日期是文本

如果我们将代码限制为以文本形式显示日期的DOM对象,则效果良好:

2013年3月26日

var month=$('p').text().match(/[^\/]*/)[0]; 风险值月份={ 三月三日 }; 警报(月[month].toString());

对于以日期为文本的元素,您应该使用CSS类,并且仅对这些元素使用CSS类,这样您就知道您正在选择什么。

问题很可能与以下内容有关:

$(选择器).each(函数(){…})

选择器是什么,选择了多少个DOM对象?可能正在选择的DOM对象没有日期作为文本

下面是一个重现错误的示例:(请参阅控制台)

控制台:“未捕获的TypeError:无法调用未定义的”的方法“toString”

<p>MAR/26/2013</p>
<p>Hello world!</p>

$('p').each(function() {
    var month = $(this).text().match(/[^\/]*/)[0];

    var months = {
        MAR: 3
    };

    alert(months[month].toString());
});
2013年3月26日

你好,世界

$('p')。每个(函数(){ var month=$(this.text().match(/[^\/]*/)[0]; 风险值月份={ 三月三日 }; 警报(月[month].toString()); });
这是因为我们选择了两个
元素,只有一个元素的日期是文本

如果我们将代码限制为以文本形式显示日期的DOM对象,则效果良好:

2013年3月26日

var month=$('p').text().match(/[^\/]*/)[0]; 风险值月份={ 三月三日 }; 警报(月[month].toString());

对于以日期为文本的元素,您应该使用CSS类,并且只对这些元素使用CSS类,这样您就知道您在选择什么。

我对您的代码做了一些轻微的改进,没有出现任何错误:

<!doctype html>
<html lang="en">
    <head> 
        <meta charset="utf-8" />  
        <title>Test the script</title>
        <script type="text/javascript" src="jquery-1.9.0.js"></script>
        <script>
            $(document).ready(function(){
                $("div").each(function() {
                    // convert month abbreviation to numerical representation
                    var orgStr=$(this).text().trim().match(/[^\/]*/)[0];
                    var monthStr = orgStr.toUpperCase().substr(0,3);
                    console.log("monthStr is:", monthStr);
                    var months = {
                        JAN: 1,
                        FEB: 2,
                        MAR: 3,
                        APR: 4,
                        MAY: 5,
                        JUN: 6,
                        JUL: 7,
                        AUG: 8,
                        SEP: 9,
                        OCT: 10,
                        NOV: 11,
                        DEC: 12
                    };
                    if(months[monthStr]!==undefined){
                        var month = months[monthStr].toString();
                        var date = $(this).text().replace(orgStr, month);
                        $(this).text(date);
                    }
                }); 
            });
        </script>  

    </head>
    <body> 
        <div>JAN/22/2012</div>
        <div>
            JAN/22/2012</div>
        <div>nope/22/2012</div>
        <div>Feb/22/2012</div>
        <div>dec/22/2012</div>
        <div>jul/22/2012</div>
        <div>
            october/22/2012</div>
    </body>
</html>

测试脚本
$(文档).ready(函数(){
$(“div”)。每个(函数(){
//将月份缩写转换为数字表示形式
var orgStr=$(this.text().trim().match(/[^\/]*/)[0];
var monthStr=orgStr.toUpperCase().substr(0,3);
log(“monthStr为:”,monthStr);
风险值月份={
1月1日,
二月二号,,
三月三日,
四月四日,
五月五日,
六月六号,,
七月七日,
八月八日,
九月九日,
10月10日,
11月11日,
十二月十二日
};
如果(月[月]!==未定义){
var month=月[monthStr].toString();
var date=$(this).text().replace(orgStr,month);
$(此).文本(日期);
}
}); 
});
2012年1月22日
2012年1月22日
否/22/2012
2012年2月22日
2012年12月22日
2012年7月22日
2012年10月22日

我对您的代码做了一些轻微的改进,没有出现任何错误:

<!doctype html>
<html lang="en">
    <head> 
        <meta charset="utf-8" />  
        <title>Test the script</title>
        <script type="text/javascript" src="jquery-1.9.0.js"></script>
        <script>
            $(document).ready(function(){
                $("div").each(function() {
                    // convert month abbreviation to numerical representation
                    var orgStr=$(this).text().trim().match(/[^\/]*/)[0];
                    var monthStr = orgStr.toUpperCase().substr(0,3);
                    console.log("monthStr is:", monthStr);
                    var months = {
                        JAN: 1,
                        FEB: 2,
                        MAR: 3,
                        APR: 4,
                        MAY: 5,
                        JUN: 6,
                        JUL: 7,
                        AUG: 8,
                        SEP: 9,
                        OCT: 10,
                        NOV: 11,
                        DEC: 12
                    };
                    if(months[monthStr]!==undefined){
                        var month = months[monthStr].toString();
                        var date = $(this).text().replace(orgStr, month);
                        $(this).text(date);
                    }
                }); 
            });
        </script>  

    </head>
    <body> 
        <div>JAN/22/2012</div>
        <div>
            JAN/22/2012</div>
        <div>nope/22/2012</div>
        <div>Feb/22/2012</div>
        <div>dec/22/2012</div>
        <div>jul/22/2012</div>
        <div>
            october/22/2012</div>
    </body>
</html>

测试脚本
$(文档).ready(函数(){
$(“div”)。每个(函数(){
//将月份缩写转换为数字表示形式
var orgStr=$(this.text().trim().match(/[^\/]*/)[0];
var monthStr=orgStr.toUpperCase().substr(0,3);
log(“monthStr为:”,monthStr);
风险值月份={
1月1日,
二月二号,,
三月三日,
四月四日,
五月五日,
六月六号,,
七月七日,
八月八日,
九月九日,
10月10日,
11月11日,
十二月十二日
};
如果(月[月]!==未定义){
var month=月[monthStr].toString();
var date=$(this).text().replace(orgStr,month);
$(此).文本(日期);
var month = (months[monthStr]) ? months[monthStr].toString() : monthStr
$("div").each(function() {
    // convert month abbreviation to numerical representation
    var el = $(this);
    var monthStr = el.text().match(/[^\/]*/)[0].trim();        
    var months = {
        JAN: 1,
        FEB: 2,
        MAR: 3,
        APR: 4,
        MAY: 5,
        JUN: 6,
        JUL: 7,
        AUG: 8,
        SEP: 9,
        OCT: 10,
        NOV: 11,
        DEC: 12
    };
    var month = (months[monthStr]) ? months[monthStr].toString() : monthStr;
    el.text(el.text().replace(monthStr, month));
});