1

3文字の略語を数値表現に変換するのは簡単な作業だと思うでしょう。JavaScriptは「NOPE!」と言っています。

$(selector).each(function() {
    // convert month abbreviation to numerical representation
    var monthStr = $(this).text().match(/[^\/]*/)[0];
    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].toString();
    var date = $(this).text().replace(monthStr, month);
    $(this).text(date);
});

コードは有効で機能していますが、私のコンソールは次のエラーで混乱します。

Uncaught TypeError:未定義のメソッド'toString'を呼び出すことができません

セレクターのテキストが正しく置き換えられるため、これはまったく意味がありません(少なくとも目によると)。

'monthStr'変数を宣言すると、問題が発生するようです。例として静的な「MAR」に設定し、「month」変数定義から「.toString()」を削除すると、エラーは発生しなくなります。

さらに、コードを保存する唯一のものは、私の月変数のすでに述べた'.toString()'変換です。そこになかった場合、「未定義」の値になってしまいます。

その日のJavaScriptの愚かな経験を共有したかっただけで、コードが問題なく機能している場合でも、誰かがこのエラーがスローされる理由を詳しく説明してくれることを願っています。

4

4 に答える 4

1

問題はおそらく以下に関係しています:

$(selector).each(function() { ... });

セレクターとは何ですか?また、いくつのDOMオブジェクトが選択されていますか?テキストとして日付を持たないDOMオブジェクトが選択されている可能性があります。

エラーを再現する例を次に示します。http://jsfiddle.net/m3Kza/1/(コンソールを参照)

Console:'Uncaught TypeError:Undefined'のメソッド'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());
});

これは、2つの要素を選択<p>しており、テキストとして日付が設定されているのは1つだけであるためです。

コードをテキストとして日付を持つDOMオブジェクトに制限すると、正常に機能します:http: //jsfiddle.net/m3Kza/

<p>MAR/26/2013</p>

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

var months = {
    MAR: 3
};

alert(months[month].toString());   

日付をテキストとして持つ要素にはCSSクラスを使用する必要があります。これらの要素に対してのみ、選択内容を把握できます。

于 2013-03-27T00:46:58.223 に答える
0

使用する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);
于 2013-03-27T00:09:24.507 に答える
0

コードに若干の改善を加えましたが、エラーは発生しません。

<!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>
于 2013-03-27T00:59:21.460 に答える
0
  • trim()直接電話することはあなたのために働くはずです:

var monthStr = $(this).text().match(/[^\/]*/)[0].trim();
  • if/else月の正しい値を決定するためのブロックの追加:

if(monthStr !== undefined && monthStr.length === 3) {

実際には、オブジェクト内の要素が存在するかどうかをチェックするだけであれば、このチェックは必要ありません。

  • そして、months[monthStr]存在するかどうかを確認します。

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));
});

のブロック要素の数は重要でeach()はありません。私のフィドルには複数divのが実行されておりeach()、問題なく動作します。

それをいじる

于 2013-03-27T01:05:15.283 に答える