Actualmente estoy tratando de programar una extensión de navegador para la intranet de la empresa en la que trabajo, para esto necesito obtener diferentes elementos HTML a través de JavaScript, y me gustaría tener una función general para esto, ya que muchos de estos elementos están en marcos (¡no iframes!) que están en un conjunto de marcos. He estado buscando en Google durante 2 horas y no he encontrado una solución que funcione. Entre otras cosas, ya lo probé a través de window.frameElement.contentDocument, que funciona en el inspector de HTML, pero da un error en el script de que ese elemento supuestamente no existe, además, esta función no es exactamente aplicable en general... ¿Hay alguien aquí que haya escrito tal función por casualidad? Necesito una solución simple de JavaScript. Todos los marcos de la página pertenecen al mismo dominio.
Esto es lo que tenía hasta ahora (no funciona):
function findInAll(selector) { let result = []; let search = getAllElements(); result.push(document.querySelectorAll(selector)); // loop through all search elements for (let i = 0; i < search.length; i++) { // if element matches selector if (search[i].elements[0].matches(selector)) { // push element to result result.push(search[i]); } } return result; } function getAllElements(parent = document) { let all = parent.getElementsByTagName("*"); let elements = []; for (let i = 0; i < all.length; i++) { elements.push(all[i]); if ( all[i].tagName == "IFRAME" || all[i].tagName == "FRAME" || all[i].tagName == "FRAMESET" ) { elements.push(getAllElements(all[i])); } } return elements; }Estaba pensando demasiado complicado... Aparentemente, también debería volver a pensar en mis habilidades en inglés que no he llegado a esta formulación de pregunta, pero ahora gracias a esta respuesta podría escribir una función propia:
function findElement(selector, start = window) { var el = start.document.querySelectorAll(selector); let result = null; if (el.length > 0) { for (var i = 0; i < el.length; i++) { return el[i]; } } for (var i = 0; i < start.frames.length; i++) { result = findElement(selector, start.frames[i].window); if(result != null) { break; } } return result; } function findElements(selector, start = window) { let result = []; var el = start.document.querySelectorAll(selector); if (el.length > 0) { for (var i = 0; i < el.length; i++) { result.push(el[i]); } } for (var i = 0; i < start.frames.length; i++) { let found = findElement(selector, start.frames[i].window); if (found.length > 0) { for (var j = 0; j < found.length; j++) { result.push(found[j]); } } } return result; }