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

このエントリーをはてなブックマークに追加
952Name_Not_Found:04/12/22 20:23:54 ID:???
javascript:var str="";const code = "ア".charCodeAt(0);const length=5;for(var i=0;i<length;i++){str+="\"";for(var j=0;j<length;j++)str+=String.fromCharCode(((length+j-i)%length)*2+code);str+="\"\n";}alert(str);
953Name_Not_Found:04/12/23 01:10:58 ID:???
JavaScriptに「const」なんてあった?
954Name_Not_Found:04/12/23 01:21:33 ID:???
>>953 Netscape拡張な
955Name_Not_Found:04/12/23 06:27:52 ID:???
>>954
揚げ足取りだが"JavaScript"はNetscape/Mozilla.orgが策定したものだから
「Netscape拡張」という言い方はちょっと変じゃないか?

const自体はJavaScript 1.5から追加されたようだ。
ttp://www.mozilla-japan.org/js/js15.html
956Name_Not_Found:04/12/23 07:07:17 ID:???
わかったからさっさと代替案を出してくれ
957Name_Not_Found:04/12/23 13:15:58 ID:???
constの代わりにvarを使えばよかろう。
958Name_Not_Found:04/12/23 13:17:16 ID:???
つーか、952はvarにしたら、マジで動くな…
959Name_Not_Found:04/12/23 15:35:59 ID:???
CSSの切り替えスクリプトを使ってるんですが、Firefoxでたまに動作しなくなります。
JSコンソールを見たところ、
if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title")) {
if(a.getAttribute("rel").indexOf("style") != -1 && a.getAttribute("title") && !a.disabled) return a.getAttribute("title");
この二つの行でエラーが発生しているようです。
エラー内容が、a.getAttribute("rel") has no properties、とあるのですが、これはどう言う意味なのでしょうか?
どうすれば改善することが出来るか、どなたか宜しくお願いします。
960Name_Not_Found:04/12/23 16:05:06 ID:???
つまり、relがないからnullになってるんだろ。
961Name_Not_Found:04/12/23 16:08:25 ID:???
>>959
link 要素の rel 属性の存在を確かめていないから
rel 属性を取得(=null) になって、 null にプロパティなんてねーぞコラと怒られている。
if(a.getAttribute("rel") && a.getAttribute("rel").indexOf....
にしれ。
ていうかどこのスクリプトだ、それは……。
962Name_Not_Found:04/12/23 16:24:22 ID:???
>>960-961
仕様書読め。例えば、このページで
javascript:alert(document.body.getAttribute('lang'))
すると、空の文字列ではなく、null が返って来る。
DOM1-3 全ての勧告で、空文字列と定められているから、紛れも無いバグだな。

>>959
そのスクリプト自体が遠回りなやり方をとっていることにも問題が無いとは言えない。
StyleSheetList ではなく NodeList に問い合わせる意義は想像できない。
HTMLでlink要素に忘れずrel属性値を書くか、
'string' == typeof a.getAttribute("rel")
という条件を if の最初に挿入するか。
963Name_Not_Found:04/12/23 16:46:40 ID:???
良くありがちな質問だと思うのですが・・・

下記の関数を、

function WeekdayName(weekday)
{
wname = new Array(7);
wname[0] = "日";
wname[1] = "月";
wname[2] = "火";
wname[3] = "水";
wname[4] = "木";
wname[5] = "金";
wname[6] = "土";

wdname = this[weekday];
return wdname;
}

HTMLファイルの中に記述するとOKなのですが、
別ファイルにして、記述すると、
「終了していない文字列型の定数です。」
とエラーになります。
どうも"日"が悪いようで、これを"月"にしたりするとOKだったりします。
何がいけないのでしょうか?また回避策はあるのでしょうか?





964Name_Not_Found:04/12/23 17:01:00 ID:???
>>963
なぜ「良くありがち」と判断するのか、その根拠をうかが
おうか。このスレで未だかって出たことがないような気がする。
文字コード変換ツールで文字コードをJIS、SJIS、EUCの3通り
に変換してテストしてみれ。
965Name_Not_Found:04/12/23 17:12:45 ID:???
何で俺が仕様書を読まなくちゃいけないんだ?
mozillaはわざとDOMを無視してるんだし。
966Name_Not_Found:04/12/23 17:13:41 ID:???
967Name_Not_Found:04/12/23 17:14:42 ID:???
>>964
素直にユニコードでエスケープした方がいいと思うが。
968963:04/12/23 17:24:22 ID:???
>>964
「終了していない文字列型の定数です。」でぐぐったら沢山出てきました。

"月"はよくて"日"が駄目というのは、文字コードに関係する
ような気がしてブラウザのエンコードを見ると、
UTF-8になってました。

HTMLはShiftJisで作成しているつもりなので、不思議です。

>>967
ユニコードでエスケープする方法を教えてください。
969Name_Not_Found:04/12/23 17:54:32 ID:???
>>968
多分、JAVAのSDKに入ってるNative2Asciiが定番だとは思うが、
あまり素人にはお薦めできない。めんどいから。
escaped-unicodeを生成できるエディタはいくつかあるけど、
その気になれば、ローカルのjavascriptで生成することも可能。
とりあえず、"日"の代わりに"\u65e5"をいれておけば大丈夫でしょ。

//日月火水木金をescaped-unicodeにする方法
var str="日月火水木金土";var retval="";for(var i = 0;i<str.length;i++) retval+="\\u"+str.charCodeAt(i).toString(16); document.write(retval);

もちろん、生成する時に既に文字化けしてたら、どうしようもないが、
それはHTMLの中に書く方で何とか対処してくれ。
ちなみに答えは"\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f"

javascript: alert("\u65e5\u6708\u706b\u6c34\u6728\u91d1\u571f");
で確認できる。
970963:04/12/23 20:29:29 ID:???
>>969
ありがとうございます。

わかったことがあります。
現在作成しているページはhtmlではなく、aspxでした。
aspxの場合、ファイルをShiftJisで作成し、charsetをShiftJisに指定しても、
エンコードはUnicodeになるようです。

別ファイル(.js)をUnicodeで作成してみたらうまくいくようになりました。

色々とありがとうございました。


971Name_Not_Found:04/12/23 22:20:16 ID:0aIRJ8jJ
Another HTML-lintを使うと、onclick属性を使用するときはonkeypress属性も併用するように警告されますが
ボタンにonkeypressを追加した場合、Enterキーでボタンを押した場合onClickとonkeypressが同時に実行されてしまいます。
これに対処する(同時に2回実行されないようにする)にはどうしたらいいですか?
よろしくお願いします。
972Name_Not_Found:04/12/24 01:21:06 ID:???
>>971
同時ではない。順序は決まっているから、実験してみろ。

仮に、Enter キー を押した時の順序が、keypress → click ならば、
次のような処理になる。
var enterKeyPressed = false;
function foo (event) {
if (event.type == 'keypress') { if (event.keyCode == 13) { // Enter キー
enterKeyPressed = true;
bar( event);
setTimeout( 'enterKeyPressed = false', 100); // 本当に click イベントが発生しない UA への配慮
} } else if (enterKeyPressed) { // keypress に連続する click
enterKeyPressed = false;
} else { // click
bar( event);
}
}
function bar (event) { やりたい処理 }

重要なのは、アクセシビリティのために追記した HTML の onkeypress 属性を
無視しないよう工夫すること。要するに、foo 関数は
function foo (e) { if (e.type == 'click') { bar(); }}
と定義することも出来る ( keypress イベントを無視している) が、
それでは HTML の onkeypress 属性を書いた意味が無いだろう、ということ。
973Name_Not_Found:04/12/24 01:31:46 ID:???
>>972
> 本当に click イベントが発生しない UA への配慮
「本当に」を「連続して」に訂正。
974Name_Not_Found:04/12/24 08:35:15 ID:???
>>972
ブラウザによって順番が違う場合の配慮も必要じゃないの?
975Name_Not_Found:04/12/24 08:41:54 ID:???
976Name_Not_Found:04/12/24 13:26:14 ID:???
preventBubbleで泡の方を消せば万事解決。
977Name_Not_Found:04/12/24 16:45:02 ID:???
>>972-974
ありがとうございます。いろいろと試してみます。
978Name_Not_Found:04/12/25 06:13:14 ID:???
>>976
違う。
// しかもそれは Mozilla の独自拡張メソッド。
979Name_Not_Found:04/12/26 00:20:55 ID:???
フォームで、Undo/Redoボタンを付けたいのですが
document.undo()のような事って出来るのでしょうか?
検索したのですが、期待する資料は出てきませんでした。
出来ない場合、change毎にテキスト等を記憶し、呼び出す等しかないでしょうか。
もし、他に有効的な方法があれば教えてください。
980Name_Not_Found:04/12/26 01:35:55 ID:???
>>979
それがUndo/Redoのロジックだと思うょ
がんばって実装してみてね♪
981Name_Not_Found:04/12/26 21:12:27 ID:Nn+buiLi
JavaScriptを実装するとき、HTMLファイルのヘッダーには

<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Type" content="text/javascript; charset=Shift_JIS">

と2つ書く必要がありますか?
982Name_Not_Found:04/12/26 21:16:15 ID:???
>>981
Content-Script-Typeでしょ。それぞれ役割が違う
983981:04/12/26 21:25:57 ID:???
>>982
> Content-Script-Typeでしょ。

ぬほっ(;´Д`)
すっかり書き間違えてました。
出直してきます。
984Name_Not_Found:04/12/27 11:54:41 ID:???
>>981
charsetはいらない。
HTML中に記述するなら当然そのHTMLの文字コードと同じだし、
外部ファイルにするならcharset属性を使えばいいから。
985Name_Not_Found:04/12/28 07:31:26 ID:jWbTRZuv
たまに、ホームページのソースに

if(document.all){
}else if(document.getElementById){
}else if(document.layers){
}

というものがありますが、
これは何を目的に何を判別しているのですか?
986Name_Not_Found:04/12/28 07:51:55 ID:???
ブラウザの判別してると思う
987Name_Not_Found:04/12/28 17:53:36 ID:???
>>985
if に続く ( ) の内容で真偽を判定して、(真|偽)なら続くブロックは実行(される|されない)。
ttp://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/9_Type_Conversion.html#section-9.2
の規則が適用される。

例えば、document.layers は、
NN4 にとっては LayerArray オブジェクト、その他にとっては undefined だから、
規則に照合して真偽値に変換すると、NN4 では true、その他では false となる。

例えば、document.getElementById は、
DOM 云々を謳うブラウザにとっては function、その他にとっては undefined になる。
ttp://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma262r3/13_Function_Definition.html
の通り、J(ava)Script では、関数それ自体もオブジェクトだから、結果的に、
DOM 云々ブラウザでは true、その他では false に変換される。

注意すべきは、document.all で、次か次の次あたりの Firefox はこれを理解するだろうし、
Opera は IE モードだと理解する (理解するとは、少なくとも undefined では無いということ)。
988Name_Not_Found:04/12/28 18:00:39 ID:???
>>985
> 何を目的に何を判別しているのですか?
未知のメソッドを実行させてエラーメッセージが出てしまうのを防ぐのが目的。
document.all をオブジェクトとして理解していますか、
document.getElementById を関数として理解していますか、
document.layers をオブジェクトとして理解していますか、と問い掛けている。

>>987 からなんとなく分かってもらえると思うが、直接的なブラウザ判定ではないということ、
そして、使うメソッドやプロパティを理解するかどうかを問う方が近道だということ。
直接的なブラウザ判定なら、navigator.userAgent 辺りを見て、自己申告される
ユーザエージェントを信じることになる。クライアントサイドで自己申告される
ユーザエージェントは、HTTP リクエストヘッダに比べれば、ユーザに書き換えられ難いので、
全てのユーザエージェントを把握していて、それら全ての J(ava)Script 実装まで
把握できているというなら、有効な手段にならないわけでもない。が、そもそも、
多数のユーザエージェント全てを把握しようと努力すること自体がナンセンス。
結局、前記「近道」に辿り着くことになる。
989Name_Not_Found:04/12/28 18:22:22 ID:???
>>985
例えば、new Image と書きたいとする。ならばブラウザに、if (window.Image) と問えばよい。
例えば、document.images と書きたいとする。if (document.images) と問えばよい。
例えば、document.compatMode と書きたいとする。if (document.compatMode) と問えばよい。
ただし、String型のプロパティの場合は、その値に 'undefined' という文字列が現れない限り、
if ('CSS1Compat' == document.compatMode) と問う方が現実的。
例えば、if (document.implementation.hasFeature( 'Events', '2.0')) と書きたいとする。
if (document.implementation && document.implementation.hasFeature) {
if (document.implementation.hasFeature( 'Events', '2.0') { ... } } という感じになる。

実は、こういう面倒な記述は、(WinIE5 以上|Mozilla) では殆ど必要無い。
(HTC|XBL) を使うに限る。そもそも、これらは変数を隠蔽してくれるから、
それだけでも使わない手は無い。
990Name_Not_Found:04/12/29 03:27:50 ID:???
>>987
Firefoxがif (document.all) ...を真判定するようになることは多分ない。
しかしFirefoxはすでにdocument.all(id)といったオブジェクト取得法を実装している。
ttps://bugzilla.mozilla.org/show_bug.cgi?id=248549
991985:04/12/29 07:45:19 ID:2D4y5uzE
ありがとうございます。
992Name_Not_Found:04/12/29 20:07:13 ID:???
Oh!
993Name_Not_Found:04/12/30 18:31:59 ID:???
ume
994Name_Not_Found:04/12/30 18:34:45 ID:???
再度次スレを貼っておくか

+ JavaScript の質問用スレッド vol.33 +
http://pc5.2ch.net/test/read.cgi/hp/1103844975/
995Name_Not_Found:04/12/31 04:53:25 ID:???
ume
996Name_Not_Found:04/12/31 04:53:46 ID:???
sakura
997Name_Not_Found:04/12/31 04:54:01 ID:???
age
998Name_Not_Found:04/12/31 04:54:07 ID:???
matsu
999Name_Not_Found:04/12/31 04:54:27 ID:???
999
1000Name_Not_Found:04/12/31 04:54:48 ID:???
sen
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。