ページ全体にonmouseoverを適用したい

[新着] Webテンプレートを仮オープンしました



0   名前: じゅん : 2007/01/16(火) 20:51  ID:REVXC8Bu
onmouseoverのスクリプトを使って、ページ全体のリンクに触れた時、ステータスバーに文字を表示させたいのですが、どうすればよいのでしょうか?
ええと、書き下手なので簡単に説明すると、ページからのリンク先を隠したいという事です。
ステータスバーに文字を表示させなくても、リンク先のアドレスが隠せればいいのですが、どうすればよいのでしょうか?

1   名前: 匿名 : 2007/01/16(火) 20:51  ID:Rt.j/.AI
Gecko、Safari、Opera 用。

// if (document.implementation.hasFeature ('Events', '2.0'))

document.addEventListener ('mouseover', function (e) {
    if (e.target.nodeName == 'A') e.preventDefault ();
}, true);

2   名前: じゅん : 2007/01/16(火) 20:51  ID:REVXC8Bu
えと、出来ればIE対応のタグを教えてください。

3   名前: ふじゅん : 2007/01/16(火) 20:51  ID:98JsZSta
リンク先を隠すの反対です。
何をたくらんでいるの?
見せてはいけないもの?


4   名前: 匿名 : 2007/01/16(火) 20:51  ID:Rt.j/.AI
>>2
タグなんて >>1 に含まれてないし、タグを必要とする問題ではないはずだが、いったい何の話をしているの?


> IE対応

ほとんど単純な置き換え作業だ。以下の[ ]内を埋めよ(ヒント:attachEvent、srcElement、returnValue)。

document.[    ] ('onmouseover', function (e) {
    if (event.[    ].nodeName == 'A') event.[    ] = [    ];
} );


まず自分で書いてみて、うまくいかなければそのコードを見せてほしい。>>3 が言うように、そう気軽に使われても困る代物だから、ちゃんと意味を理解した上で使ってくれ。

5   名前: 匿名 : 2007/01/16(火) 20:51  ID:Rt.j/.AI
余談だが、「ページ全体に onmouseover を適用」というスレ主の発想は、とても大切だと思う。

個別のタグにイベント属性を書く習慣から脱しきれない現状では、以下のように書く人が多いかもしれない。

onload = function () {
    for (var nodes = document.links, i = 0, I = nodes.length; i < I; i++) {
        nodes[i].onmouseover = function () { return false; };
    }
};


だが MouseEvent(および KeyboardEvent)の大部分は、祖先ノードに登録すれば事足りる。特に、mouseover と mouseout は互いのショートカットに過ぎない(cf. relatedTarget、formElement/toElement)ので、どちらか一方を登録すれば十分な場合が多い。

だから、スレ主の発想は間違っていない。何とか頑張ってみてくれ。

6   名前: じゅん : 2007/01/16(火) 20:51  ID:REVXC8Bu
返信ありがとうございます。
ただ、マウスオーバーを適用させる方法は難しいと判断したので、以下の方法を用いる事にしました。

<SCRIPT LANGUAGE="JavaScript">
<!--
msg0="適当に文字入力OR空欄";
msg=msg0;
function s_bar(){
setTimeout("bar",0);
msg=msg.substring(2,msg.length)+msg.substring(0,2);
window.status=msg;
}
//-->
</SCRIPT>

<SCRIPT LANGUAGE="JavaScript">
<!--
s_bar();
//-->
</SCRIPT>

これはステータスバーに文字を流すスクリプトなので、これを使えば理論上はリンク先を防げるのではないかなぁと思ったわけです。
ですが、実際にやってみたところ、何故か文字が流れません。どこか間違えてるでしょうか?

>>2
僕は、とあるサイトを運営していて、ZIPでファイルを配信しています。
そこで、ファイルのURLが分かってしまうと、誰かのサイトで直リンで配信されかねない…と思って、リンク先を隠そうとしてます。
勿論、右クリックは無効化してありますので、あとはステータスバーが見えなくなれば、とりあえずの対策にはなるかなぁと。
(ページ保存されてタグ見られたりしたら無意味ですけど)

7   名前: 匿名 : 2007/01/16(火) 20:51  ID:Rt.j/.AI
>>6
下手に「対策」を練るよりは、何もしない方が、かえって気付かれにくいということもある。いわゆる直接リンクをする人は、サーバ側で対処しない限り、どんな対策をしたってする。直接リンクをする人には効果がなく、直接リンクしない人に不便を強いるようなら、考え直した方が良いと思うよ。

まあとにかく。ちなみに >>5 はそのまま使える。でも、ページ内で他にスクリプトを使っているのなら以下のようにした方が良いかもしれない。

if (document.addEventListener)
    document.addEventListener ('mouseover', function (e) {
            if (e.target.nodeName == 'A') e.preventDefault ();
        }, true);

else if (document.attachEvent)
    document.attachEvent ('onmouseover', function () {
            if (e.srcElement.nodeName == 'A') event.returnValue = true;
        } );

else
    onload = function () {
        for (var nodes = document.links, i = 0, I = nodes.length; i < I; i++) {
            nodes[i].onmouseover = function () { return false; };
        }
    };


unload 時にイベントリスナを削除を削除した方が良いかもしれないが、略。

8   名前: 匿名 : 2007/01/16(火) 20:51  ID:Rt.j/.AI
今思い出したけど、Safari(1.x-2.0)の preventDefault() はウソ実装だったっけ。

……まあ、>>5 をそのまま使ってくれ。


>>6
> どこか間違えてるでしょうか?

> setTimeout("bar",0);

よく確認してみるべし。あと、0 は止めた方が良いかもしれない。

なお、いまどきのブラウザには、ステータスバーに余計な変更を加えられないようにするオプションがあることを追記しておく。

9   名前: じゅん : 2007/01/16(火) 20:51  ID:REVXC8Bu
ありがとうございます。
>>5のを使う事にしました。

あと、結局右クリック無効は消しました。
つかってて自分でも不愉快だったので・・・

一覧へ戻る