1

他の誰かのコードをデバッグするだけで、Firefox ですべてを修正し、現在は Chrome で修正しましたが、すべての子ノードを選択して関連するグラフを開くオプションを選択しようとすると、奇妙なエラーが発生します。

キャッチされていない TypeError: 未定義のメソッド 'substr' を呼び出せません

私は問題が(明らかに)この行であることを知っています:

var graph={id:seqId,entityName:flags[6].substr(1).substr(0,flags[6].length-2),entity:flags[5].substr(1).substr(0,flags[5].length-2),idCounter:flags[4],counterName:flags[3].substr(1).substr(0,flags[3].length-2),ivmanager:flags[7].substr(1).substr(0,flags[7].length-2),chart:null,pointsToShowX:null,borneInf:null,unite:"",idInstance:flagsInstance[2].substr(1).substr(0,flagsInstance[2].length-2),instanceName:flagsInstance[3].substr(1).substr(0,flagsInstance[3].length-2),listPdsNull:new Array(), countInstance:idTreeview+"_"+i, countGraph:-1};

しかし、私にはすべてが正しいように見えるのに、なぜこれがエラーを引き起こしているのかわかりません?! 関数の前後に substr が無数に使用されているため、Chrome がこのエラーをスローする理由がわかりません。

完全な機能は次のとおりです。問題は後半にあると思います。

function loadGraphs(idTreeview,idSelectGraph)
{

    var count=0;
    var fn=$('#'+idSelectGraph)[0].attributes[1].value;
    fn=fn.substr(12).substr(0,fn.length-2);
    var flags=fn.split(new RegExp(","));
    var data=''; 

    var idInstanceTreeview = idTreeview;

if($('#counterTreeviewUL'+idInstanceTreeview).length == 0)      
{

    var fnInstance=$('#'+idSelectGraph)[0].attributes[1].value;

    var flagsInstance=fnInstance.split(new RegExp(","));

    var graph = {
            id: seqId,
            entityName: flags[6].substr(1).substr(0, flags[6].length - 2),
            entity: flags[5].substr(1).substr(0, flags[5].length - 2),
            idCounter: flags[4],
            counterName: flags[3].substr(1).substr(0, flags[3].length - 2),
            ivmanager: flags[7].substr(1).substr(0, flags[7].length - 2),
            chart: null,
            pointsToShowX: null,
            borneInf: null,
            unite: "",
            idInstance: flagsInstance[2].substr(1).substr(0, flagsInstance[2].length - 2),
            instanceName: flagsInstance[3].substr(1).substr(0, flagsInstance[3].length - 2),
            listPdsNull: new Array(),
            countInstance: idTreeview + "_" + i,
            countGraph: -1
        };

    seqId++;
    graphs[graphsLastId]=graph;
    graphsLastId++;

    }

else 
  {
    for(var i=0;i<$('#counterTreeviewUL'+idInstanceTreeview)[0].children.length;i++)
        ($('#counterTreeviewUL'+idInstanceTreeview)[0].children[i].children[0].checked)?++count:count;

    if ($('#counterTreeviewUL'+idInstanceTreeview)[0].children.length == count)
    {
        $('#'+idSelectGraph)[0].checked=true;
        $('#'+idSelectGraph)[0].indeterminate=false;
    }
    else if (count==0)
    {
        $('#'+idSelectGraph)[0].checked=true;       
        $('#'+idSelectGraph)[0].indeterminate=false;        
    }
    else
    {
        $('#'+idSelectGraph)[0].checked=true;
        $('#'+idSelectGraph)[0].indeterminate=false;
    }   
        for (var i=0;i<$('#counterTreeviewUL'+idTreeview)[0].children.length;i++)
    {   
        if (!$('#counterTreeviewUL'+idTreeview)[0].children[i].children[0].checked)
        {   
            $('#counterTreeviewUL'+idTreeview)[0].children[i].children[0].checked=true;


       var fnInstance=$('#counterTreeviewUL'+idTreeview)[0].children[i].children[0].attributes[1].value;

       fnInstance=fnInstance.substr(15).substr(0,fnInstance.length-2);  
       var flagsInstance=fnInstance.split(new RegExp(","));


            var graph = {
                    id: seqId,
                    entityName: flags[6].substr(1).substr(0, flags[6].length - 2),
                    entity: flags[5].substr(1).substr(0, flags[5].length - 2),
                    idCounter: flags[4],
                    counterName: flags[3].substr(1).substr(0, flags[3].length - 2),
                    ivmanager: flags[7].substr(1).substr(0, flags[7].length - 2),
                    chart: null,
                    pointsToShowX: null,
                    borneInf: null,
                    unite: "",
                    idInstance: flagsInstance[2].substr(1).substr(0, flagsInstance[2].length - 2),
                    instanceName: flagsInstance[3].substr(1).substr(0, flagsInstance[3].length - 2),
                    listPdsNull: new Array(),
                    countInstance: idTreeview + "_" + i,
                    countGraph: -1
                };

            seqId++;            
            graphs[graphsLastId]=graph;             
            graphsLastId++;
        }
    }

 }
    graphsToLoad=false;
    updateAllGraphs();
    loading=false;

    if($('#counterTreeviewUL'+idInstanceTreeview).length == 0)
    {

      if($('#'+idSelectGraph)[0].checked)
        {
        countSelectedGraphs(graphsLastId, flags[5].substr(1).substr(0,flags[5].length-2), 0);
        }
      else 
        {
        countSelectedGraphs(graphsLastId, flags[5].substr(1).substr(0,flags[5].length-2), 0);
        }
    }

    else 
    {
    countSelectedGraphs(graphsLastId, flags[5].substr(1).substr(0,flags[5].length-2), 0);       
    }
}

この一見ランダムなエラーの原因についての洞察は、このエラーに関してオンラインで多くを見つけることができないため、非常に高く評価されます (発生するのを見たケースは私のものとは異なります)、ありがとう!

4

2 に答える 2

2

この線

fn=fn.substr(12).substr(0,fn.length-2);

部分文字列の作成から開始し、文字列から最初の 12 文字を効果的に取り除き、「5」を残します。(substrこの場合、2番目は事実上何もしません)

fn は割り当て時にflagsflags5」であるため、1文字の文字列である「5」でもありますflags[6] == undefined(または0より大きい任意のインデックス)。コンソールで次の 3 行を試してみてください。

var x = "5"; 
x[0]; // returns "5"
x[1]; // returns undefined
于 2012-10-26T14:29:15.830 に答える
0

読み取り可能なコードは次のとおりです。

var graph = {
    id: seqId,
    entityName: flags[6].substr(1).substr(0, flags[6].length - 2),
    entity: flags[5].substr(1).substr(0, flags[5].length - 2),
    idCounter: flags[4],
    counterName: flags[3].substr(1).substr(0, flags[3].length - 2),
    ivmanager: flags[7].substr(1).substr(0, flags[7].length - 2),
    chart: null,
    pointsToShowX: null,
    borneInf: null,
    unite: "",
    idInstance: flagsInstance[2].substr(1).substr(0, flagsInstance[2].length - 2),
    instanceName: flagsInstance[3].substr(1).substr(0, flagsInstance[3].length - 2),
    listPdsNull: new Array(),
    countInstance: idTreeview + "_" + i,
    countGraph: -1
};

を呼び出すたびに、呼び出している「文字列」が存在することを確認する必要があります。substr

于 2012-10-26T13:54:29.300 に答える