2016-11-29 60 views
0

我们正在github上构建一个战舰游戏。 Battleship已在页面加载后显示javascript提示

在这里提示用户,他的名字和他的船的位置,并根据答案,输出显示在一个叫做domsole的textarea上。

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

那么你是说你提供的第二个snipplet代码是调用ask/write方法不在文档里面吗? @paris_serviola – Taplar

+0

调用ask/write方法的代码也在文档准备好了 –

+0

使用window.onload。看到这个问题的答案http://stackoverflow.com/questions/21742867/jquery-ready-vs-window-onload#21742922 – david25272

回答

1
  • 将您的JS脚本标记放在body的末尾,以便您首先加载所有HTML是个好习惯。
  • 浏览器引擎按照它们在文档中出现的顺序加载HTML和JS,但最好取得该加载顺序的所有权。一个可能的事件顺序是:
    • domsole.js已加载。
    • battleship.js已加载。
    • index.html文档准备好的事件。
    • 游戏从这里开始。

没有JS代码应该是最后一步之前已经执行。因此,请确保您的提示在此之前未被调用。

+0

控制脚本加载顺序的唯一方法是从字面上添加脚本标记,并可能删除它们之后从JavaScript以预定义的顺序。 HTTP 2.0允许同时加载多个文档,这意味着这种“技巧”不能保证在未来的浏览器中工作。 –

0

看来你不明白你的应用程序的执行流程。在页面加载之前,没有任何可能的方式显示这些问题,除非您有另一个对init函数的调用,您还没有提到。在调用init方法之前,输出变量将是未定义的,因此如果在调用init之前调用ask,则会导致javascript错误。似乎你错误地“加载”“渲染”。如果您希望确保在执行代码之前已完成页面渲染,则应使用大约50ms的超时来调用初始化函数。在事件处理完成之前,对jQuery的就绪事件中触发的页面所做的任何修改都不会显示。通过在ready事件处理程序中调用setTimeout函数,您可以延迟处理,直到完成ready事件处理程序的呈现。

相关问题