Cómo acceder al iframe principal desde JavaScript
window parent iframe (9)
Intenta esto, en tu marco principal configura tus IFRAME así:
<iframe id="frame1" src="inner.html#frame1"></iframe>
<iframe id="frame2" src="inner.html#frame2"></iframe>
<iframe id="frame3" src="inner.html#frame3"></iframe>
Tenga en cuenta que la identificación de cada marco se pasa como un ancla en el src.
luego, en su html interno puede acceder al id del marco en el que está cargado a través de location.hash:
<button onclick="alert(''I am frame: '' + location.hash.substr(1))">Who Am I?</button>
luego puede acceder a parent.document.getElementById () para acceder a la etiqueta iframe desde dentro del iframe
Bueno, tengo un IFrame, que llama a una misma página de dominio. Mi problema es que quiero acceder a cierta información de este iframe padre de esta página llamada (desde JavaScript). ¿Cómo puedo acceder a este iframe?
Detalles: hay varios Iframes como este, que pueden tener cargada la misma página, porque estoy programando un entorno de Windows. Tengo la intención de cerrar este Iframe, es por eso que necesito saber cuál debería cerrar desde dentro de él. Tengo una matriz que guarda referencias a estos Iframes.
EDITAR: los iframes se generan dinámicamente
Simplemente llame a window.frameElement
desde su página enmarcada. Si la página no está en un marco, frameElement
será null
.
La otra forma (obtener el elemento de la ventana dentro de un marco es menos trivial), pero para completar:
/**
* @param f, iframe or frame element
* @return Window object inside the given frame
* @effect will append f to document.body if f not yet part of the DOM
* @see Window.frameElement
* @usage myFrame.document = getFramedWindow(myFrame).document;
*/
function getFramedWindow(f)
{
if(f.parentNode == null)
f = document.body.appendChild(f);
var w = (f.contentWindow || f.contentDocument);
if(w && w.nodeType && w.nodeType==9)
w = (w.defaultView || w.parentWindow);
return w;
}
Tal vez solo use
window.parent
en su iframe para obtener el marco / ventanas de llamada. Si tiene múltiples marcos de llamadas, puede usar
window.top
También puede establecer el nombre y la ID a valores iguales
<iframe id="frame1" name="frame1" src="any.html"></iframe>
para que pueda usar el siguiente código dentro de la página secundaria
parent.document.getElementById(window.name);
Una vez que se establece id de iframe, puede acceder al iframe desde el documento interno como se muestra a continuación.
var iframe = parent.document.getElementById(frameElement.id);
Funciona bien en IE, Chrome y FF.
Una vieja pregunta, pero tuve el mismo problema y encontré una forma de obtener el iframe. Es simplemente una cuestión de iterar a través de la matriz de cuadros de la ventana principal y probar la ventana de contenido de cada marco en la ventana en la que se está ejecutando su código. Ejemplo:
var arrFrames = parent.document.getElementsByTagName("IFRAME");
for (var i = 0; i < arrFrames.length; i++) {
if (arrFrames[i].contentWindow === window) alert("yay!");
}
O, usando jQuery:
parent.$("iframe").each(function(iel, el) {
if(el.contentWindow === window) alert("got it");
});
Este método guarda la asignación de un ID a cada iframe, lo cual es bueno en su caso, ya que se crean dinámicamente. No pude encontrar una forma más directa, ya que no puede obtener el elemento iframe usando window.parent: va directamente al elemento de la ventana principal (omitiendo el iframe). Así que recorrerlos parece ser la única forma, a menos que quiera usar ID.
Yo recomendaría usar la API postMessage .
En tu iframe, llama:
window.parent.postMessage({message: ''Hello world''}, ''http://localhost/'');
En la página que está incluyendo el iframe, puede escuchar eventos como este:
window.addEventListener(''message'', function(event) {
if(event.origin === ''http://localhost/'')
{
alert(''Received message: '' + event.data.message);
}
else
{
alert(''Origin not allowed!'');
}
}, false);
Por cierto, también es posible hacer llamadas a otras ventanas, y no solo a iframes.
Lea más sobre la API postMessage en el blog de John Resigs here
puede usar parent
para acceder a la página principal. Entonces, para acceder a una función sería:
var obj = parent.getElementById(''foo'');
// just in case some one is searching for a solution
function get_parent_frame_dom_element(win)
{
win = (win || window);
var parentJQuery = window.parent.jQuery;
var ifrms = parentJQuery("iframe.upload_iframe");
for (var i = 0; i < ifrms.length; i++)
{
if (ifrms[i].contentDocument === win.document)
return ifrms[i];
}
return null;
}