我为这个模糊的问题道歉,但我不知道如何更好地描述正在发生的事情。
我正在开发一个到目前为止严格用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会崩溃。我现在非常困惑。
编辑4-17-2013 4:05太平洋标准时间 事实证明我错误的FireBug导致了问题。我可以关闭浏览器,通过从我的计算机上的文件夹打开html页面重新打开它,它将失败。除了在Firefox失败对话框中单击“关闭窗口”,然后打开相同的html页面,我突然无法工作。
什么可能导致这种行为?