2

我为这个模糊的问题道歉,但我不知道如何更好地描述正在发生的事情。

我正在开发一个到目前为止严格用 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 页面,然后它就可以正常工作了。

什么可能导致这种行为?

4

0 回答 0