WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:ABBRをACRONYMに替える

0:[投稿] キャット [2002/10/15 00:50 ][環境:WIN+IE わからない]

皆様、お忙しいところすみません。
ACRONYMという単語はどこか違和感があるので、IEの為とはいえ、使いたくないんですが、CGIとかが許可されなくて困っています。
JSとかVBSで可能でしょうか?可能なのなら教えてください。


1:[回答] 平野 敬 [MAIL] [URL] [2002/10/15 07:34 ]

http://www.akatsukinishisu.net/itazuragaki/?copying_javascript

私としては、頭文字語を頭文字語としてマークアップするのに何ら躊躇すべきことはないと思っていますが。


2:[完了] キャット [2002/10/16 00:27 ]

ありがとうございます。できました。わたしが知らないだけで、簡単に出来るんですね。
頭文字語じゃないのをACRONYMとするのは躊躇する、という意味でした。勘違いしていらっしゃったんだったらごめんなさい。


3:[質問] キャット [2002/10/16 02:02 ]

すみません、再度質問します。
実際に組み込んでみると、エラーが出ました。
原因は、処理を高速化するために、前もって、(オブジェクト).(プロパティ)を変数に格納しているから、という程度のことは分かったんですが、これをやめるのは、すじ違いだと思うので、どうにかならないかと。
分かる方いらっしゃったら、お願いします。


4:[回答] 北村 [MAIL] [URL] [2002/10/16 06:39 ]

実際にどのようなHTML+スクリプトの組み合わせでエラーとなったのか、提示して頂けると有難いです。
# エラーになる状況があるなら知っておきたいので……


5:[回答] ma-to [2002/10/16 21:05 ]


>>3
>>4

//ドキュメント「オブジェクト」モデル
//ですからエラーが出て当たり前です。

想像されるエラーを IE 5.5 で再現してみる。

    <body>
        <p>aaa<abbr title="BaBiBu">bbb</abbr><a href="./">ccc</a></p>
    </body>

    onload=function(){
        var a=document.links[0];
        alert(a.currentStyle.color);
        件の変換処理がここに入る
        alert(a.currentStyle.color);
    }

こういうこと (曖昧な言い方) でしょ、多分。

未知の要素オブジェクトの名前を変えて認識され得るものにするのだから、未知の要素オブジェクトへの参照を使うこと (根本的なエラー回避) は出来ない。つまり根本的に不可能というよりも徒な錬金術。しかし個々のケースでエラーを回避することは不可能でもない。

どう回避するにせよ、件の処理は可能な限り早い時期に行われなければならない。body 終了タグ直前まで script 要素が出現していないという条件で、その位置に script 要素を書いて件の処理を最初に実行させるというのが完全な回避策になる (非笑)。
因みに、>>1 から辿ることの出来るリンク先のオケケイ OB さんのページでは全ての最後に件の処理が行われているので再利用性無し (笑)。

/*
私にはマックを利用できる環境が既に無いので、以下は Windows 限定、という但し書き。
厳密には HTML 4 での html 文書、という但し書き。
[ http://msdn.microsoft.com/workshop/author/dhtml/reference/collections/all.asp [
If the document contains invalid or unknown tags, the collection includes one element object for each. Unlike valid end tags, unknown end tags are represented by their own element objects.]]
という前知識。
*/

* 最も簡単な方法

件の処理を含むコードでは参照を一々取得する。これは当然の方法であるから、「すじ違い」とは言えない。


* かなりまっとうな方法

    function unknown2known_MSIE($unknown, $known, $section){
        var
            $u=$unknown.toUpperCase(),
            $e='\/'+$u;

        if(document.getElementsByTagName($e).length==0)
            return;

        var
            $k=$known.toUpperCase(),
            $_0=new RegExp($u),
            unknowns=$section?
                $section.getElementsByTagName($u):
                document.getElementsByTagName($u);

        function replaceUnknown(){
            var
                _0=unknowns[0],
                known=document.createElement(_0.outerHTML.replace($_0, $k)),
                p=_0.parentNode;

            p.replaceChild(known, _0);

            while(known.nextSibling.nodeName!=$e){
                known.nextSibling.nodeName==$u&&replaceUnknown();
                known.appendChild(p.replaceChild(known, known.nextSibling));
            }

            p.removeChild(known.nextSibling);
        }

        while(unknowns.length)
            replaceUnknown();
    }

    // 使い方
    if(typeof document.getElementsByTagName!='undefined')
        unknown2known_MSIE('ABBR', 'ACRONYM', document.body);


* まっとうな方法

今手元に IE 6 がないので後述の懸念を払拭できない。よって要点だけを書いてみる。
「かなりまっとうな方法」を変更。
IE 6 に限り、
    document.createElement($k)
とする。この新たな参照に、もとからあった Attr への参照を取ってきて与える。
この分岐に際して処理の高速化を図らなければならなくなるはず。replaceUnknown 内のローカル変数が使えなくなるから、
    this.replaceUnknown=function ..
等としなければならなくなる。
従って使い方は、
    if ..
        new unknown2known_MSIE ..
ということになる。ただし、もしかしたらこの方法における再帰処理はスタックに積まれない場合があるのでは、という懸念がないわけではない。出来の悪い頭の中だけでは分からない。


/*
どんな方法を採用しようとも、上記前知識 MSIE 独自の未知要素処理方法に起因するエラーは仕方ない。
*/


6:[完了] キャット [2002/10/17 22:14 ]

ありがとうございました、出来ました。
確かに、前の投稿で知ったinnerHTMLから、innerTextというのを知って、使ってました。
ポインタが別のものになる、ということでしょうか。


7:[完了] ma-to [2002/10/19 01:12 ]


また間違えた。これは訂正せずに放置してはいけない類だなあ、面倒くさい。

「まっとうな方法」では、getAttributeNode が参照を返すことを前提にしていたが、そもそもこれはあり得ない。従って、「かなりまっとうな方法」で完成していたことになる。

このことに気付くまでを参考までに書いてみる。

信じていたまっとうな方法はスラスラと書けた。

    function replaceUnknown(){
        var
            ..
            known=replaceUnknown.createKnown(_0),
        ..
    }

    replaceUnknown.createKnown=unknowns[0].getAttributeNode?
        function(_0){
            var
                known=document.createElement($k),
                a=_0.attributes,
                p;
            for(p in a)
                if(a[p].specified)
                    known.setAttributeNode(_0.getAttributeNode(p));
            return known;
        }:
        function(_0){
            return document.createElement(_0.outerHTML.replace($_0, $k));
        };

という風に。ここで参照かどうかをチェックしてみたが、そうではなかった。もし参照で渡したらどうなるかを考えた結果、そうしない方が都合よいことが分かった。再度仕様書を読む。なるほどそう読める。。。
つまるところ、〜AttributeNode メソッドは xml では使う機会がなくはない (IE の場合は代替手段があったように思うが記憶は不確か) が、html では使う機会はないと断言出来そうだ。従って html では、setAttribute、setAttributeNode、mergeAttribute などなどどれを使おうかと悩む必要は無いということになる。特に MSIE で createElement するときにはヴェンダー推奨の独自の実引数渡し方
    document.createElement('<a name="INDEX" href="index">');
というものがあるから Attr 関係を扱う機会はさらに少なくなると考えられる。


>>6

// 呟きが納得なのか疑問なのか判断しかねる。

喩えでごまかす。
部屋を改装するのに家を潰して新築するのは豪快だがしかし、ということ。この場合はヴェンダー独自の未知要素処理方法のせいで部屋割りまで変わってしまうがこれに起因するトラブルはどうしようもないということ。

極端を例示。

    <p id="P">..</p>

    P.innerHTML=P.innerHTML;

としても見た目に何の変化もないが処理前後で P 下のオブジェクトは豪快に異なる。それでエラーが起こらない場合が大多数であるというのが実際なのであろうが、しかしそれはそれで問題だ (非笑)。


8:[完了] 北村 [MAIL] [2002/10/20 14:23 ]

>>5
>>7
ma-toさん、詳しい解説ありがとうございます。
といっても今の自分にはかなり高度な話で、理解できたとはとてもいえないのですが、今後の勉強の参考にしたいと思います。


9:[回答] ma-to [2002/10/21 10:03 ]


>>8

今後の勉強 ? DOM とか JDOM とか ?
JavaScript は楽しい遊びでしょ。www では有害なだけですし、一銭にもならないのだから。

    http://user.ecc.u-tokyo.ac.jp/~t10521/ecmascript/
    http://user.ecc.u-tokyo.ac.jp/~t10521/ecmascript/tutorial/Pointer.html

読み物
    http://www.samag.com/documents/s=1274/sam05010002/
    見出し What Is An Object Value? の部分


10:[完了] ma-to [2002/10/21 10:04 ]

 


11:[完了] JTR [2002/10/21 10:18 ]

>JavaScript は楽しい遊びでしょ。www では有害なだけですし、一銭にもならないのだから。
いやー、同感でーす!


12:[完了] andi [2002/10/21 10:46 ]

フォームの入力チェック程度(勿論サーバ側でも行なう)には使えますし、
必ずしも「www では有害なだけですし、一銭にもならないのだから」と言われるとJavaScriptが可愛そうかも。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World