2016-11-29 19 views
0

私たちはgithubで戦艦ゲームを構築しています。 ページがロードされた後にのみjavascriptプロンプトが表示されます

ここで、ユーザーは船の名前と位置を入力し、答えに基づいて、domsoleというテキストエリアに出力を表示します。

Domsole = (function($) { 
var output; 

var init = function(outname) { 
    output = $('#'+outname); 
    output.attr('disabled', 'disabled'); 
}; 

var ask = function(question) { 
    write(question); 
    var text = prompt(question); 
    write('> ' + text); 
    return text; 
}; 

var write = function(text) { 
    output.append(text + "\n"); 
    output.scrollTop(9999999999); 
}; 

return { 
    ask: ask, 
    init: init, 
    write: write 
}; 
})(jQuery); 

$(document).ready(function() { 
    Domsole.init('domsole_out'); 
}); 

ただし、ページが読み込まれる前にすべてのプロンプトが表示されます。

プロンプトの一部は

this.name = Domsole.ask("What's your name, Playa?"); 

    Domsole.write("Alright, " + this.name + " you shall be."); 
........ 
...... 
     var coord = Domsole.ask("Where would you like to take a shot? Valid input is: x, y"); 

Domsole.writeとDomsole.askがdocument.readyでもある呼び出すこれらのコードをしています。 何かが画面に表示される前に、すべてのプロンプトが表示されますか?この問題を解決するには?

+0

あなたが提供したコードの2番目のスニペットは、ask/writeメソッドを呼び出すことがドキュメントの準備ができていないと言っていますか? @paris_serviola – Taplar

+0

呼び出し/書き込みメソッドであるコードも、ドキュメントの準備ができています –

+0

window.onloadを使用します。この質問への回答を参照してください。http://stackoverflow.com/questions/21742867/jquery-ready-vs-window-onload#21742922 – david25272

答えて

1
  • 最初にすべてのあなたのHTMLロードするようにそれは、bodyの終わりに、あなたのJSのスクリプトタグを置くのは良い習慣です。
  • ブラウザエンジンは、ドキュメントに表示されている順序でHTMLとJSをロードしますが、そのロードオーダーの所有権を取得することをお勧めします。 1つの可能なイベントの順番は:
    • domsole.jsです。
    • battleship.jsがロードされています。
    • index.html準備完了イベント。
    • ゲームはここから始まります。

ませんJSコードは、その最後のステップの前に実行している必要があります。プロンプトがその時点より前に呼び出されていないことを確認してください。

+0

スクリプトの読み込み順序を制御する唯一の方法は、文字通りスクリプトタグを追加し、おそらくそれらを削除することですその後、定義された順序でjavascriptから。 HTTP 2.0では、複数のドキュメントを同時に読み込むことができます。これは、この「トリック」が将来のブラウザで動作することが保証されていないことを意味します。 –

0

アプリケーションの実行フローがわからないようです。あなたが言及していないinit関数をもう一度呼び出さない限り、ページがロードされる前にこれらの質問が表示される可能性はありません。出力変数はinitメソッドが呼び出されるまで未定義になり、initが呼び出される前にaskが呼び出された場合にjavascriptエラーが発生します。 「レンダリング」に「読み込み中」と間違っているようです。コードの実行前にページのレンダリングが完了したことを確認したい場合は、初期化関数を呼び出すために約50msのタイムアウトを使用する必要があります。 jqueryのreadyイベントでトリガされたページの変更は、イベント処理が完了するまで表示されません。 readyイベントハンドラ内でsetTimeout関数を呼び出すと、readyイベントハンドラのレンダリングが完了するまで処理を遅らせることができます。

関連する問題