1

現在、この Google タスク ガジェットのスタイル要素を変更しようとしています:

https://mail.google.com/tasks/ig

クロム コンテンツ スクリプトを使用します。

この例では、下部のツールバーを削除しています。Google が JavaScript で HTML を生成し、それを iframe に入れるためです。このコードを使用する必要があります:

document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById(':1.ft').style.display = 'none'

このコードを開発者コンソールから実行すると、ツールバーが非表示になります。ただし、コンテンツ スクリプトとしては機能しません。

これは、ページの準備が整う前にコードが実行されるためだと思いました。だから私はイベントリスナーを使用しようとしました:

document.addEventListener("DOMContentLoaded", function () {
document.getElementsByTagName('iframe')[0].contentWindow.document.getElementById(':1.ft').style.display = 'none'
}, false);

しかし、それもうまくいきませんでした。イベントリスナー「domready」と「load」も試しました。しかし、どれも機能しませんでした。

どうすればその要素を取得できますか?

4

1 に答える 1

1

この場合、このスタイル ルールが適切な iframe に適用されていることを確認するだけでよく、いつロードされるかを気にする必要はありません。

#:1.ft {display: none !important;}

(^_^)
ただしsrc="javascript: ....


より一般的な場合。そのノード (またはそのノードを含む iframe) が AJAX によってロードされた場合、「domready」または「load」のかなり後に間違いなく表示されます。
実証済みの解決策は、要素をポーリングすることです。

var waitForElementIntrvl = setInterval (checkForElement, 333);

function checkForElement () {
    var firstIframe     = document.querySelector ("iframe");
    if (firstIframe) {
        var targElement = firstIframe.contentWindow.document.getElementById (':1.ft');
        if (targElement) {
            targElement.style.display = 'none';
            clearInterval (waitForElementIntrvl);
        }
    }
}


でも:

Google Chrome のコンテンツ スクリプトは、依然として iframe DOM ではうまく機能しません。したがって、そのコードが機能するためには、ターゲット ページに挿入する必要があります。最終的なコンテンツ スクリプト コードは次のようになります。

function userscriptMain () {
    var waitForElementIntrvl = setInterval (checkForElement, 333);

    function checkForElement () {
        var firstIframe     = document.querySelector ("iframe");
        if (firstIframe) {
            var targElement = firstIframe.contentWindow.document.getElementById (':1.ft');
            if (targElement) {
                targElement.style.display = 'none';
                clearInterval (waitForElementIntrvl);
            }
        }
    }
}

addJS_Node (null, null, userscriptMain);

function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
    var D                                   = document;
    var scriptNode                          = D.createElement ('script');
    if (runOnLoad) {
        scriptNode.addEventListener ("load", runOnLoad, false);
    }
    scriptNode.type                         = "text/javascript";
    if (text)       scriptNode.textContent  = text;
    if (s_URL)      scriptNode.src          = s_URL;
    if (funcToRun)  scriptNode.textContent  = '(' + funcToRun.toString() + ')()';

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
    targ.appendChild (scriptNode);
}
于 2012-08-25T02:34:50.260 に答える