Javascript &引用;未捕获类型错误:未定义不是函数;使用str.indexOf函数时

Javascript &引用;未捕获类型错误:未定义不是函数;使用str.indexOf函数时,javascript,Javascript,我在cosole中得到了这样一条信息:uncaughttypeerror:undefined不是一个函数,它简直让我发疯了!我看不出有什么错误,但也许其他人可以帮助我 var nav = document.getElementsByClassName('navigation'); console.log(nav); console.log(nav[0]); var nav_e = nav[0]; //var searched = nav[0].search('<a href="for

我在cosole中得到了这样一条信息:
uncaughttypeerror:undefined不是一个函数
,它简直让我发疯了!我看不出有什么错误,但也许其他人可以帮助我

var nav = document.getElementsByClassName('navigation');

console.log(nav);
console.log(nav[0]);
var nav_e = nav[0];
  //var searched = nav[0].search('<a href="forumdisplay.php?fid=11">Deck - Lab</a>');

  if (nav_e.indexOf('<a href="forumdisplay.php?fid=11">Deck - Lab</a>') > -1) {

    var list = document.getElementsByClassName('post_body');
    var xmlhttp = new XMLHttpRequest();

    var pbelement_encoded = '';
    var pbelement = ''

    for (i = 0; i < list.length; i++) {
      var element = list[i];

      xmlhttp.onreadystatechange=function() {

        if (xmlhttp.readyState==4 && xmlhttp.status==200) {

          var result = xmlhttp.responseText;
          var result2 = result.replace(/fhvjgvghepoapeoaareupo/g,'');


          element.innerHTML = (xmlhttp.responseText.replace(/fhvjgvghepoapeoaareupo/g,''));
        }
      }

      pbelement_encoded = encodeURIComponent(element.innerHTML);
      pbelement = 'pb='+pbelement_encoded;

      //alert(pbelement);

      xmlhttp.open("POST","http://theepicsurge.altervista.org/PostAnalyzer.php",false);
      xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
      xmlhttp.send(pbelement);
    }
  }
}
var nav=document.getElementsByClassName('navigation');
控制台日志(nav);
控制台日志(导航[0]);
var nav_e=nav[0];
//搜索变量=导航[0]。搜索(“”);
如果(资产净值指数(“”)>-1){
var list=document.getElementsByClassName('post_body');
var xmlhttp=new XMLHttpRequest();
变量pbelement_encoded=“”;
变量pbelement=''
对于(i=0;i
错误出现在第一个
if
语句中:
if(导航索引(“”)>-1){


我还尝试将
nav_e.indexOf
替换为
nav_e.search
,但它并没有改变任何事情indexOf方法应用于数组。这里,您将indexOf方法应用于数组的第一个元素,而不是数组
var nav_e=nav[0];
因此,替换此代码:

if (nav_e.indexOf('<a href="forumdisplay.php?fid=11">Deck - Lab</a>') > -1)
if(导航索引(“”)>-1)

if(导航索引(“”)>-1)

如果您的应用程序中存在这种类型的错误-
未定义不是一个函数
,它通常意味着一件事:您试图调用某个对象的方法,认为该对象是
X
类型,而实际上它是
Y
类型

这个例子特别有趣,因为它说明了元素(DOM)和它们对应的表示(例如字符串)之间的混淆

var nav = document.getElementsByClassName('navigation');
var nav_e = nav[0];
…将使用HtmleElement填充
导航
,这是第一个使用
导航
类的导航

(顺便说一句,使用
querySelector('.navigation')
更容易获取该元素)

现在,
nav_e
有一些内容,但它不是一个字符串,而且它本身和原型链上都没有
indexOf
属性。要实现您最初的想法,代码实际上应该这样编写:

if (nav_e.innerHTML.indexOf('<a href="forumdisplay.php?fid=11') !== -1) { /* */ }

如果找不到元素,as
querySelector
方法返回
null

由“nav_e”引用的对象实际上不能是字符串。它不是
null
未定义的
,但不是字符串(或字符串)。添加对
控制台.log的调用(“nav_e是”+(typeof nav_e));
它实际上是HTMLElement,是
document.getElementsByCassName('navigation')[0]
的结果。要检查它的内容,请转到
nav[0].innerHTML.indexOf(…)
。或者,更好的是,直接检查对应的元素(使用
查询选择器('a[href=“forumdisplay.php?fid=11”]))
@raina77ow噢,duhh-我已经从顶部滚动了一下:)@raina77ow这真的很有帮助!你为什么不把它作为一个答案发布呢?无论如何,谢谢。这不管用,因为导航不是一个字符串(正如raina77ow所说)太好了,第二个选项看起来更简单,希望更快!谢谢!
if (nav_e.innerHTML.indexOf('<a href="forumdisplay.php?fid=11') !== -1) { /* */ }
if (nav_e.querySelector('a[href="forumdisplay.php?fid=11"]')) { /* ... */ }