• ベストアンサー

6で割り切れる数を表示するJavaScriptでエラーが出ます。

こんにちは、片岡と言います。 私は、JavaScriptを今回初めて書きます。また、HTMLもよくわかりません。 ファイル(1)"continue.xhtml" を Firefox2 で実行すると、エラー(2) が出ます。 どうすれば、エラーが出なくなるのでしょうか。 原因または解決策をご存知の方はいらっしゃいませんか。 ●ファイル(1)"continue.xhtml" <?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title>continue</title> </head> <body> <script language="JavaScript" type="text/javascript"> <![CDATA[ var max = 100; for (var i = 1; i < max; i++) { if ((i % 6) != 0) { continue; } document.write(i, "<br>"); //ここでエラーがでます。 } ]]> </script> </body> </html> ●エラー(2) > エラー: uncaught exception: [Exception... "Object cannot be created in this context" > code: "9" nsresult: "0x80530009 (NS_ERROR_DOM_NOT_SUPPORTED_ERR)" > location: "file:///C:/continue.xhtml Line: 21"] また、Internet Explorer 6 で ファイル(1)"continue.xhtml" を実行すると、 webブラウザが終了します。 なお、"continue.xhtml"ファイルは、 JavaScriptプログラミング入門 第2版 ( http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=4-274-06660-6 ) の79ページの"continue.html"を参考にしました。 ●私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 webブラウザ: Firefox/2.0.0.3 , Internet Explorer 6.0

質問者が選んだベストアンサー

  • ベストアンサー
noname#30818
noname#30818
回答No.2

拡張子がxhtmlだからでは? 例えば <?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "​http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">​ <html xmlns="​http://www.w3.org/1999/xhtml"​ xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title>continue</title> </head> <body> <div> <script language="JavaScript" type="text/javascript"> <![CDATA[ var max = 100; for (var i = 1; i < max; i++) { if ((i % 6) != 0) { continue; } document.write(i, "<br>"); //ここでエラーがでます。 } ]]> </script> </div> </body> </html> とすると動くとか・・・ HTMLなら動くとか。 いろいろ考えられます。 サーバーが送るMIMEタイプが何か解りませんが、サーバーが送るMIMEタイプがapplication/xhtml+xmlならIE6は受け付けませんよ。 NS_ERROR_DOM_NOT_SUPPORTED_ERR ’DOM_NOT_SUPPORTED’が気になったので検索して見ました。 http://translate.google.com/translate?hl=ja&sl=en&u=http://www.thescripts.com/forum/thread515846.html&sa=X&oi=translate&resnum=1&ct=result&prev=/search%3Fq%3DNS_ERROR_DOM_NOT_SUPPORTED_ERR%26hl%3Dja%26rls%3DGGLG,GGLG:2006-05,GGLG:ja

noname#91531
質問者

お礼

k506d467 さん、回答ありがとうございます。 > サーバーが送るMIMEタイプが何か解りませんが、 > サーバーが送るMIMEタイプがapplication/xhtml+xmlならIE6は受け付けませんよ。 ご指摘通り、MIMEタイプは、application/xhtml+xmlでした。 私は、「Firefox2のエラー」と「IE6が終了する」の原因が同じだと思っていました。 拡張子をhtmlにすれば、IE6で終了しなくなりました。 また、Firefox2でも拡張子がhtmlであればエラーは出ませんでした。 それから、紹介していただいたwebページは、私の力では有効利用できませんでした。ごめんなさい。 k506d467 さん、ありがとうございます。

その他の回答 (4)

回答No.5

同じエラーは出ませんでしたが、 if(!!document.write){ document.write('hello'); }else{ alert('no write'); } とすると、'no write'のアラートが出ました。 環境は拡張子.xhtml、MIME Type application/xml、Win Fx2.0です。 MIME Typeをtext/hmtlにすると期待通り実行されるようですが、 > <![CDATA[ > ]]> この記述がスクリプトエラーになりますので、 XHTMLの文法上はエラーになりますが、ブラウザの実装上 <![CDATA[ と ]]> はない方がいいと思います。 IEではブラウザに設定されていない拡張子は表示出来ないようです。 (MIME Typeがtext/htmlになっていてもMIME Typeを無視して、ブラウザの設定を優先させるようです。xhtmlが登録されていなければ、表示出来ないかソースをそのまま表示します。) ので、拡張子は.htmlの方がいいのかも。。。 根本的な解決策ではありませんが、ご参考まで。 XHTMLなんて嫌いだヽ(`Д´)ノ

noname#91531
質問者

お礼

taloo さん回答ありがとうございます。 >if(!!document.write){ の記述は勉強になりました。 ところで、いろいろ調べたのですが、xhtmlでdocument.write()は使えないようです。 そのため、document.write()と同じ処理をしたければ、DOMを使用しなければいけないようです。 http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite >Does document.write work in XHTML? > >No. Because of the way XML is defined, it is not possible to do tricks like this, where markup is generated by scripting while the parser is still parsing the markup. >You can still achieve the same effects, but you have to do it by using the DOM to add and delete elements. ただ、私は英語がわからないので間違っているかもしれません。 <?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" /> <meta http-equiv="Content-Script-Type" content="text/javascript" /> <title>continue</title> </head> <body> <script language="JavaScript" type="text/javascript"> <![CDATA[ var max = 100; var i; for (i = 1; i < max; i++) { if ((i % 6) != 0) { continue; } // document.write(i, "<br>"); と同様のコード var txt = document.createTextNode(i); document.body.appendChild(txt); var br = document.createElement("br"); document.body.appendChild(br); // } ]]> </script> </body> </html> taloo さんありがとうございます。

  • KanjiTalk
  • ベストアンサー率30% (7/23)
回答No.4

質問には関係ありませんが、 わざわざmaxを宣言せずに、 for (i=0; i<100; i++) {}; みたいにリテラルを使った方が早いかな。

noname#91531
質問者

お礼

KanjiTalk さん、回答ありがとうございます。 ご指摘どおり、提示されたコードの方がシンプルだと思います。 参考になりました。 KanjiTalk さん、ありがとうございます。

noname#79209
noname#79209
回答No.3

直接の回答ではありませんが、 6で割り切れない場合は何もしないようですので、 iに1づつ足すのではなく、 var addNum = 6; var i = addnNum; var maxNum = 100; while(i <= maxNum ) { document.write(i, "<br>"); i = i + addNum; } の方が宜しいかと... エラーも起きない可能性が大きいです。

noname#91531
質問者

お礼

vizzar さん、回答ありがとうございます。 提示されたコードを参考にしてみます。 vizzar さん、ありがとうございます。

noname#39970
noname#39970
回答No.1

iがスコープ外(forの中で宣言されている) よって var i; for(i = 1;i < max; i++) が目的の動作をすると思うけど?

noname#91531
質問者

お礼

SAYKA さん、回答ありがとうございます。 次のhtmlファイルを私の環境で実行してみました。 しかし、IE6とFirefox2で問題はありませんでした。 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>scopetest</title> <!-- Create: 2007-04-08T22:03:51+9:00 --> <!-- Last update: 2007-04-08T22:14:01+9:00 --> </head> <body> <script language="JavaScript" type="text/javascript"> <!-- for (var i = 0; i < 2; i++) { window.alert(i); } var j; for (j = 3; j < 5; j++) { window.alert(j); } //--> </script> </body> </html> ただ、他の環境ではエラーが出るかもしれません。 JavaScriptのスコープについて、私は、よくわかっていませんでした。 勉強しなおします。 SAYKA さん、ありがとうございます。