+ JavaScript の質問用スレッド vol.48 +

このエントリーをはてなブックマークに追加
933Name_Not_Found:2006/06/28(水) 16:24:53 ID:???
【ツリーメニュー】
root
├menu1
│├sub1
│├sub2
│└sub3
└menu2
  ├sub1
  ├sub2
  └sub3

【折りたたみメニュー】
┌───┐ ┌───┐
│ menu1 | │ menu2 |
├───┤ ├───┤
│ sub1 | │ sub1 |
│ sub2 | │ sub2 |
│ sub3 | │ sub3 |
└───┘ └───┘
934Name_Not_Found:2006/06/28(水) 16:57:41 ID:???
ツリーメニューと言うのは、正にその名の通り「釣り」メニューな訳よ
煽って、スカして、釣り上げる
その場を荒らして行くだけなんだよね
おりたたみってのはその逆で、荒れた場を折り畳むように治める訳だ
自分で釣って治める、おりたたみツリーメニューってのもあるからチェックしとけ
935Name_Not_Found:2006/06/28(水) 17:42:05 ID:???
座蒲団全部取れ。
936Name_Not_Found:2006/06/28(水) 18:05:40 ID:???
釣だな。天気もいいし。
937Name_Not_Found:2006/06/28(水) 21:36:06 ID:lPUbHOu+
Firefoxで、

function subjectFunction(event){
 alert('subject');
}

function proxyFunction(event){
 alert('proxy');
 this.removeEventListener('mouseover',proxyFunction,false);
 this.addEventListener('mouseover',subjectFunction,false);
 this.dispatchEvent(event);
}

//<span id="foo">test</span>
var el = document.getElementById('foo');
el.addEventListener('mouseover',proxyFunction,false);

が動かないのはなんで?
Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIDOMEventTarget.dispatchEvent]"
ってエラーが出る。
938Name_Not_Found:2006/06/29(木) 00:35:27 ID:Zg7tXSff
外部JavaScriptの呼び出し元の情報をしらべるのって
どうすればよいのでしょうか?

hoge.js
-----------
var id = ???????????;
alert(id+"から呼び出されました");
-----------

本文中
-----------
<head>
・・・
<script src="hoge.js" type="text/javascript" id="AAA"></script> --> 「AAAから呼び出されました。」
<script src="hoge.js" type="text/javascript" id="BBB"></script> --> 「BBBから呼び出されました。」
・・・
</head>
-----------
というのができるのかな?と。
939Name_Not_Found:2006/06/29(木) 01:04:45 ID:???
どっちもhoge.jsから呼んでおいて、AAAからかBBBからかなんて分かるはず
ないじゃん
940Name_Not_Found:2006/06/29(木) 01:45:17 ID:???
>>938
ホイ

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title>呼び出し元のscript要素を識別</title>
<script id="AAA" type="text/javascript" src="identify-caller.js"></script>
<script id="BBB" type="text/javascript" src="identify-caller.js"></script>
</head>
<body>
<script id="CCC" type="text/javascript" src="identify-caller.js"></script>
<script id="DDD" type="text/javascript" src="identify-caller.js"></script>
</body>
</html>

//identify-caller.js
var scripts = document.getElementsByTagName("script");
var id = scripts[scripts.length - 1].getAttribute("id");
alert(id + "\u304b\u3089\u547c\u3073\u51fa\u3055\u308c\u307e\u3057\u305f");

IE 6、Opera 8.5では期待通り。
ただしFirefox 1.5ではhead要素内のscript要素がうまく取得できない。
(「AAA」「AAA」「CCC」「DDD」と表示される)
またFirefox 1.5ではXMLとして読み込ませるとうまくいかない。
(「AAA」「AAA」「AAA」「AAA」と表示される)
941Name_Not_Found:2006/06/29(木) 02:32:02 ID:???
>>940
IEでも稀に上手く動かず、次のIDを拾うことがあるみたいです
BBB BBB CCC DDD
942940:2006/06/29(木) 03:29:23 ID:???
別版

// identify-caller.js

function getLastElementOfType(tagName, refNode)
{
  if (!(tagName instanceof RegExp))
    tagName = new RegExp("^" + tagName + "$", "i");
  refNode = refNode || document;
  for (var i = refNode.childNodes.length; i--;) {
    var child = refNode.childNodes[i];
    if (child.nodeType != 1) continue;
    if (tagName.test(child.tagName)) return child;
    var descendant = getLastElementOfType(tagName, child);
    if (descendant) return descendant;
  }
  return null;
}

alert("Called from " + getLastElementOfType("script").getAttribute("id"));

手元(WinXP)で試した限りではIE 6 SP2 (HTML)、Firefox 1.5.0.4 (HTML/XML)、Opera 8.54 (HTML)、Opera 9.00 (HTML/XML)でうまくいった。
(Opera 8.54でXMLとして読み込ませると「DDD」「DDD」「DDD」「DDD」となった)
ただ>>941の報告もあることだし確実に取得するのは無理だと思う。
943Name_Not_Found:2006/06/29(木) 08:04:02 ID:???
document.body.innerHTMLでも解析した方が確実じゃね?

新スレは975超えたら。テンプレの変更予定なし。
944938:2006/06/29(木) 08:24:58 ID:Zg7tXSff
>940,941さんありがとうございました。
外部JavaScriptの動的ロードとくみあわせるとおもしろいかなとおもいました。

headじゃなくてbodyにいれると動作も安定しそうですね。
---------------
var gHandle;
function setEventQue(url,callback)
var dt = (new Date()).getTime();
var scriptEle = document.createElement('script');
scriptEle.charset = 'SHIFT_JIS';
scriptEle.src = url;
scriptEle.id = dt;
gHandle[dt] = handle;
document.body.appendChild(scriptEle);
}
function onComplete(data,id) {
var mFunction = gHandle[id];
mFunction(data);
}
function getLastElementOfType(tagName, refNode) {
・・・
}
---------------
foge.js
--------------
var id = getLastElementOfType("script").getAttribute("id");
onComplete('データ',id);
--------------
連続で同じデータを使ってAJAX風にしても、別の関数を割り付けられそう。
945Name_Not_Found:2006/06/29(木) 11:41:07 ID:???
JavaScriptって実装の違いが大きすぎて、
ちゃんと理解してる人ってほとんどいないんじゃないか
と最近、思えてきた。
例えば、HTML領域内にあるインラインフレームの
大きさを調べるためにはW3CのDOMとIEの構文で
以下のようにプロパティへのアクセス方法が違うらしい。
Document.body.scrollHeight;
contentDocument.body.offsetHeight;
でも、私のみた限り、こういう構文の違いがある事を
ちゃんと説明してて、どの構文がどのブラウザに対応してるか
説明したサイトが、まったくといっていいほど見当たらない。
どうなってるんだ・・・
946Name_Not_Found:2006/06/29(木) 11:55:14 ID:???
>>945
あんたが知らないだけだろ。そんなの常識もいいところだ。
947Name_Not_Found:2006/06/29(木) 12:02:31 ID:???
>>946
そうなんですか、何か勉強になるサイトや書籍をお教え願えませんか?
自分はイベントモデルの違い程度までは分かりますが、それ以外の実装の
違いを調べたくても良いリファレンスがなくて困ってます
948Name_Not_Found:2006/06/29(木) 12:20:32 ID:???
949Name_Not_Found:2006/06/29(木) 12:49:15 ID:???
だいたいMSとGecko押えれば残りはだいたいどっちか
に合わせてるんだからその2つのサイトだけでいいんでは。
これらのreferenceはテンプレにあるよな。
950Name_Not_Found:2006/06/29(木) 13:29:30 ID:???
ttp://www.quirksmode.org/index.html
へんなとこや不足してる情報もあるがとりあえずここ。
あとはクロスブラウザとかcross browserとかでぐぐれ。

まぁとことん調べつつ自分用クロスブラウザライブラリ持っとけ。
951Name_Not_Found:2006/06/29(木) 14:09:12 ID:???
>>949
ありがとうございます。
面倒でもやっぱりそうするしかないんですね。
2つずつみなきゃいけないのは、けっこう大変ですよね。

>>950
ありがとうございます。
そのサイトかなり詳しそうですね。
英語のなので時間がかかるかもしれませんが、じっくり読んでみます。

952Name_Not_Found:2006/06/29(木) 15:20:47 ID:???
>>951
洩れはまず標準準拠でやってみて、駄目だったときに駄目な
ブラウザのreferenceを見るようにしてる。意外と駄目なこと
は少ないという印象。
953Name_Not_Found:2006/06/29(木) 16:09:26 ID:???
NN4対応時代のことを考えれば、DOMによってかなり楽になった。いかんのは
あいかわらずM$IEの独自仕様だ。この協調性のない企業、何とかならんのか。
954Name_Not_Found:2006/06/29(木) 16:53:16 ID:???
IE7 できっと丸く収まりますよ! ・・・きっと・・・
955Name_Not_Found:2006/06/29(木) 17:10:21 ID:???
IE6までのシェアが十分減るのに10年掛かるんでは。今だって
IE5とか完全に現役だよな。
956Name_Not_Found:2006/06/29(木) 18:01:49 ID:???
> IE5とか完全に現役

え?
957Name_Not_Found:2006/06/29(木) 18:17:10 ID:???
NN4とIE4を参考に後付の仕様を勝手に決めたのがW3C。
むしろ、IE4用に書いた8年前のスクリプトがIE7ベータでも動くのは驚異の企業努力だろう。
958Name_Not_Found:2006/06/29(木) 18:22:44 ID:???
OSでもたまに思うけど、MSの下位互換に対する執念はすさまじいよな。
959Name_Not_Found:2006/06/29(木) 18:42:39 ID:???
無理やりケツを上げようとしても誰も上げないから、
新機能だけで引っ張り上げてる感じだな。

一方地デジは(ry
960Name_Not_Found:2006/06/29(木) 18:46:30 ID:???
鉛筆を使った
961Name_Not_Found:2006/06/29(木) 18:51:25 ID:???
Appleの下位切り捨ての容赦の無さも凄まじいよな。
962Name_Not_Found:2006/06/29(木) 19:00:58 ID:???
ワロタ
963Name_Not_Found:2006/06/29(木) 22:23:48 ID:rW+1HTK3
非常に困っていることがあります。
Googleアドセンスで表示したくないジャンルの広告があるのですが、
(Googleの提供するURLフィルタリングでは対応できない範囲)
javascript使用してキーワードでフィルタリングするのは実現可能ですか?
iframeの中のテキストなのでどうかな?と思ってるんですが
964Name_Not_Found:2006/06/29(木) 22:34:32 ID:???
>>963
この場合 iframe 内は必然的に別ドメインになるのでその方法は無理

ブラウザが
ペアレンタルコントロール機能か user js 機能を持っていれば
何とかなるかも

もしくはプロクシ系でオミトロンとか
965Name_Not_Found:2006/06/29(木) 23:27:56 ID:???
>>956
これによると、「今月のデータで」IE5系はMozよりもOperaよりもずっと多い。
ttp://www.w3schools.com/browsers/browsers_stats.asp
喪前ほんとにWeb製作板の住民か?意識低すぎだろ。おお2ちゃんらしい煽り。
966Name_Not_Found:2006/06/29(木) 23:29:34 ID:???
次スレは975超えたら。テンプレの変更はない予定。
967Name_Not_Found:2006/06/29(木) 23:34:10 ID:???
あるHTMLがサーバ上に出現するまで、
しつこくリロードするコードがほしい。

while(1)
{
win=window.open( URL );
if win.status == OK then break;
else
sleep 1sec
}

こんな風。
具体的にはどうやろう。
open した Window のステータスってどうやってとるの?

968Name_Not_Found:2006/06/29(木) 23:46:28 ID:???
xmlhttp
969Name_Not_Found:2006/06/29(木) 23:46:40 ID:???
なにその迷惑スクリプト
田代砲?
970Name_Not_Found:2006/06/29(木) 23:51:35 ID:???
ちがうよーん。
ある種の更新チェッカーみたいなの。
当然、sleep 1 じゃなくて、sleep 60 とかにする。
で、window.open したウインドウが、404かどうかって、
どうやって親ウィンドウが知るわけ?
971Name_Not_Found:2006/06/30(金) 00:08:53 ID:???
つーか、よく考えたら、refresh tag + frame でもOKな気がするが、
いまやったら、404 ならジャンプせず戻ってくる、ということができないんだよな。。。

なんとかならないですかね。
とにかく、404ならやり直し、とかできればいいんですよ。
972Name_Not_Found:2006/06/30(金) 00:24:25 ID:???
>>971
XMLHttpRequestを使えば問題なくできるよ。その勉強をしろ。
それでおしまい。勉強をしたくない場合、勉強しない奴には
これ以上言うことがない(帰れというしかない)からやっぱりおしまい。
973Name_Not_Found:2006/06/30(金) 00:31:03 ID:???
>>971
更新チェックはサーバーサイドでやれば良い。
Ajaxが盛り上がったからって、わざわざJavaScriptを使う必要はない。
非効率的だと思う。
974Name_Not_Found:2006/06/30(金) 00:35:59 ID:???
>>973
いや、サーバサイドでやったって更新されたときブラウザ画面が
更新できないでしょ。サーバの負荷に応じてチェック間隔を調整
してあれば別にいいんじゃないかな。
>>971
ところで別鯖をチェックしようとしてないだろうね。別鯖
だったらどうさか立ちしても無理だからね。
975Name_Not_Found:2006/06/30(金) 00:45:45 ID:???
>>972
一行目だけで十分なのになんでだらだら書くの?
976Name_Not_Found:2006/06/30(金) 00:48:51 ID:???
>>975
問題は便利さよりも、不便さ。
サーバー、クライアント両者にとってリクエストを一定間隔で行うのは無駄すぎる。
第一、更新したときに人がちょうどページにアクセスしている可能性は少ない。
そのためにJavaScriptを使うよりも、CGIからHTMLでも生成しとけば十分だし確実。
977976:2006/06/30(金) 00:49:38 ID:???
訂正:975へじゃないな、974へのレスだった。
978Name_Not_Found:2006/06/30(金) 00:58:26 ID:???
更新チェッカーならわざわざJavaScriptでやらずにperlあたりでやったらよくね?
979Name_Not_Found:2006/06/30(金) 01:00:44 ID:???
げげ…洩れのプロバでスレ立てらんないな。誰か頼むよ。
980Name_Not_Found:2006/06/30(金) 02:05:36 ID:???
971の人気に嫉妬
981Name_Not_Found:2006/06/30(金) 03:55:42 ID:???
だいたい更新チェッカーって何?
982Name_Not_Found
田(ry