为什么我无法在 jsFiddle 上制作这个有效的代码?

3

我的代码在我的电脑上,包括ie在内的所有浏览器上都能完美运行,但我无法让它在jsFiddle上运行。

问题似乎出现在:

    window.onload=function(){
        document.body.innerHTML+=brd+log;
    }

但是我已经尝试过使用和不使用 window.onload。我完全不知所措,开始失去所有希望。

CSS(可选):

        *{margin:0;padding:0;}
        #brd{margin:15px auto;}
        #brd,#brd td,#log{border:1px solid #000;}
        #brd td{height:47px;width:45px;text-align:center;font-size:30px;}
        #brd span{font-size:12px;}
        #log{margin:15px auto;padding:20px;width:385px;max-height:150px;overflow:auto;background:#F0F0F0;color:#000;}

JavaScript:

        var i,sdk,rem,log,perf,brd,bxes=[["11","12","13","21","22","23","31","32","33"],["14","15","16","24","25","26","34","35","36"],["17","18","19","27","28","29","37","38","39"],["41","42","43","51","52","53","61","62","63"],["44","45","46","54","55","56","64","65","66"],["47","48","49","57","58","59","67","68","69"],["71","72","73","81","82","83","91","92","93"],["74","75","76","84","85","86","94","95","96"],["77","78","79","87","88","89","97","98","99"]];

        /*Array Find*/
        function arrFind(fnd,frm,bol){
            var ii,len,rtn=-1;

            for(ii=0,len=frm.length;ii<len;ii++){
                if(frm[ii]==fnd){
                    rtn=ii;
                    break;
                }
            }
            return bol?rtn>-1:rtn;
        }

        /*To RC*/
        function toRC(val){
            var ii,len,aa=[];

            val=val.split(",");

            for(ii=0,len=val.length;ii<len;ii++){
                aa.push(Math.ceil((parseInt(val[ii])+1)/9)+""+((parseInt(val[ii])%9)+1));
            }

            return aa.join(",");
        }

        /*To AV*/
        function toAV(rc){
            var ii,len,aa=[];

            rc=rc.split(",");

            for(ii=0,len=rc.length;ii<len;ii++){
                aa.push((((parseInt(rc[ii].charAt(0))-1)*9)+(parseInt(rc[ii].charAt(1))-1))+"");
            }

            return aa.join(",");
        }

        /*Get Box*/
        function getBox(av,bol){
            var ii,jj,len,ss,zz,aa=[];

            if(!bol){
                av=toRC(av);
            }

            av=av.split(",");

            for(ii=0,len=av.length;ii<len;ii++){
                ss=av[ii];
                for(jj=0;jj<9;jj++){
                    zz=window.bxes[jj];
                    if(arrFind(ss,zz,true)){
                        aa.push(zz);
                        break;
                    }
                }
            }

            return aa.join(",");
        }

        /*Get Row*/
        function getRow(av,bol){
            var ii,len,ss,aa=[];

            if(!bol){
                av=toRC(av);
            }

            av=av.split(",");

            for(ii=0,len=av.length;ii<len;ii++){
                ss=av[ii].charAt(0);
                aa.push(ss+"1",ss+"2",ss+"3",ss+"4",ss+"5",ss+"6",ss+"7",ss+"8",ss+"9");
            }

            return aa.join(",");
        }

        /*Get Column*/
        function getCol(av,bol){
            var ii,len,ss,aa=[];

            if(!bol){
                av=toRC(av);
            }

            av=av.split(",");

            for(ii=0,len=av.length;ii<len;ii++){
                ss=av[ii].charAt(1);
                aa.push("1"+ss,"2"+ss,"3"+ss,"4"+ss,"5"+ss,"6"+ss,"7"+ss,"8"+ss,"9"+ss);
            }

            return aa.join(",");
        }

        /*Get Value*/
        function getVal(av,bol){
            var ii,len,ss,aa=[];

            if(bol){
                av=toAV(av);
            }

            av=av.split(",");

            for(ii=0,len=av.length;ii<len;ii++){
                ss=window.sdk[parseInt(av[ii])];
                if(ss.length==1){
                    aa.push(ss);
                }
            }

            return aa.join(",");
        }

        /*Get Candidates*/
        function getCand(av,bol){
            var ii,len,ss,zz,aa=["1","2","3","4","5","6","7","8","9"];

            if(bol){
                av=toAV(av);
            }

            if(window.sdk[parseInt(av)].length==1){
                return [];
            }

            zz=getVal(getBox(av)+","+getRow(av)+","+getCol(av),true).split(",");

            for(ii=0,len=zz.length;ii<len;ii++){
                ss=arrFind(zz[ii],aa);
                if(ss>-1){
                    aa.splice(ss,1);
                }
            }

            return aa.join(",");
        }

        /*New Sudoku*/
        function newSudoku(str){
            var ii,len,ss;

            window.perf=new Date().getTime();
            window.log="";
            window.sdk=[];
            window.rem=[];

            for(ii=0,len=str.length;ii<len;ii++){
                ss=str.charAt(ii);
                if(ss!="0"){
                    window.log+=ss+" on "+toRC(ii+"")+"<br>";
                    writeNumber(ss,ii+"");//wn
                }else{
                    window.sdk[ii]=[];
                    window.rem.push(ii+"");
                }
            }
        }

        /*Write Number*/
        function writeNumber(val,av,bol){
            if(bol){
                av=toAV(av);
            }

            window.sdk[parseInt(av)]=[val];
            return delCand(val,av);
        }

        /*Delete Candidates*/
        function delCand(val,av,bol){
            var ii,jj,len,jen,ss,zz,cc,xx,xo,dd=[];

            if(bol){
                av=toAV(av);
            }

            zz=toRC(av);

            xx=new RegExp(","+zz+",","g");//below bol

            ss=toAV((getBox(av)+","+getRow(av)+","+getCol(av)).replace(xx,",").replace(zz+",","").replace(","+zz,"")).split(",");

            for(ii=0,len=ss.length;ii<len;ii++){
                cc=window.sdk[ss[ii]];
                if(!cc||cc.length<2){
                    continue;
                }
                zz=arrFind(val,cc);
                if(zz>-1){
                    window.sdk[parseInt(ss[ii])].splice(zz,1);
                    if(window.sdk[parseInt(ss[ii])].length==1){

                        window.log+=window.sdk[parseInt(ss[ii])][0]+" on "+toRC(ss[ii])+"<br>";
                        xo=delCand(window.sdk[parseInt(ss[ii])][0],ss[ii]);//wn

                        jen=xo.length;
                        if(jen>0){
                            for(jj=0;jj<jen;jj++){
                                dd.push(xo[jj]);
                            }
                        }
                        dd.push(ss[ii]);
                    }
                }
            }
            return dd;
        }

        /*Delete Remaining*/
        function delRem(arr){
            var ii,len,ss;

            for(ii=0,len=arr.length;ii<len;ii++){
                ss=arrFind(arr[ii],window.rem);
                if(ss>-1){
                    window.rem.splice(ss,1);
                }
            }
        }

        /*Solve Sudoku*/
        function solSudoku(){
            var ii,jj,ll,yy,len,jen,ss,zz,cc,dd,xo;

            for(ll=0;ll<1;ll++){

                dd=[];
                for(ii=0,len=window.rem.length;ii<len;ii++){

                    zz=window.sdk[parseInt(window.rem[ii])];

                    if(zz.length==0){
                        ss=getCand(window.rem[ii]).split(",");

                        if(ss.length==1&&ss[0]!=""){

                            window.log+=ss[0]+" on "+toRC(window.rem[ii])+"<br>";
                            xo=writeNumber(ss[0],window.rem[ii]);//wn

                            jen=xo.length;
                            if(jen>0){
                                for(yy=0;yy<jen;yy++){
                                    dd.push(xo[yy]);
                                }
                            }
                            dd.push(window.rem[ii]);

                            ll=-1;
                        }else{
                            if(ss.length>1){
                                window.sdk[parseInt(window.rem[ii])]=ss;
                            }
                        }
                    }else if(zz.length==1){
                        alert("solSudoku warning");
                        dd.push(window.rem[ii]);
                    }
                }
                delRem(dd);
            }
            if(window.rem.length!=0){
                //failed to solve by simple solving
                //start advanced solving
            }
        }

        //============================================================================

        newSudoku("032060007000008290000509000000300016800000002610002000000405000045800000700010530");

        solSudoku();
        //000124039007093056390000200040708000008050400000201060005000078270980300980517000
        //032060007000008290000509000000300016800000002610002000000405000045800000700010530


        //delCand("5","55",true);

        //alert("["+sdk.join("][")+"]");

        log+="--- Time: "+(new Date().getTime()-perf)+" milliseconds ---";

        brd="<table id=\"brd\" cellpadding=\"0\" cellspacing=\"0\"><tbody><tr>";

        for(i=0;i<sdk.length;i++){
            if(i%9==0){
                if(i!=0&&i!=80){
                    brd+="</tr><tr>";
                }
            }
            if(sdk[i].length==0){
                brd+="<td>&nbsp;</td>";
            }
            if(sdk[i].length==1){
                brd+="<td>"+sdk[i]+"</td>";
            }
            if(sdk[i].length>1){
                brd+="<td><span>"+sdk[i].join(" ")+"</span></td>";
            }
        }

        brd+="</tr></tbody></table>";
        log="<div id=\"log\">"+log+"</div>";

        window.onload=function(){
            document.body.innerHTML+=brd+log;
        }
2个回答

8

这个可以正常工作,可在这里查看。

附注:你应该选择no wrap (head)选项。


7
如果您查看jsFiddle的源代码,您会发现所有的JavaScript代码已经包含在window.onload函数中。
在外部window.onload函数被调用后,内部函数不会执行,因为文档已经加载完成。
window.onload=function(){
    window.onload=function(){
        // this code will never get executed.
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接