簡単な、カウンタクラスからのインスタンス作成とその利用のテストを行いました。
テストとして作成した以下の内容のファイルをブラウザ(IEやFireFox)で開くと、期待した結果は返りますが、(Windowsで処理待ちを示す)砂時計マークがいつまで経っても消えません。
どこかで永続ループでもしているのでしょうか。
どこに問題があるのか、また、こういった問題のデバッグのコツを教えて下さい。
よろしくお願いします。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
<HEAD>
<TITLE>教えて!goo</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<META HTTP-EQUIV="Content-Script-Type" CONTENT="javascript">
<SCRIPT TYPE="text/javascript">
function Counter(initialCount) {
this.count = initialCount;
}
Counter.prototype = {
count : 0,
increment : function() {
this.count += 1;
},
decrement : function() {
this.count -= 1;
}
}
Counter.newInstance = function(initialCount) {
return new Counter(initialCount);
}
var counter;
function testCounter() {
counter = Counter.newInstance(100);
counter.increment();
document.write(counter.count);
}
</SCRIPT>
</HEAD>
<BODY ONLOAD="testCounter()">
</BODY>
</HTML>
No.1ベストアンサー
- 回答日時:
writeで書き込んだ後はcloseしてください。
あ、そんな単純な事だったんですね。。
flushメソッドがないものだから、てっきりそういう概念がjavascriptに存在しないのかと思っていました。
失礼しました。
そしてありがとうございました。
No.2
- 回答日時:
ロード後にdocument.writeを使用されていますが、それは適切ではありません。
(ロード中にdocument.writeをするのであればいい。)ちなみに、document.writeを使う際には、
document.open()
document.write()
document.close()
という流れが基本です。
openとcloseはロード中に必要だったかどうかはよく知らないが。
(個人的にwriteは使わないので…)
あなたのソースではロード後なので、document.closeがないために砂時計が表示されたままとなってしまいます。(IEでは砂時計は出ません。)
もし、ロード後にページ内にテキストを表示させたいのであれば
* = document.getElementById()
*.appendChild( document.createTextNode( ** ) )
を使うべきです。( *.innerHTML でも可 )
ちなみに、newInstanceメソッドは必要なんでしょうか?
素直に
counter = new Counter( 100 );
でいいように思えます。
さらに、increment, decrement を用意しているってことは、なるべく変数countはprivateで扱いたいってことですよね。
(publicなら、すなおに counter.count ++; でいいはず。)
もしprivate扱いなら、countを取得するようなメソッドを用意するべきでしょう。
また、counterはグローバルで使う予定ですか?
グローバルでなければ関数冒頭にvar宣言させましょう。
----------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang='ja'>
<head>
<title>教えて!goo</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script type="text/javascript">
( function ( Counter )
{
// onload
//@cc_on
window./*@if (@_jscript) attachEvent( 'on'+ @else@*/ addEventListener( /*@end@*/ 'load', function ()
{
var counter = new Counter( 100 ); // インスタンス作成
counter.increment();
// 表示
var objDiv = document.getElementById( 'id-div' );
objDiv.appendChild( document.createTextNode( ''+counter.get() ) );
// destroy
counter = objDiv = null;
}, false );
} )(
( function ()
{
function Counter ( initialCount )
{
this.count = initialCount;
// destroy
initialCount = null;
}
Counter.prototype = {
count : 0,
increment : function() { return ++ this.count; },
decrement : function() { return -- this.count; },
get : function() { return this.count; }
}
return Counter;
} )()
);
</script>
</head>
<body>
<div id='id-div'></div>
</body>
</html>
----------------------------------------------------------------
注:
[1]全角スペース使用
[2]特殊な書き方をしているのは、私自身の勉強のためでもあります。
こんな書き方もあるよーっていうだけで他意はないです。
なるほど、ページのロード前にopen処理を行い、ロードしたページを実際にブラウザに出力するときにwrite、そしてロードが終わったらcloseと、1つのロードでopenとcloseが1セットのみというのが理想なんですね。
document.close();
document.write("なんたら");
この記述でも動いてしまうので、どうしても甘えが出てきてしまいます。
あと、ページ中に何かを挿入する際には、ai10さんのようにDOM操作を行って入れたり、あとはinnerHTML等で入れたりするほうが、挿入位置等も明確で、スマートだと思います。参考にさせて頂きます。
一番の発見が、マクロみたいな書き方です。
/*@if (@_jscript)
これは、もしもjscript(IE)ならということですね。
attachEventは、通常複数の条件式を付けなければいけないと思っていましたが、こんな書き方で短くできたんですね。
あと、newInstanceというメソッドを作成したりしていたのは、私は普段Javaを使っているので、そのデザインを使えるかなと模索していたためです。
模索中に今回の不具合が出たので、デザインに問題があるのかと思って、そのまま載せました(結果はclose忘れでしたが・・)。
javascript始めて短いので、今後の参考になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- PHP PHPでCookieを使った訪問回数について 1 2023/05/28 14:10
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- JavaScript GoogleChart 階層ごとのブロックの長さを個別に設定したい 1 2022/07/06 14:27
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/30 09:10
- PHP PHPのエラーの解消法について教えて下さい。 1 2023/02/06 10:48
- HTML・CSS 下にスクロールしても、追従するボタンのコードを書いたのですが、ボタンの中の画像が半分しか表示されない 1 2022/04/16 21:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
window.openでタイトル名の指定
-
○歳△ヶ月と×日を計算してくれる...
-
文字列を点滅させたい
-
parseIntで戻り値がNaNになるの...
-
javaで画像をランダム表示しつ...
-
javaScriptのコードの修正をお...
-
文字を一文字ずつ表示
-
同じIDで定義した要素の配列を...
-
JavaScript window.openで開く...
-
google apps scriptの終了のさせ方
-
C#テキストボックスの文字を配...
-
idを使わずにonclickで自身の要...
-
ASP+アクセスでのSQLコメントに...
-
【Jquery】changeイベント毎にa...
-
<a>タグのテキストを取得
-
onclick指定関数の引数へローカ...
-
【正規表現】【javascript】CR...
-
DOM要素を削除しても、イベント...
-
javascriptで文字挿入でtoggle...
-
ActiveXobjectが作成できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
window.openでタイトル名の指定
-
ホームページに日付を自動更新...
-
○歳△ヶ月と×日を計算してくれる...
-
今日の月と日付の1週間後や3日...
-
文字列を点滅させたい
-
なぜ、ジャバスクリプトが表示...
-
iframe内に特定の文字列がある...
-
テキストボックスに入力された...
-
JS、document.write出力位置設定
-
自動ポップアップで画像を表示...
-
ジャバスクリプトで空白(スペー...
-
innerHTMLにて設定した情報を再...
-
document.open()の意味とは
-
document.writeで画面が消える
-
document.clear()の使い方について
-
ウェブ上にキーボードを作りた...
-
Java Scriptのメソッドについて
-
「分」単位で加算(減算)したい。
-
java カレンダーの日付指定で...
-
現在の日付から、1ヶ月前にす...
おすすめ情報