2011-11-29 20 views
5

Nuestros sitios de desarrollo y corporativos tienen una jerarquía de cuadros ligeramente diferente.jQuery: Encontrar un elemento, independientemente del marco

Muy ocasionalmente necesito hacer referencia a un elemento en un marco diferente.

Por desgracia, no sé donde ese marco será en la jerarquía. Sin embargo sé que es id.

¿Cómo puedo encontrar un marco o un elemento específico, cuando no sé la estructura exacta?

Para mayor claridad En dev, es básicamente una página, que contiene un marco. Estoy en el contexto del marco, y solo estaba usando window.top.document para obtener el documento que quería.

En prod, la anidación es diferente, window.top.document no funciona, ya que se encuentra dentro de otros dos marcos.

No puedo cambiar esta estructura, es sólo la forma en que funciona nuestro portal de aplicaciones.

Respuesta

3

tal vez podría intentar atravesar todos los marcos. necesitarás usar una búsqueda de amplitud primero o de profundidad de acuerdo con cuán profunda será la anidación de cuadros. pasar la raíz originalmente.

frameSearch(yourElementId,$("frame")); 

function frameSearch(elementId,frames){ 
     if (!(frames)) {return "element not found";} 
     $.each(frames,function(){ 
      var $elementFound = this.find("#"+elementId); 
      if ($elementFound){ 
       return $elementFound; 
      } 
      var newFrames = this.find("frame"); 
      if (newFrames) {frameSearch(elementId,newFrames);} 
     }); 
} 

No estoy 100% seguro de la exactitud de este algoritmo recursivo, pero esta es la idea correcta, creo.

EDIT:

si necesita encontrar al padre superior, intente:

var $currentDocument = $("document"); 
    while ($currentDocument.parent()){ 
     if ($currentDocument.find("#"+yourElementId)){ 
       $yourElement = $currentDocument.find("#"+yourElementId); 
       break; 
     } 
     $currentDocument = $currentDocument.parent(); 
    } 

    if (!($yourELement)){ 
     $yourElement = frameSearch(yourElementId,$("frame")); 
    } 

Esto comprobará hacia arriba, luego hacia abajo, si eso no funciona

0

Si conoce la identificación del marco, puede usar el selector de ids y el método contents() para encontrar los elementos dentro del iframe. Pruebe esto

$("#iframeId").contents().find("elementToFind") 
+0

no creo que esto funcionará para un marco dentro de un marco que es el problema hay? – Evan

+0

Creo que esto solo funciona yendo por el árbol, no por la copia de seguridad – CaffGeek

+0

Esto buscará elementos dentro del iframe seleccionado. – ShankarSangoli

6

Si es el iframe del mismo dominio, los elementos son fácilmente accesibles a través de jQuery como

$("#frameID").contents().find("#elementID").hide(); 

Hay algunas excepciones Here y dominio extranjero:

0

esto funcionó para mí ...

USERNAME='input#username'; 

    frame_count=window.parent.frames.length; 
    for(f=0;f<frame_count-1;f++){ 
     test_frame=window.parent.frames[f].document.body; 
     if ($(USERNAME, test_frame).length==1) { 
      INPUT_FRAME=f; 
      break; 
     }; 
    }; 

detail_frame=window.parent.frames[INPUT_FRAME].document.body; 

$(USERNAME, detail_frame).val(username); 
Cuestiones relacionadas