Доступ в iframes

#javascript #firefox #linkify

#javascript #firefox #linkify

Вопрос:

Я использую короткий фрагмент производного от linkify кода для доступа ко всем текстовым индексам на веб-странице из расширения Firefox. Это выглядит примерно так, так что ничего особенно интересного:

 var notInTags=[
    'a', 'head', 'noscript', 'option', 'script', 'style', 'title', 'textarea'
    ];

    var xpath = ".//text()[not(ancestor::" notInTags.join(') and not(ancestor::') ")]";

    var candidates = window.content.document.evaluate(xpath, window.content.document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
  

Есть ли у кого-нибудь предложения о наилучшем способе извлечения текстовых узлов из любых присутствующих iframes, пожалуйста?
В частности, использует

 iframe.window.content.document
  

вероятно, это меня куда-нибудь приведет (похоже, что нет), или я, я лаю не по тому дереву?

Приветствия 🙂

Правка 2: Это полностью обновленная функция (снова)

     rsfindmod.searchiframes= function(candidates){
//This fixes cases where a redirecting page uses frames (Primarily search engines etc)
    const urlRegex = /b(https?://[^s "<>] )/ig;
    var framesets = window.content.document.getElementsByTagName('frame','iframe','frameset');

    for (var i = 0; i < framesets.length; i  ) {
    if (urlRegex.test(framesets[i])) {
    alert('test');
    var document2 = framesets[i].contentDocument;
    var notInTags=[
    'a', 'head', 'noscript', 'option', 'script', 'style', 'title', 'textarea'
    ];

    var xpath = ".//text()[not(ancestor::" notInTags.join(') and not(ancestor::') ")]";

    var textnodes = document2.evaluate(xpath, document2, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for(var i = 0; i < textnodes.length; i  ) {
        candidates.push(textnodes[i]);
    }
}   
}
}
  

Правка 3: немного лучшая функция?

 rsfindmod.searchiframes= function(candidates, frame, documentList){
//This fixes cases where a redirecting page uses frames (Primarily search engines etc)
    const framesets = frame.frames;

    for (var i = 0; i < framesets.length; i  ) {
    var document2 = framesets[i].contentWindow.document;
    var notInTags=[
    'a', 'head', 'noscript', 'option', 'script', 'style', 'title', 'textarea'
    ];
    alert('test');
    var xpath = ".//text()[not(ancestor::" notInTags.join(') and not(ancestor::') ")]";

    var textnodes = document2.evaluate(xpath, document2, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for(var i = 0; i < textnodes.length; i  ) {
        candidates.push(textnodes[i]);
        alert('test1'); 
    }

}
}
  

Ответ №1:

Вы хотите iframe.contentDocument (или iframe.contentWindow.document , но первый вариант проще).

Комментарии:

1. Ему это совсем не нравится. Пожалуйста, смотрите первый пост для полной функции.

2. Даже не доходит до тестового предупреждения. Теоретически, это должно заключаться в поиске всех iframes / наборов фреймов на странице, добавлении их в массив ‘framesets’, а затем переносе всех текстовых узлов в массив candidates.

3. Обновил то, что у меня есть, снова, чтобы добавить тест URL, прежде чем я попытаюсь получить доступ к contentDocument. Это по-прежнему не работает, но и не заставляет Firefox полностью шататься!

4. Являются ли ваши подфреймы другого происхождения (например, с сервера ad)? Если они есть, то вы, конечно, не сможете получить доступ к их содержимому.

5. Ах, вот почему тогда : ( Я пытаюсь исправить страницу, перенаправленную через систему поиска файлов. Исходная страница отображается в iframe со страницей на сервере поисковой системы. Есть какой-нибудь простой способ обойти это? Я думаю, я мог бы что-нибудь сделать с помощью grabber, а затем каким-то образом обработать это как обычный документ?