2012-02-20 15 views
6

por lo que esto:getElementsByTagName ('a'); ¿no funciona?

var stuff = document.getElementsByTagName('iframe'); 

funciona bien. Entonces quiero hacer esto:

var other = stuff.getElementsByTagName('a'); 

pero no funciona. Termina siendo indefinido. Puedo hacer:

var other = document.getElementsByTagName('a'); 

y está bien. ¿No debería ser capaz de obtener toda la 'a' en 'iframe'?

Editar: Por lo tanto, no soy el propietario del iframe y ahora tengo la impresión de que no puedo acceder a nada que genere el iframe, lo que significa que supongo que estoy jodido.

+0

¿Es usted propietario del iframe? – Anurag

+0

@Anurag No. Vi a alguien publicar una respuesta que decía que no se puede acceder a esa información debido a la seguridad del navegador, pero la eliminaron. Supongo que solo puedes acceder a la parte real del iframe y cualquier contenido que genere está fuera de los límites. – townie

Respuesta

2

getElementsByTagName devuelve una matriz de elementos coincidentes. Para acceder a un IFRAME individual, usaría stuff[0] por ejemplo.

10

uso ..

var iframe = document.getElementsByTagName('iframe')[0], 
    iframeDoc = iframe.contentWindow.document; 

Specification.

Luego, puede llamar al getElementsByTagName('a') en iframeDoc. Alternativamente, puede acceder al iframeDoc.links, que no es exactamente igual, pero puede ser lo que desee.

Por supuesto, todo esto depende del acceso a iframe 's document que no infringe Same Origin Policy.

+1

Esto es correcto. getElementsByTagName es un método en un documento, no en un enlace. La forma en que intentas hacerlo, tú (ciudadano) están tratando de hacerlo es clasificar a los hijos de una etiqueta. – Chris

+3

Dado que 'iframe.contentDocument' no funciona en IE <8, optaría por solo usar' iframe.contentWindow.document' que funciona de manera confiable entre navegadores. No hay ningún beneficio en el primer intento de usar contentDocument: solo el código será más largo. –

+1

@ReneSaarsoo Sí, pensé que tal vez el segundo era la manera correcta de hacer negocios de IE, pero la especificación menciona ambos. Lo arreglaré :) – alex

4

getElementsByTagName() devuelve un NodeList, que tendrá que repetir. Para iterar sobre ella, que puede hacer:

for (var i = 0; i < stuff.length; i++) { 
    var other = stuff[i].getElementsByTagName('a'); 
} 

Sin embargo, getElementsByTagName('a') pide a los niños dentro del documento actual, que es casi seguro que no lo desea. Si desea tener hijos en el interior del documento en el marco, usted tiene que hacer:

for (var i = 0; i < stuff.length; i++) { 
    var other = stuff[i].contentWindow.document.getElementsByTagName('a'); 
} 

Esto funcionará si tiene varios marcos flotantes, y en las versiones antiguas de IE.

+4

No es realmente una matriz. Es una lista de nodos. –

+0

@MikeSamuel Muy bien :) –

3
stuff[0].contentWindow.document.getElementsByTagName('a') 

debe producir un objeto similar a una matriz que contiene todos los enlaces en el iframe cero.

Es necesario utilizar contentWindow.document porque el no contiene ningún nodo en el documento actual - se trata de una trama cuyo contentWindow puntos de propiedad a una ventana diferente con su propio documento.

0

¿Por qué todos sugieren contentWindow.document cuando puedes usar contentDocument en su lugar?

Por supuesto, ambos funcionan, pero prefiero usar lo que quiero decir. Si quiero la ventana, uso contentWindow. Si quiero el documento, uso contentDocument.

+0

Aparentemente no funciona alex

Cuestiones relacionadas