jQuery: поиск элемента независимо от фрейма - PullRequest
5 голосов
/ 29 ноября 2011

У наших сайтов разработчиков и корпоративных сайтов немного другая иерархия фреймов.

Иногда мне нужно ссылаться на элемент в другом фрейме.

К сожалению, я не знаю, где этот фреймбудет в иерархии.Однако я знаю, что это идентификатор.

Как мне найти рамку или конкретный элемент, когда я не знаю точную структуру?

Для пояснения В dev это в основном просто страница, содержащий рамку.Я нахожусь в контексте фрейма и просто использовал window.top.document, чтобы получить нужный документ.

В prod, вложение другое, window.top.document не работает,поскольку он находится внутри двух других фреймов.

Я не могу изменить эту структуру, это просто, как работает наш портал приложений.

Ответы [ 4 ]

6 голосов
/ 22 октября 2012

Если iframe из того же домена, элементы легко доступны через jQuery как

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

Есть несколько исключений Здесь о чужом домене:

3 голосов
/ 29 ноября 2011

может быть, вы могли бы попробовать пройти все кадры. Вам нужно будет либо использовать поиск в ширину или глубину в зависимости от глубины вложения кадра. передать его изначально.

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);}
      });
}

Я не уверен на 100% в правильности этого рекурсивного алгоритма, но я верю, что это правильная идея.

EDIT:

если вам нужно найти самого верхнего родителя, попробуйте:

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

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

это будет проверять сначала вверх, затем вниз, если это не сработает

0 голосов
/ 18 сентября 2014

это сработало для меня ...

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);
0 голосов
/ 29 ноября 2011

Если вы знаете идентификатор фрейма, вы можете просто использовать селектор идентификатора и метод contents(), чтобы найти элементы в iframe.Попробуйте это

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