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

このエントリーをはてなブックマークに追加
584Name_Not_Found:2007/02/10(土) 22:34:56 ID:???
どうせIE + application/xhtml+xmlがらみでしょ。
サーバが返すMIMEタイプを変えられない環境なら.htmlでいいじゃん。
間違いじゃないし。
585Name_Not_Found:2007/02/10(土) 22:36:55 ID:???
どっかで単にXHTMLに反することやってる気ガス
firebugあたり使ったら挙動がおかしくなってる点でエラー読めたりしないかい。
586Name_Not_Found:2007/02/10(土) 22:38:58 ID:7Popa41S
>>584

いちおう、Mac OS X Tiger+Safari&Firfoxで、開発してるんです。
拡張子は、やっぱりHTMLの方が良いですかね?
587Name_Not_Found:2007/02/10(土) 23:11:00 ID:???
>>586
現象が再現する最低限のソースを出せや
588Name_Not_Found:2007/02/10(土) 23:15:29 ID:7Popa41S
>>587 へいっ!
<script src="scripts/prototype.js" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
function loadDataFile(fName)
{
new Ajax.Request(fName, { method: 'get', onComplete: displayData });
}
function displayData(httpObj)
{
$("outputarea").innerHTML = httpObj.responseText;
}
//]]>
</script>

こんな感じっす。<div id="outputarea"></div>の間に出力するということです。
589Name_Not_Found:2007/02/10(土) 23:17:42 ID:???
あんたはアメリカ人か
590Name_Not_Found:2007/02/10(土) 23:19:27 ID:7Popa41S
>>589
どういうこと?
591565:2007/02/10(土) 23:23:07 ID:???
>>565>>567>>579の続きなんですが、
「鉛筆」が文章中に複数ある場合、必ず1個目のほうが
選択状態になりますよね?

2個目以降は選択できないんでしょうか。

調べたら、findTextのオプションの引数で指定できるようなのですが、
findText('鉛筆',1)でも
findText('鉛筆',2)でも両方1個目が選択されます。
環境はXPのIE6です。
592Name_Not_Found:2007/02/11(日) 01:45:00 ID:???
>>591
findTextの第2引数の意味が分かってんのかね。referenceを読め。
とりあえず込み入った方法で選択したいのならtextareaの内容を
まず調べてどの位置を選択するか決め、moveで位置決めして
moveEndで範囲の後ろを調整し最後にselectするとかかな。
まあがんばって。referenceのありかはテンプレにあるだろ。
593Name_Not_Found:2007/02/11(日) 02:02:15 ID:V978gkxf
prototype.jsを始めてみようと思い、
http://www.prototypejs.org/よりダウンロードしたものを
使っているのですが、
簡単なソースファイルを書き、FireFox + FireBugsを使って様子を見てみると、
次のようなエラーがでて、うまく動きません。
>>illegal character (prototype.js line 1)

一方、IE6で試してみたところ、とくに問題なく動きました。

私は、prototype.js自体に問題があると考えているのですが、
ソースファイルを見てみたところ、特に問題があるとは思えません。
どなたか原因・解決法をご存知の方がいらっしゃれば、教えてください。
594565:2007/02/11(日) 03:00:50 ID:???
>>592
第二引数は検索の方向ですか・・orz
英語のリファレンス見てたので早とちりしてしまいました。
何とかやってみます。
595Name_Not_Found:2007/02/11(日) 03:54:35 ID:???
>>593
もし文字エンコードの相違が原因であれば、HTMLのSCRIPT要素のCHARSET属性を明記すれば解決する。
596Name_Not_Found:2007/02/11(日) 05:09:10 ID:HwFCKy8g
>>560

createRangeを使えば簡単だと思ってるやバカが多いみたいだけどIEじゃ結構面倒。
面倒だから教えないけど。
597Name_Not_Found:2007/02/11(日) 09:54:14 ID:5jaI0ZdV
質問【オンマウスでリンク画像(文字)が跳ねるようにしたい】
↓これでは駄目だった
<HEAD>
<link rel="stylesheet" href="style.css" type="text/css">
<SCRIPT LANGUAGE="JScript" type="text/jscript" charset="shift_jis" src="jmplink.js">
</SCRIPT>
</HEAD>
<BODY onLoad="jmplink();">
<a href="" target=_blank onfocus="this.blur()"></a>
598Name_Not_Found:2007/02/11(日) 10:25:10 ID:???
>>596
それで >>501 は自分とこでは動作するんだけど他の人のとこ
ではだめなのでしょうか…
>>597
そのJSの中身を公開せずに質問に答えられるESPなんかいない。
帰れ。
599Name_Not_Found:2007/02/11(日) 11:34:18 ID:???
>>595さん
解決しました。ありがとうございました。
600Name_Not_Found:2007/02/11(日) 12:11:52 ID:???
ツリー形式のメニューを作りたいのでツリー型のオブジェクトを作り、
再帰呼び出しで表示しようとしたのですが、全部の項目が表示されません。
データはキチンと格納されているようなので、再帰呼び出し処理にバグが
あると思いますが、余計な処理を削ぎ落として極力シンプルにしてエラーを
見つけやすくしても、どこにもおかしな所が見付けられませんでした。

<html><head><script language="javascript">
function MenuData(text,href) {
this.text = text;
this.href = href;
this.children = new Array();
this.addChild = function(text,href) {
length = this.children.length;
this.children[length] = new MenuData(text,href);
return this.children[length];
};
}

Cmd = new Array();
Cmd[0] = new MenuData('項目0','menu0.htm');
Cmd[1] = new MenuData('項目1','menu1.htm');
Cmd[2] = Cmd[0].addChild('項目00','menu00.htm');
Cmd[3] = Cmd[0].addChild('項目01','menu01.htm');
Cmd[4] = Cmd[1].addChild('項目10','menu10.htm');
Cmd[5] = Cmd[1].addChild('項目11','menu11.htm');
Cmd[6] = Cmd[2].addChild('項目000','menu000.htm');
Cmd[7] = Cmd[2].addChild('項目001','menu001.htm');
Cmd[8] = Cmd[3].addChild('項目010','menu010.htm');
Cmd[9] = Cmd[3].addChild('項目011','menu011.htm');
601Name_Not_Found:2007/02/11(日) 12:12:54 ID:???
Cmd[10] = Cmd[4].addChild('項目100','menu100.htm');
Cmd[11] = Cmd[4].addChild('項目101','menu101.htm');
Cmd[12] = Cmd[5].addChild('項目110','menu110.htm');
Cmd[13] = Cmd[5].addChild('項目111','menu111.htm');
Menu = new Array(Cmd[0],Cmd[1]);

function List(Nodes, depth) {
for(i=0;i<Nodes.length;i++) {
buff = "";
for(j=0;j<depth;j++)buff = buff + '■';
buff = buff + Nodes[i].text + '<br>';
document.write(buff);
if(Nodes[i].children.length > 0)List(Nodes[i].children, depth+1);
}
}
</script>
</head>
<body>
<span>
(関数による再帰呼び出し表示)<br>
<script language="javascript">
List(Menu, 0);
</script>
</span>
<hr>
602600-601:2007/02/11(日) 12:15:16 ID:???
<span>
(非再帰呼び出し表示)<br>
<script language="javascript">
buff = "";
for(i=0;i<Menu.length;i++) {
buff = buff + Menu[i].text + '<br>';
for(j=0;j<Menu[i].children.length;j++) {
buff = buff + '□' + Menu[i].children[j].text + '<br>';
for(k=0;k<Menu[i].children[j].children.length;k++) {
buff = buff + '□□' + Menu[i].children[j].children[k].text + '<br>';
}
}
}
document.write(buff);
</script>
</span>
</body>
</html>

どこかおかしな点が見付けられる人がいたら、知恵を借りたいと思います。
自分の頭ではこれが限界です。お願いします。
603Name_Not_Found:2007/02/11(日) 12:45:06 ID:???
内容みてないけど
変数全部グローバルだね
604Name_Not_Found:2007/02/11(日) 13:34:32 ID:???
グローバル化社会ですから。
605Name_Not_Found:2007/02/11(日) 13:48:18 ID:???
>>603
関数の外で宣言しなくてもグローバル変数扱いになるんですね。
関数の中で宣言したら、ローカル変数になりました。
メニューもキチンと表示されます。

ありがとうございました。
606Name_Not_Found:2007/02/11(日) 14:15:54 ID:7MPwvs99
質問です。
Div要素に、アルファチャンネル付きPNG画像を表示させているんですが
フィルタを使用したくなって、適用してみると、アルファチャンネルが透けなくなってしまいました。。。

どちらも使うのは無理なのでしょうか?
607Name_Not_Found:2007/02/11(日) 17:39:24 ID:hU8PO4pZ
恥ずかしい質問ですがご容赦を。
いつもDWで作業してますが、手打ちはソースを確認するくらいです。
そして今DWがなくて違う場所にいます。
そしてどうしても解決したい機能がありまして質問させていただきます。
1)ブログの過去記事が増えてきて、ジャンプメニューでさっとアクセスできるようにしたい。
2)「バックナンバー」というリンクを押したら別窓で小さなリスト一覧が出る。
3)そこで特定の記事を選ぶと、メインの窓でその記事が表示される。
その小さな窓の中でなら表示はすぐ出来るのですがメイン画面に表示させる術を知らないのです。
ターゲットとかbody IDなどは分かってきたのですが実際に組むとなると頓挫してしまいました。
head内に書くjavascript内になにか指定をしたりするのでしょうか?
手取り足取りお願いすることになっていますがどうかよろしくお願いいたします。
608Name_Not_Found:2007/02/11(日) 18:07:35 ID:???
window.opener
609Name_Not_Found:2007/02/11(日) 18:09:02 ID:???
>>607
window.opener.location.href = 行き先URL;
610607:2007/02/11(日) 20:59:06 ID:???
>>608-609
感謝です。
こういうのがあったとは…勉強不足でした。
そして勉強になりました。
ありがとうございました。
611Name_Not_Found:2007/02/12(月) 02:43:27 ID:???
HPをアップロードした再に
検索中のページは、アクセス時に無効なメソッド (HTTP 動詞) が使われたため、表示できません。

と表示される箇所があったのですが
具体的にどのような不具合な箇所があるのでしょうか?
612Name_Not_Found:2007/02/12(月) 03:04:58 ID:???
>>611
初心者スレへ。
613Name_Not_Found:2007/02/12(月) 06:39:12 ID:???
>>611
どこがJavaScriptと関係あると判断したんだね?
614611:2007/02/12(月) 10:45:56 ID:???
javascriptで作ったページだったのでこちらで
聞いてみました。
初心者スレで聞いてみます。
615Name_Not_Found:2007/02/12(月) 11:27:59 ID:???
>>614
次に来る時は「エラーが出る最小限のソース」を作って貼るようにね。
それができないならここで質問しないでくれ。
616Name_Not_Found:2007/02/12(月) 16:02:42 ID:???
var textareas = document.getElementsByTagName('textarea');

みたいにinput type の text だけ取得できる?


・・・、 の が()にみえて変な感じ。
617Name_Not_Found:2007/02/12(月) 16:23:29 ID:???
もうちょっとわかりやすく質問してくれ
618Name_Not_Found:2007/02/12(月) 16:32:45 ID:???
目的は

<input type="text" value="" name="" />

っていうのだけを取得することなんだけど、
var hoge = document.getElementsByTagName('input');

しかできないのかな、

<input type="button" value="" name="" />
まで取得しちゃうのが悩ましくて。

if ( this.getAttribute("type") == "text")
で試したけれども、数が多いと表示に時間がかかってしまう。うーん
なんかもっとシンプルにしたい!というところで挫折中。
619Name_Not_Found:2007/02/12(月) 16:39:14 ID:???
>>616
できません。どっちかというとtype="button"を使うかわりに
<button>...</button>を使えばいいんでないの?
620Name_Not_Found:2007/02/12(月) 16:46:10 ID:???
>>619
ありがとう〜 無理だったか。

<button>、そのとおりなのだけど、
既存サイトなもので書き換えができないのよ〜。

getAttributeより早そうな他の手段を考えてみるわー
621Name_Not_Found:2007/02/12(月) 18:18:56 ID:???
誰の目にもDOM-XPathの使い所じゃないか。
しかし、DOM-HTMLでtypeプロパティを条件にグレップしても全然遅くないけどな。
622Name_Not_Found:2007/02/12(月) 19:21:35 ID:???
遅くないなら結構なことだな。
623Name_Not_Found:2007/02/12(月) 23:14:27 ID:???
>>621 なるほど、Geckoで動くね。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>???</title>
<script type="text/javascript">
function test() {
var r, x, a = [];
if(document.evaluate) {
r = document.evaluate('//input[@type="text"]', document, null, 0, null);
while(x = r.iterateNext()) { a.push(x); }
for(var i = 0; i < a.length; ++i) { a[i].value = 'X'; }
}
}
</script>
</head><body>
<form action="#" onsubmit="return false"><div>
<input name="b0" type="button" value="Test" onclick="test()">
<input name="t0" type="text">
<input name="b1" type="button" value="Test"><input name="t1" type="text">
<input name="b2" type="button" value="Test"><input name="t2" type="text">
</div></form></body></html>
624Name_Not_Found:2007/02/12(月) 23:39:12 ID:???
>>623
そういう風に使うならXPathResultをスナップショット系にするようにすれば
whileで配列に入れなくてもよくなるよ
あとXPath式を相対パスにしてコンテキストノードをdocument.bodyに絞ってevaluateした方が速い
625Name_Not_Found:2007/02/13(火) 00:35:24 ID:cdRia9UT
javascript:if("AB".match(/(.*?)*?B/)){alert(RegExp.lastMatch);}
これページに埋め込むとFirefoxではクラッシュ。IEではメモリ使いまくりで大変なことになりますね。

(Firefoxでは1.5.0.3で修正されてますhttps://bugzilla.mozilla.org/show_bug.cgi?id=330352 )
626Name_Not_Found:2007/02/13(火) 01:12:11 ID:???
(相対パス) && (コンテキストノード) // >>624が指摘済み
&&
( <input> も <input type="text"> も、DOM-HTML の type プロパティが "text" )

==> 'descendant::*[(local-name()="INPUT" or local-name()="input") and (not(@type) or @type="text")]'
627Name_Not_Found:2007/02/13(火) 01:31:03 ID:???
擬似的に画面内にウィンドウを表示するようなフレームワークが
あったと思うんですが名前をど忘れしてしました

英語のサイトだったと思うんですが・・優しい人だれか教えてくだちい
628620:2007/02/13(火) 01:55:11 ID:???
>>627
LightBox系かな?
http://fortysomething.ca/mt/etc/archives/005400.php
とかにまとまってたよ

>>626
それだとtype=text取得できる?・・・げっ、難しくて読めないけどぐぐって調べてみる
629627:2007/02/13(火) 02:23:06 ID:???
>>628
ビンゴです!ありがとう!

今見たんですがlightboxは画像だけなんですね
LITBoxでエロいことしてみよう・・・
630Name_Not_Found:2007/02/13(火) 03:05:08 ID:???
>>626
要素名が大文字かそうじゃないか(text/htmlかapplication/xhtml+xmlか)はXPath式の外で判定した方が
無駄がなくなるんじゃないかな
判定方法はルート要素が大文字かどうか調べるのでもdocument.xmlVersionの有無でも
Gecko拡張のdocument.contentTypeでも何でもいいけど

var n = document.documentElement.localName;
var input = (n != n.toUpperCase()) ? "input" : "INPUT";
var expr = 'descendant::*[local-name()="'+input+'"][not(@type) or @type="text"]';
631Name_Not_Found:2007/02/13(火) 04:37:05 ID:???
>>630
// [... and ...] を JS に訳す。
Array.filter(document.body.getElementsByTagName('*'),
             function (e) {return e.localName == input && e.type == 'text';});// (!e.getAttribute('type') || e.getAttribute('type') == 'text')
// [...][...] を JS に訳す。
Array.filter(document.body.getElementsByTagName('*'),
             function (e) {return e.localName == input;})
     .filter(function (e) {return e.type == 'text';});// (!e.getAttribute('type') || e.getAttribute('type') == 'text')

* HTMLInputElement のリスト作成と保持、
* HTMLInputElement の個数分のループ増分、
のせいで、変数 input を作って省いた無駄が帳消しされる。

結局、微小な無駄を省くための無駄な努力を本気でやるなら、
IF (text/html) {
  IF (HTML) descendant::INPUT[...];
  ELSE IF (html) descendant::input[...];
} ELSE {
  descendant::*[... and ...];
}
のような分岐を JS で書くことになるかな。
632630:2007/02/13(火) 08:04:41 ID:???
>>631
すごい勉強になった。ありがとう
これだけちゃんと知ってる人が居るんなら自分ももっと質問しようかな
633Name_Not_Found
JSで、rubyのString#scan()に相当するものはありますか。
input = ".....";
while (m = input.scan(/(¥w+)=(¥d+|¥w+.¥w+)/)) {
...
}
のようなかんじで、つづけてマッチングさせたいんです。