![](/img/trans.png)
[英]TypeError: Cannot read properties of undefined (reading 'indexOf')
[英]Uncaught TypeError: Cannot read properties of undefined (reading 'indexOf')
我正在选择 area_enInfantry 的所有子 div 并循环调整某些子 div 的文本。 cardArray 是一个全局常量,myId 在父 function 中定义。
未捕获的类型错误:无法读取未定义的属性(读取“getAttribute”)
var field = $("#area_en" + cardArray[myId]['type']).find("div"); field.each(function(a, element) { console.log("cC type:" + cardArray[myId]['type'] + "- index:" + a + " title: " + element[a].attr('title')); if (element[a].attr("title").indexOf("player") < 0) { // check this card isn't special player card doStuff; } });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="area_enInfantry"> <div id="info_enInfantryScore" class="info_Score">-1</div> <div class="encardContainer" title="barricade">-1</div> <div class="encardContainer" title="spy">2</div> </div>
我在这篇文章中读到,这可能是因为字段/元素的内容可能是 DOM 元素,我应该将它们包装在 $() 中,所以我确实这样做了 - 将两个变量都更改为 $(element)[a].attr( 'title') 但现在我得到 Uncaught TypeError: Cannot read properties of undefined (reading 'indexOf') ,似乎将错误移至下一行。
我在这里做错了什么?
这里有几个问题。 首先,变量element
包含元素 object,而不是 jQuery object,因此没有可用的attr()
方法。
其次,一旦你纠正了这一点,第一个div
上的attr('title')
就没有设置,所以undefined
。 因此你会得到一个错误,因为你在一个空值上调用indexOf()
。 如果 null,您可以通过将值合并为空字符串来解决此问题。
另请注意,我假设您要调用doStuff()
function,因此需要在末尾添加()
,最好尽可能使用prop()
而不是attr()
。
话虽如此,试试这个:
// mock data let myId = 'foo'; let cardArray = { foo: { type: 'Infantry' } } let doStuff = () => console.log('do stuff...'); var $field = $("#area_en" + cardArray[myId]['type']).find("div"); $field.each(function(i, element) { let $el = $(element); console.log("cC type:" + cardArray[myId]['type'] + "- index:" + i + " title: " + $el.prop('title')); if (($el.prop("title") || '').indexOf("player") < 0) { // check this card isn't special player card doStuff(); } });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="area_enInfantry"> <div id="info_enInfantryScore" class="info_Score">-1</div> <div class="encardContainer" title="barricade">-1</div> <div class="encardContainer" title="spy">2</div> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.