Javascript 未捕获类型错误:无法调用未定义(Chrome/IE)的方法“substr”
所以,在调试其他人的代码时,我已经在Firefox中修复了所有内容,现在又在Chrome上修复了所有内容,但当我试图选择一个选项来选择所有子节点并打开它们的相关图形时,我遇到了一个奇怪的错误: 未捕获的TypeError:无法调用未定义的方法“substr” 我知道问题显然在于这一行:Javascript 未捕获类型错误:无法调用未定义(Chrome/IE)的方法“substr”,javascript,jquery,internet-explorer,debugging,google-chrome,Javascript,Jquery,Internet Explorer,Debugging,Google Chrome,所以,在调试其他人的代码时,我已经在Firefox中修复了所有内容,现在又在Chrome上修复了所有内容,但当我试图选择一个选项来选择所有子节点并打开它们的相关图形时,我遇到了一个奇怪的错误: 未捕获的TypeError:无法调用未定义的方法“substr” 我知道问题显然在于这一行: var graph={id:seqId,entityName:flags[6].substr(1).substr(0,flags[6].length-2),entity:flags[5].substr(1).su
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);
}
}
任何关于这个看似随机的错误的原因的见解都将非常感谢,因为我在网上找不到关于这个错误的太多信息。我所看到的案例与我的一个完全不同,谢谢 以下是您的可读代码:
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时,所调用的字符串都存在。该行
fn=fn.substr(12).substr(0,fn.length-2);
首先制作一个子字符串,有效地从字符串中去掉前12个字母,剩下5个。在这种情况下,第二个substr实际上什么都不做
因为当您分配标志时fn是5,那么标志也是5,这是一个1字符的字符串,因此标志[6]==未定义或任何大于0的索引。只需在console中尝试以下三行:
var x = "5";
x[0]; // returns "5"
x[1]; // returns undefined
第一次赋值后fn的值是多少?@bfavaretto在我console.logged变量fn=$statement之后等于fn=selectGraph95,在我console.logged变量fn=fn.substr语句之后等于fn=5。@user1394965 FF可能只是隐藏了错误。仔细检查并记录所有内容以确保。该函数显然期望与$+idSelectGraph[0]不同。属性[1]。值,因为它希望在“,”上将其拆分为字符串数组,以用作图形函数的标志。您从控制台获得了什么。log$+idSelectGraph;就在函数的顶部?好的,这与预期的不匹配,因为选择器$+idSelectGraph[0]。attributes[1]。value只是从该元素中选择id属性。我会和写这篇文章的人谈谈