Estoy seleccionando todos los divs secundarios de area_enInfantry y recorriéndolos para ajustar el texto de algunos. cardArray es una constante global y myId se define dentro de la función principal.
TypeError no capturado: no se pueden leer las propiedades de undefined (leyendo '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>Leí en esta publicación que puede deberse a que los contenidos del campo/elemento pueden ser elementos DOM y que debería envolverlos en $(), así que hice exactamente eso: cambiar ambas variables a $(elemento)[a].attr( 'título') pero ahora obtengo Uncaught TypeError: no se pueden leer las propiedades de undefined (leyendo 'indexOf') en su lugar, aparentemente moviendo el error a la siguiente línea.
¿Qué estoy haciendo mal aquí?
Hay un par de problemas aquí. En primer lugar, el element variable contiene un objeto Element, no un objeto jQuery, por lo que no hay un método attr() disponible.
En segundo lugar, una vez que corrige eso, attr('title') en el primer div no está configurado, por lo que no está undefined . Por lo tanto, obtendrá un error porque está llamando a indexOf() en un valor vacío. Puede resolver esto fusionando el valor en una cadena vacía si es nulo.
También tenga en cuenta que asumiría que desea invocar la función doStuff() , por lo que debe agregar () al final y es una mejor práctica usar prop() sobre attr() donde sea posible.
Dicho esto, prueba esto:
// 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>