複数フレーム同時切替をフレーム内のインラインフレームで



0   名前:  : 2007/09/08(土) 18:12  ID:Yk4KofLQ sub-nz
はじめまして、お世話になります。

こちらの「複数のフレームを同時に切りかえる」で、
http://www.tagindex.com/javascript/link/frame.html

function jump(){
parent.フレームA.location.href = "A.html";
parent.フレームC.location.href = "C.html";
}

を使わせて頂いているのですが、

「C」が、「フレームB」の中にある、
「インラインフレーム」の時には使えませんでした。
指定の仕方が悪いのでしょうか?
フレームが2重になっていると駄目なのでしょうか…。

「フレームB」中にある「インラインフレームC」を、
「フレームA」と同時に切り替える方法はないでしょうか?

どなたかご存知の方お教え頂けませんでしょうか、
どうか宜しくお願い致します。

1   名前: 匿名 : 2007/09/08(土) 18:12  ID:PISglGMa sub-Cl
function jump(){
parent.フレームA.location.href = "A.html";
parent.フレームB.フレームC.location.href = "C.html";
}

これでどうかね?

2   名前: 匿名 : 2007/09/08(土) 18:12  ID:k58nPpF. sub-Cz
いつも思うんだが、スクリプト無効の利用者は泣くしかないのですか。面倒くさがらずに、異なる iframe 要素の数だけ同じページを用意するのではダメなのですか。フレームで制作するというのは、そういう面倒くささと表裏一体なわけですが。

スクリプト無効の場合の代替処置を考えた上で、それを採用することに決めたのなら、まず代替処置を教えて下さい。それに合わせて調節するから。


おまけ。超簡易 XFrames。
<script type="text/javascript">

var uriReference = /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;
var schemeData = '(?:[\\u0000-\\u0027\\u002A-\\u005D\\u005F-\\uFFFF]' +
                  '|(?:\\^\\()|(?:\\^\\))|(?:\\^\\^))*';
var pointerPart = new RegExp ('(?:xframes\\((' + schemeData + ')\\))?', '');
var associations = /([^,=]+)=([^,=]+),?/g;

function parseXFrames (uri) {
    var d, p = pointerPart.exec (uriReference.exec (uri)[9])[1];
    while (d = associations.exec (p)) {
        if (frames[d[1]]) frames[d[1]].location.href = d[2];
        if (parent.frames[d[1]]) parent.frames[d[1]].location.href = d[2];
    return false;
}
</script>

<p>
  <a href="alternative.html#xframes(F1=sample1.html,F2=sample2.html)"
     onclick="return parseXFrames (this);" ></a>
</p>

3   名前:  : 2007/09/08(土) 18:12  ID:Yk4KofLQ sub-nz
出来ましたーーーっvvvああぁ嬉しいvv(T▽T)
な…並べるだけだったんですね…、
安易な事で質問し、お手を煩わせてしまいまして、
大変申し訳ございませんでしたm(_ _;)m

他で探して長いスクリプトの物を色々試していて、
かなりパニックになっていたのでとても助かりました!
お答え下さり本当にどうも有り難うございましたv(^^)

4   名前:  : 2007/09/08(土) 18:12  ID:Yk4KofLQ sub-nz
>2.の匿名様

貴重なご意見は有り難いのですが、スクリプト使用に対するご意見を、
このような場所で私個人に仰られても困ります。

当サイトを知る由もないのに、「いつも」と見知らぬ誰か達と一括りにし、
「面倒くさがって」とは、大層失礼な仰りようですが、
作る側としてはスクリプトを使用する方が、個人的には面倒くさいです。
必要なページは用意してあるのに、更にそれを表示する為色々用意するのですから。
この件も、一度に表示された方が閲覧者様のお手間が省けるのではと思っての事です。

あと当方は「JavaScript使用必須のネトゲ」のファンサイトです、
他のサイトも持っておりますが、そちらではフレームも使ってはおりません。
一応フレーム未対応、もしくは苦手な方々の為に、トップ(JavaScript&
スタイルシート不使用)のマップから、各ページへ飛べるようにしてあります。

…などと一々書いては、場を逸脱し余計で、却ってご迷惑かと、
用件のみを書かせて頂いたのですが、言葉が足りず申し訳ございません。

ご調整頂けるとの事ですが、もう解決致しました、
折角のお申し出を不意に致しまして申し訳ございません。

お答えと、おまけを下さり本当に有り難うございました。

当方から言える事は以上です、
ご納得頂けなければ力不足で申し訳ございませんが、これ以上はご容赦下さい。

5   名前: 匿名 : 2007/09/08(土) 18:12  ID:k58nPpF. sub-Cz
>>4
http://www.tagindex.com/cgi-lib/bbs/patio.cgi?mode=view2&f=146&no=209

6   名前: 匿名 : 2007/09/08(土) 18:12  ID:k58nPpF. sub-Cz
>>2 にちょっとだけ書いたが、XFrames 1.0 の書式を拝借するテスト。

・使い方
(1). 下記のスクリプトを外部ファイル(例えば xframes.js)として保存。
(2). 全てのページに、<script type="text/javascript" type="xframes.js"></script> を埋め込む。

準備は以上。ページ内の a 要素をクリックしたときに、URI に frames() スキームがあるものだけに反応します。それ以外に影響はありません。

・書き方
URI に #frames() を置き、カッコ中に「フレーム名=URI」をコンマ区切りで並べます。数は自由。
<a href="#frames(frame1=example1.html,frame2=example2.html,frame3=example3.html)">

上記では、名前が frame1 のフレームに example1.html、名前が frame2 のフレームに example2.html、名前が frame3 のフレームに example3.html を表示します。対象は frame 要素でも iframe 要素でも可。
<a target="frame1" href="alt.html#frames(frame1=example1.html,frame2=example2.html)">

上記のように書けば、何らかの理由でスクリプトが動作しないとき、frame1 のフレームに alt.html を表示します。スクリプトが動作するときは、target 属性と alt.html は無視されます。
alt.html#frames(frame1=example1.html#frames(iframe1=example2.html))

上記のように入れ子にすれば、フレーム frame1 を example1.html にし、さらにその中の iframe 要素 iframe1 内を example2.html にします。ただし、frames() の入れ子は 3 階層まで。

・注意点

本来の XFrames の挙動とは異なります。また、フレーム名が重複した場合の動作は保証しません(手抜き)。IE では URI の長さ制限に引っ掛かるかもしれない。非スクリプト環境への代替措置としてはイマイチですが(個人的には別の方法をとる)、ないよりはマシ。

<a onclick=".."> なら数行で済むものを長々と書いているわけですが、リンクデータを URI に持たせれば、言語にも環境にも依存しない。利用者がリンク先を確認できるというのもそれなりにメリットかも。
if (/*@cc_on @if (@_jscript) @_jscript_version > 5.5 @else@*/
    document.implementation &&
    document.implementation.hasFeature ('Events', '2.0') &&
    document.implementation.hasFeature ('HTML'  , '2.0')
    /*@end@*/)
(function () {
/************************************************************************/

function XFramesProcessor (evt) {
    arguments.callee.prototype.handleEvent (evt);
    return arguments.callee;
}

XFramesProcessor.prototype = {
    uriReference : /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/,
    associations : /([^=]+)=([^()]*(?:\([^()]*(?:\([^()]*\))?[^()]*\))?),?/g,
    pointerPart  : new RegExp ('(?:frames\\(' +
                                 '((?:[^()^]|(?:\\^\\()|(?:\\^\\))|(?:\\^\\^)|(?:\\(' +
                                   '(?:[^()^]|(?:\\^\\()|(?:\\^\\))|(?:\\^\\^)|(?:\\(' +
                                     '(?:[^()^]|(?:\\^\\()|(?:\\^\\))|(?:\\^\\^)|(?:\\(' +
                                       '(?:[^()^]|(?:\\^\\()|(?:\\^\\))|(?:\\^\\^)*)' +
                                     '\\)))*' +
                                   '\\)))*' +
                                 '\\)))*)' +
                               '\\))?', ''),
    handleEvent : function (evt) {
        this[evt.type].call (this, evt);
    },
    load : function (evt) {
        var data;
        /*@if (@_jscript) detachEvent ('on' + @else@*/
        removeEventListener (/*@end@*/ 'load', XFramesProcessor, false);
        if (data = this.check (location)) {
            this.parse (data);
        }
    },
    click : function (evt) {
        /*@if (@_jscript) var target = event.srcElement; @else@*/
        var target = evt.target; /*@end@*/
        var node, data;
        if (node = this.contains (target, 'A')) {
            if (data = this.check (node)) {
                this.parse (data);
                /*@if (@_jscript) event.returnValue = false; @else@*/
                evt.preventDefault (); /*@end@*/
            }
        }
    },
    contains : function (node, tagName) {
        do if (node.nodeName == tagName) break; while (node = node.parentNode);
        return node;
    },
    check : function (uri) {
        return this.pointerPart.exec (this.uriReference.exec (uri)[9])[1];
    },
    parse : function (data) {
        for (var d; d = this.associations.exec (data); ) {
            this.find (top.frames, decodeURIComponent (d[1]), decodeURIComponent (d[2]));
        }
    },
    find : function (frames, id, uri) {
        for (var i = 0, I = frames.length; i < I; i++) {
            if (frames[i].id == id || frames[i].name == id) {
                frames[i].location.href = uri;
            }
            if (frames[i].frames.length) {
                this.find (frames[i].frames, id, uri);
            }
        }
    }
};

/*@if (@_jscript)
attachEvent ('onload', XFramesProcessor);
document.attachEvent ('onclick', XFramesProcessor);
@else@*/
addEventListener ('load', XFramesProcessor, false);
document.addEventListener ('click', XFramesProcessor, false);
/*@end@*/

XFramesProcessor = null;

/************************************************************************/
} )();

7   名前: 匿名 : 2007/09/08(土) 18:12  ID:k58nPpF. sub-Cz
あー、XFramesProcessor = null; は削除の方向で。

一覧へ戻る