みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2007-04-04 20:22:26

QNo.2894318

暇なときに回答ください

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

拡張子が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

投稿日時 - 2007-04-04 22:30:56

お礼

k506d467 さん、回答ありがとうございます。
> サーバーが送るMIMEタイプが何か解りませんが、
> サーバーが送るMIMEタイプがapplication/xhtml+xmlならIE6は受け付けませんよ。
ご指摘通り、MIMEタイプは、application/xhtml+xmlでした。
私は、「Firefox2のエラー」と「IE6が終了する」の原因が同じだと思っていました。

拡張子をhtmlにすれば、IE6で終了しなくなりました。
また、Firefox2でも拡張子がhtmlであればエラーは出ませんでした。

それから、紹介していただいたwebページは、私の力では有効利用できませんでした。ごめんなさい。
k506d467 さん、ありがとうございます。

投稿日時 - 2007-04-09 21:58:33

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.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なんて嫌いだヽ(`Д´)ノ

投稿日時 - 2007-04-06 23:05:04

お礼

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 さんありがとうございます。

投稿日時 - 2007-04-09 22:12:12

ANo.4

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

投稿日時 - 2007-04-05 15:48:57

お礼

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

投稿日時 - 2007-04-09 22:03:13

ANo.3

直接の回答ではありませんが、
6で割り切れない場合は何もしないようですので、
iに1づつ足すのではなく、

var addNum = 6;
var i = addnNum;
var maxNum = 100;
while(i <= maxNum ) {
document.write(i, "<br>");
i = i + addNum;
}
の方が宜しいかと...
エラーも起きない可能性が大きいです。

投稿日時 - 2007-04-05 11:37:39

お礼

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

投稿日時 - 2007-04-09 22:00:37

ANo.1

iがスコープ外(forの中で宣言されている)
よって

var i;
for(i = 1;i < max; i++)

が目的の動作をすると思うけど?

投稿日時 - 2007-04-04 21:03:55

お礼

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 さん、ありがとうございます。

投稿日時 - 2007-04-09 21:52:33

あなたにオススメの質問