Доступ внутри фреймов - PullRequest
       9

Доступ внутри фреймов

1 голос
/ 24 апреля 2011

Я использую короткий фрагмент производного кода 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);

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

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 Ответ

1 голос
/ 24 апреля 2011

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

...