我为这个模糊的问题道歉,但我不知道如何更好地描述正在发生的事情。
我正在开发一个到目前为止严格用 js 编码的网络应用程序(还没有服务器端代码)。我正在使用 HTML 5 画布绘制一种布局图,其中包含点击事件、颜色编码和对象选择等。
我正在开发它以严格与 Firefox 一起使用(我正在使用 moz 特定的 css 东西和我必须使用的 IE 版本不支持的存储。)
今天在我的项目上工作时,我开始遇到奇怪的行为。加载网页时会出现一些内容(按钮、div 等),然后 Firefox 会弹出一个对话框,说明“Firefox 已停止工作”并询问我是否要“在线检查解决方案并关闭程序”或只需“关闭程序”。以下是在“更多详细信息”窗格中:
> Problem signature: Problem Event Name: APPCRASH Application
> Name: firefox.exe Application Version: 17.0.4.4814 Application
> Timestamp: 5138e84f Fault Module Name: mozjs.dll Fault Module
> Version: 0.0.0.0 Fault Module Timestamp: 5138d295 Exception
> Code: c0000005 Exception Offset: 0002171f OS
> Version: 6.1.7601.2.1.0.256.4 Locale ID: 1033 Additional
> Information 1: 0a9e Additional Information
> 2: 0a9e372d3b4ad19135b953a78882e789 Additional Information 3: 0a9e
> Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
>
> Read our privacy statement online:
> http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409
If the online privacy statement is not available, please read our privacy statement offline:
C:\Windows\system32\en-US\erofflps.txt
我在我的代码中添加了一些警告语句,并将问题追溯到某个代码块。但是,如果我单步执行该块(在 for 循环的每次迭代中放置一条警告语句),代码将按预期执行,并且 Firefox 不会崩溃。Firebug 也没有发现代码有任何问题。如果我取消警报,那么突然 Firefox 又会窒息。
如果我打破这部分代码并通过单击按钮运行它,那么代码也会正确执行,但是我的用户必须单击按钮才能使其工作是不切实际的。
我需要帮助找出我应该尝试将问题归零。
一些可能(我不知道)相关的事情:
我正在从大约 12 个不同的 xml 文档中加载数据,一个有 600KB 大,其余的大约 20KB。
我还导入了 15 个不同的 js 库——我可以减少这个数量,但是这些文件的功能在逻辑上被分解了,所以如果我必须将它们连接在一起,开发起来会有点困难。
我没有使用 jQuery 或 MooTools 或任何其他类似的库。
关于如何解决正在发生的事情的任何想法?
编辑:
这是它死掉的函数的代码。我没有发布实际代码的原因是,正如我所说,代码本身在不与页面的其余代码一起运行时可以正确执行。不过,如果它有帮助,它就在这里。
function GetSeatPaths(Seats){
// fills the SeatPath, ArmrestPath and SimpleSeatPath for the seat instance (used for cango drawing)
for (var i =0; i<Seats.length; i++){
var ThisSeat = Seats[i];
var SeatPath = ThisSeat.SeatPath;
//alert("SeatCollection.prototype.GetSeatPaths: " + i);
if (typeof(SeatPath) === "undefined" || SeatPath == null){
var Column = ThisSeat.Column;
var Dims = ThisSeat.Dims;
if (Column != "Left"){
BL = -1;
} else {
BL = 1;
}
var SeatRad = 2;
try{
var seat_pax = parseInt(Dims.Seat_PAX);
} catch(err){
var seat_pax = 3;
}
if (isNaN(seat_pax)){
var seat_pax = 3;
}
//Make an armrest and cushion set var SeatRad = 2; //this is the radius of the seat cushions
//alert("getSeatPaths");
var CTS = 2.25;
var TAR = 16;
var CRP = 16.2;
var BA = 18;
var FOA = -2;
var SBT2 = 23.2;
var ACO = 45;
if (Dims.hasOwnProperty('CTS')){
CTS = parseFloat(Dims.CTS.Value);
}
if (Dims.hasOwnProperty('TAR')){
TAR = parseFloat(Dims.TAR.Value);
}
if (Dims.hasOwnProperty('CRP')){
CRP = parseFloat(Dims.CRP.Value);
}
if (Dims.hasOwnProperty('BA')){
BA = parseFloat(Dims.BA.Value);
}
if (Dims.hasOwnProperty('FOA')){
FOA = parseFloat(Dims.FOA.Value);
}
if (Dims.hasOwnProperty('SBT2')){
SBT2 = parseFloat(Dims.SBT2.Value);
}
if (Dims.hasOwnProperty('ACO')){
ACO = parseFloat(Dims.ACO.Value);
}
SeatGeometryArr = [];
ArmrestGeometryArr = [];
var SeatOffset = 0
for (var j=0; j<seat_pax; j++){
var CW = 17;
var q = 4;
if (Dims.hasOwnProperty('CW' + (j+1))){
CW = parseFloat(Dims['CW' + (j+1)].Value);
}
if (Dims.hasOwnProperty('q' + (j+1))){
CW = parseFloat(Dims['q' + (j+1)].Value);
}
SeatGeometryArr.push(['M',-CTS+SeatRad,-TAR+q/2 + SeatOffset]);
SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,-CTS,-TAR+q/2+SeatRad + SeatOffset]);
SeatGeometryArr.push(['L',-CTS,-TAR+q/2+CW-q/2-SeatRad + q/2 + SeatOffset]);
SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,-CTS+SeatRad,-TAR+CW+q/2 + SeatOffset]);
SeatGeometryArr.push(['L',CRP-SeatRad, -TAR+q/2+CW + SeatOffset]);
SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,CRP, -TAR+q/2+CW-SeatRad + SeatOffset]);
SeatGeometryArr.push(['L',CRP, -TAR+q/2+SeatRad + SeatOffset]);
SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,CRP-SeatRad, -TAR+q/2 + SeatOffset]);
SeatGeometryArr.push(['L',-CTS+SeatRad,-TAR+q/2 + SeatOffset]);
SeatGeometryArr.push(['Z']);
SeatGeometryArr.push(['M',CRP+SeatRad,-TAR+q/2 + SeatOffset]);
SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1,CRP,-TAR+q/2+SeatRad + SeatOffset]);
SeatGeometryArr.push(['L',CRP,-TAR+q/2+CW-SeatRad + SeatOffset]);
SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1, CRP+SeatRad, -TAR+q/2+CW + SeatOffset]);
SeatGeometryArr.push(['L',SBT2 - SeatRad ,-TAR+q/2+CW + SeatOffset]);
SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1, SBT2, -TAR + q/2 + CW - SeatRad + SeatOffset]);
SeatGeometryArr.push(['L',SBT2,-TAR + q/2 + SeatRad+ SeatOffset]);
SeatGeometryArr.push(['A',SeatRad,SeatRad,0,0,1, SBT2 - SeatRad,-TAR+q/2 + SeatOffset]);
SeatGeometryArr.push(['L',CRP+SeatRad,-TAR+q/2 + SeatOffset]);
SeatGeometryArr.push(['Z']);
SeatOffset += CW;
}
//alert("Out of Cushions");
var SeatPath = FlipGeoArr(SeatGeometryArr,-BL); // Note: BL is flipped here because the geometry for the seat is defined for a RH seat
// Create Armrest Geometry
ArmrestGeometryArr = [];
SeatOffset = 0
for (var j=0; j<seat_pax+1; j++){
var CW = 17;
var q = 4;
if (Dims.hasOwnProperty('CW' + (j+1))){
CW = parseFloat(Dims['CW' + (j+1)].Value);
}
if (Dims.hasOwnProperty('q' + (j+1))){
CW = parseFloat(Dims['q' + (j+1)].Value);
}
ArmrestGeometryArr.push(['M',-FOA,-TAR + SeatOffset]);
ArmrestGeometryArr.push(['L',-FOA,-TAR+q + SeatOffset]);
ArmrestGeometryArr.push(['L',BA,-TAR+q + SeatOffset]);
ArmrestGeometryArr.push(['L',BA,-TAR + SeatOffset]);
ArmrestGeometryArr.push(['L',-FOA,-TAR + SeatOffset]);
ArmrestGeometryArr.push(['Z']);
SeatOffset += CW;
}
//alert("Out of Armrests");
var ArmrestPath = FlipGeoArr(ArmrestGeometryArr,-BL); // Note: BL is flipped here because the geometry for the seat is defined for a RH seat
//alert("Into Simple");
// create geometry for the simplified seat
SimpleSeatGeometryArr = [];
SimpleSeatGeometryArr.push(['M',-CTS,-TAR]);
SimpleSeatGeometryArr.push(['L',-CTS,ACO]);
SimpleSeatGeometryArr.push(['L',SBT2,ACO]);
SimpleSeatGeometryArr.push(['L',SBT2,-TAR]);
SimpleSeatGeometryArr.push(['Z']);
//alert("Out of Simple");
var SimpleSeatPath = FlipGeoArr(SimpleSeatGeometryArr,-BL); // Note: BL is flipped here because the geometry for the seat is defined for a RH seat
// stick these values in for all seat instances with this part number
for (var j=0; j<Seats.length; j++){
if (Seats[j].PartNumber == Seats[i].PartNumber){
Seats[j].SeatPath = SeatPath;
Seats[j].ArmrestPath = ArmrestPath;
Seats[j].SimpleSeatPath = SimpleSeatPath;
}
}
}
}
}
我认为这也可能是一种竞争条件,所以我厌倦了使用window.setTimeout(functionThatBreaks,1)
它来确保它在加载依赖项时执行,但无济于事。弹出相同的错误并且FF死了。除了用户交互来尝试确定它是否是竞争条件之外,我还能做些什么吗?
编辑 4-17-2013,太平洋标准时间下午 2:00 我修改了上面的代码以显示根据 lib3d 和 TheBrain 的建议所做的更改。我还尝试将其设为常规函数而不是对象原型,但行为仍然没有变化。
我也刚刚发现了一些奇怪的东西。如果我为该网站启用了 FireBug,它运行良好。如果我禁用 FireBug,那么 FireFox 就会崩溃。我现在完全糊涂了。
编辑 2013 年 4 月 17 日 4:05 PST 事实证明我错了 FireBug 导致的问题。我可以关闭浏览器,通过从计算机上的文件夹打开 html 页面重新打开它,它会失败。我只能在 Firefox 失败对话框中单击“关闭窗口”,然后打开同一个 html 页面,然后它就可以正常工作了。
什么可能导致这种行为?