2016-01-14 4 views
23

内のすべてのネストされたフレームの難しなっリストは、こんにちは、私は私ののGreaseMonkeyスクリプトのすべてのフレームのリストを取得する必要がありますが、実際に私はそれが一般的なJavascriptの質問あると思います。私がページに入れ子になっているすべての単一のフレームに到達することができれば素晴らしいことでしょう。これまでのところ、メインドキュメントフレームにネストされたフレームの数を取得することに問題がありました。私が扱ってるJavaスクリプト、ページ

ページマルチレベルで、フレームは他のフレームが含まれていフレームセットで構成されています。私はメイン文書フレームセット(コードレベル1)のトップレベルフレームについての情報を得ることができましたが、このレベルでは、これらのフレームのフレームカウントが0に等しいという情報が得られます。

私は、次のコード

$(document).ready(function(){ 
var frames = window.frames; 
var i,j; 
var reportText = "level 0 > " + frames.length +"\r\n"; 

for (i = 0; i < frames.length; i++) { 
    var frames2 = frames[i].frames; 
    reportText += "level 1 - " + i + " > " + frames[i].name + " - " + frames2.length +"\r\n"; 

    for (j = 0; j < frames2.length; j++) { 
     var frames3 = frames2[j].frames; 
     reportText += "level 2 - " + i + " - " + j + " > " + frames2[j].name + " - " + frames3.length +"\r\n"; 
    } 
} 

alert(reportText);}); 

事実メイン文書のフレーム数とレベル1名またはメイン文書のフレームにされそうレベル0を思い付いている - これらの事が正しくなく、報告されています各フレームの量はレベル1フレームです。私のコードに間違いがあるか、サブフレームが完全にロードされていないことが原因であるかどうかを知りたいのです。唯一のフレームセット

(function(){ 
document.addEventListener('keydown', function(e) { 
if (e.keyCode == 72 && !e.shiftKey && !e.ctrlKey && e.altKey && !e.metaKey) { 

//...my previous code inside document.ready... 

    } 
}, false);})(); 
の構成され、私は結局その完全にロードされたように見えるが、ここでは別の問題だろう、キーボードショートカットから私のコードを呼び出すようにしようとしました

、次のコードのように思えるが、ページと連携していないようです

コードは自動的にすべてのフレームとサブフレームを介してくしゃみを行いますが、現在のシェイプ(各レベルには独自のループがある場合)も最適です。

ショートカットキーを使用できないという問題は副次的です。 主なものは、メイン文書の枠内とそれを超えて、フレームの適切な数を取得しています。

EDIT:サンプル出力と私のテストページのネストされたフレームセットと

出力

レベル> 3 0

レベル1から0> MAIN1 - 0

レベル1 - > main2 - 0

レベル1 - 2> main3 - 0

テストページのネストされたフレームセット

frame0.htm

<!DOCTYPE html> 
<html> 
<frameset cols="25%,*,25%"> 
    <frame id="frmain1" name="main1" src="frame0_1.htm"> 
    <frame id="frmain2" name="main2" src="frame0_2.htm"> 
    <frame id="frmain3" name="main3" src="frame0_3.htm"> 
</frameset> 
</html> 

frame0_1有します。HTM

<!DOCTYPE html> 
<html> 
<frameset rows="25%,*"> 
    <frame id="frsub11" name="sub11" src="frame0_1_1.htm"> 
    <frame id="frsub12" name="sub12" src="frame0_1_2.htm"> 
</frameset> 
</html> 

frame0_1_1.htm

<!DOCTYPE html> 
<html> 
<body style="background: darkorange;"> 
</body> 
</html> 

frame0_1_2.htm

<!DOCTYPE html> 
<html> 
<body style="background: lightyellow;"> 
</body> 
</html> 

frame0_2.htm

<!DOCTYPE html> 
<html> 
<frameset rows="25%,*,25%"> 
    <frame id="frsub21" name="sub21" src="frame0_2_1.htm"> 
    <frame id="frsub22" name="sub22" src="frame0_2_2.htm"> 
    <frame id="frsub23" name="sub23" src="frame0_2_3.htm"> 
</frameset> 
</html> 

frame0_2_1.htm

<!DOCTYPE html> 
<html> 
<body style="background: skyblue;"> 
</body> 
</html> 

frame0_2_2.htm

<!DOCTYPE html> 
<html> 
<body style="background: cornflowerblue;"> 
</body> 
</html> 

frame0_2_3.htm

<!DOCTYPE html> 
<html> 
<body style="background: slateblue;"> 
</body> 
</html> 

frame0_3.htm

<!DOCTYPE html> 
<html> 
<frameset rows="25%,*"> 
    <frame id="frsub31" name="sub31" src="frame0_3_1.htm"> 
    <frame id="frsub32" name="sub32" src="frame0_3_2.htm"> 
</frameset> 
</html> 

frame0_3_1.htm

<!DOCTYPE html> 
<html> 
<body style="background: darkgreen;"> 
</body> 
</html> 

frame0_3_2.htm

<!DOCTYPE html> 
<html> 
<body style="background: lightgreen;"> 
    <a id="test" href="http://www.google.com">testlink</a> 
</body> 
</html> 
+0

フレームが異なるドメインに属する場合、そのコンテンツ(したがってサブフレーム)にアクセスすることはできません。また、あなたのコードに明白なエラーがあります: 'frames2 [j] .frames.lenght'。 – jcaron

+0

@jcaron間違いを指摘していただきありがとうございます。このコード部分は、0フレームカウント前の1ステップが報告されたときに実行する機会がありませんでした。私は同じ起源政策を認識しており、これはここでは当てはまりません。それでも、私は主なドキュメントフレームセットのフレーム内にフレームの数を得ることができないという手掛かりはありません。 – MoreThanChaos

+0

あなたのコードはまったく実行されていますか?ログを(ブラウザコンソールで見ることができる 'console.log'を使って)別の場所で追加して、実行されている部分を確認し、関連するデータを記録します。それは '警戒'よりずっと便利だろう。 – jcaron

答えて

9

問題は、あなたがこれを呼んでのイベントです。 $(document).ready()は、現在のDOMがロードされたときに発生します。したがって、3つのメインフレームが読み込まれるとトリガーされます。しかし、この時点ではこれらのフレームにはまだiframesがロードされていませんでした。イベントをwindow.onloadに変更すると、予期した結果が得られます。このように:https://developer.mozilla.org/en/docs/Web/API/GlobalEventHandlers/onload

文書のロードプロセスの終了時に負荷イベントが発生します:

$(window).load(function(){ 
    ... 

または

window.onload = function(){ 
    ... 

window.onloadを参照してください。 この時点では、ドキュメント内のすべてのオブジェクトがDOM内にあり、 の画像、スクリプト、リンク、およびサブフレームの読み込みがすべて完了しています。

https://api.jquery.com/ready/

+0

問題を解決しようとしたときに出てきたことを見てもらえますか? 'document.addEventListener'は動作しませんフレームセットだけで構成されたドキュメントを使用して、あなたの考えを共有しますか? – MoreThanChaos

+1

keydown listener(またはウィンドウまたはドキュメントに適用するイベント)の問題は、これらのイベントが上部フレームではなくサブフレームの1つでトリガーされることです。これらのイベントをこれらのサブフレームに追加することもできますが、同じ問題が発生した場合でも、それらをロードする必要があります。 –

2

framesethtml5ではサポートされていません参照してください。

次のデモをご覧ください。frameset Demo私はhtmファイルを修正しました。フレームセットのonloadイベントを聴取し、onlnoadイベントが発生した後にそのコンテンツにアクセスすることです。

子フレームの内容にアクセスするには、Same-Origin policyを呼び出す必要があります。

+0

答えてくれてありがとう、事は 'frames'を扱うことは私に任せられていない、私はWebインターフェースを使って既存システムのユーザー側を改善しようとしている。実際、私はネストされた 'frames'の束を扱わなければなりません。 – MoreThanChaos

3

ワーキングコードソリューション

そうのように、再帰関数とwindowloadイベントを使用します(クロム、Firefoxとエッジの最新バージョンで動作します。。他人をテストしていない。おそらくもIE5 +で動作します)。

、あなたのトップレベルframesetframe0.htmこのコードを使用します。これは、ちょうど何が起こっているかをお見せするために、コンソールに書き込みますが、もちろん、あなたがしてやりたいことができ

<!DOCTYPE HTML Frameset DTD> 
<html> 
<head> 
<script> 
window.onload = function() 
{ 
    var allFrames = []; 
    function recursFrames(context) 
    { 
     for(var i = 0; i < context.frames.length; i++) 
     { 
      console.log(context.frames[i].name + " -- " + context.frames[i].location.href); 
      allFrames.push(context.frames[i]); 
      recursFrames(context.frames[i]); 
     } 
    } 
    recursFrames(window); 
    console.log("Frames count: " + allFrames.length); 
} 
</script> 
</head> 
<frameset cols="25%,*,25%"> 
    <frame id="frmain1" name="main1" src="frame0_1.htm"> 
    <frame id="frmain2" name="main2" src="frame0_2.htm"> 
    <frame id="frmain3" name="main3" src="frame0_3.htm"> 
</frameset> 
</html> 

をこの情報。すべての子フレームのフラットなリスト(配列)を作成しますが、好きな場合は階層的に構造化することができます。

HTML 5リマインダー

あなたはHTML5 DOCTYPEを使用しているが、framesetはHTML5でサポートされていません。しかし、いつサポートを停止するかを決めるのはブラウザの責任であり、その多くは依然として行います。できるだけ早くframesetの使用を中止することをお勧めします。フレームのような動作(異なるウィンドウとドキュメント)が必要な場合は、代わりにiframeを使用してください。

+0

私はショートカットキーハンドラで何もしませんでしたが、これは二次的だと言いましたが、そこで何をしているのかはっきりしていません。あなたはテスト用に使ってみたようですが、あなたはまだこれに問題があります。また、このソリューションではネイティブのjavascriptを使用していますが、必要に応じてjQueryで置き換えることもできます。 – nothingisnecessary

+0

あなたの答えをありがとう、私はフレームに基づいているいくつかの既存のWebアプリケーションを改善しています - 私はそれが改善できるGreaseMonkeyとユーザー定義のスクリプトとのソース自体にアクセスできません - だから私は'iframe'ではなく' frames'を扱うことを主張しています。もちろん、jQueryの柔軟性のためにネイティブJSの代わりに使用します。もう一度ありがとう! – MoreThanChaos

+0

意味がある - 私は、従来の製品をアップデートするときに私自身も同様の状況に遭遇した。私の好奇心を満足させてくれてありがとう。解決策に問題がある場合はお知らせください。 – nothingisnecessary

関連する問題