2017-06-19 17 views
0

アクセスが制限されているウェブサイトのCSSを修正しようとしています。サーバー上にページを作成することは許可されていますが、他のPHPページは生成できません。IFRAMES:contentWindow.beforeunload()とonload()の間のイベント

私は、iframeCSSを注射することを検討しています。私は最初にiframeを隠してから、私の変更が行われた後にそれを明らかにする。

残念ながら、私がiframe.contentWindow.documentへのアクセスを知っている唯一の時間は、iframe.onload()イベントが発生した後です。ほとんどのページは非同期に読み込まれ、ソーシャルメディアのコンテンツを含むすべての外部コンテンツがロードされている間に、画面上のコンテンツを見るのに3秒待っていたのは7〜10秒待っています。

onload()より前に発生するイベントがありますが、私は新しい文書にアクセスできますか?私はちょうどstylesheetを頭に注入したいのですが、DOMの90%が「準備完了」であるかどうかは気にしません。これはあなたが後にしているものの一種である場合は

+0

のを待つことができるかもしれ、beforeunloadは、それが 'MutationObserver'上を追加することが可能かどうかわからない –

+0

無関係です'if rame.contentDocument'だが、それは何かが助けることができる( '頭'がドームに追加されるのを待ってから、あなたのことをする) –

+0

私はちょうど私が見つけることができ、onbeforeloadとonload私は仕事を見た唯一の二人です。私はそれが可能ではないと思っていますが、努力を断念する前に確かめたいと思っていました。 – Cggart

答えて

0

わからない - しかし、それは

NOTEを助ける可能性があります - 私は、しかし、私は一般的にこの種のコードを好きではない、私はもともと私がMutationObserver使うだろうと思いました私は、上記のような何かをしなければならなかったiframeのcontentDocumentを待っている間、私は突然変異のオブザーバーを付ける前に、コンテンツが読み込みを開始したことを示す - そして、私はhead要素が半分の時間に繋がれていないのを見逃すだろう!

のFirefoxのiframeにmozbrowserloadstartイベントを持っている - そうではないのすべての有用な他のどこが、それはちょうど、Firefoxの

function limitedRetryWithDelay(count, delay, tester, cb) { 
    var res = tester(); 
    if(res) { 
     cb(res); 
    } else { 
     if (count > 0) { 
      setTimeout(function() { 
       limitedRetryWithDelay(count - 1, delay, tester, cb); 
      }, delay); 
     } 
    } 

} 
// next 3 lines is just how I tested it - you'll need a reference to the iframe node instead for "tgt" 
var tgt = document.createElement('iframe'); 
document.body.appendChild(tgt); 
tgt.src = '/index.html?_=' + Math.random() + '_' + Math.random(); 
// end testing code 

// try every 10ms for 5 seconds because (500 * 10 = 5000ms) 
limitedRetryWithDelay(500, 10, function (e) { 
    return tgt.contentDocument && tgt.contentDocument.location != 'about:blank' && tgt.contentDocument.head; 
}, function(head) { 
    console.log('head is', head); 
}); 

ところで、あなたが何かをする前に存在することがheadを待つ必要はないかもしれませんそれは、「現在のページ」とは何の関係もいないよう文書では、あなたも本当にcontentDocument

limitedRetryWithDelay(500, 10, function (e) { 
    return tgt.contentDocument && tgt.contentDocument.location != 'about:blank' && tgt.contentDocument; 
}, function(doc) { 
    console.log('document is', doc); 
}); 
+0

ありがとうございます、私はこれをテストしています。タイムアウトコードも好きではありません。この種のソリューションは実稼働環境で見られますか?これを展開して、特定の状況下で壊れる可能性があることについて私は緊張していますか? – Cggart

+0

Chromeのiframe onloadイベントはFirefoxの場合と同じように動作しないため、何らかの理由で起動できない場合があります。私はもはやその特定のコードに関与していないので、私は気にしない:p –

関連する問題