Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在完成填字游戏后显示弹出窗口消息-JS_Javascript_Html_Jquery_Arrays_Json - Fatal编程技术网

Javascript 如何在完成填字游戏后显示弹出窗口消息-JS

Javascript 如何在完成填字游戏后显示弹出窗口消息-JS,javascript,html,jquery,arrays,json,Javascript,Html,Jquery,Arrays,Json,我已经编辑了这个拼图,因为我想,但我需要显示一条消息后,完成填字游戏。有办法吗?欢迎任何评论 这是GitHub链接- 这里主要是activePosition和activeClueIndex,它们是在发生交互时设置UI的主要变量。都是x,y坐标。我有没有办法添加这条消息 下面是检查获胜函数 /* - Checks current entry input group value against answer - If not compl

我已经编辑了这个拼图,因为我想,但我需要显示一条消息后,完成填字游戏。有办法吗?欢迎任何评论

这是GitHub链接-

这里主要是activePosition和activeClueIndex,它们是在发生交互时设置UI的主要变量。都是x,y坐标。我有没有办法添加这条消息

下面是检查获胜函数

/*
                - Checks current entry input group value against answer
                - If not complete, auto-selects next input for user
            */
            checkAnswer: function(e) {
                
                var valToCheck, currVal;
                
                util.getActivePositionFromClassGroup($(e.target));
            
                valToCheck = puzz.data[activePosition].answer.toLowerCase();

                currVal = $('.position-' + activePosition + ' input')
                    .map(function() {
                        return $(this)
                            .val()
                            .toLowerCase();
                    })
                    .get()
                    .join('');
                
                //console.log(currVal + " " + valToCheck);
                if(valToCheck === currVal){ 
                    $('.active')
                        .addClass('done')
                        .removeClass('active');
                
                    $('.clues-active').addClass('clue-done');

                    solved.push(valToCheck);
                    solvedToggle = true;
                    return;
                }
                
                currOri === 'across' ? nav.nextPrevNav(e, 39) : nav.nextPrevNav(e, 40);
                
                //z++;
                //console.log(z);
                //console.log('checkAnswer() solvedToggle: '+solvedToggle);

            }               


        }; // end puzInit object
这是完整的代码

var puzz = {}; // put data array in object literal to namespace it into safety
        puzz.data = entryData;
        
        // append clues markup after puzzle wrapper div
        // This should be moved into a configuration object
        this.after('<div id="puzzle-clues"><h2>Across</h2><ol id="across"></ol><h2>Down</h2><ol id="down"></ol></div>');
        
        // initialize some variables
        var tbl = ['<table id="puzzle">'],
            puzzEl = this,
            clues = $('#puzzle-clues'),
            clueLiEls,
            coords,
            entryCount = puzz.data.length,
            entries = [], 
            rows = [],
            cols = [],
            solved = [],
            tabindex,
            $actives,
            activePosition = 0,
            activeClueIndex = 0,
            currOri,
            targetInput,
            mode = 'interacting',
            solvedToggle = false,
            z = 0;

        var puzInit = {
            
            init: function() {
                currOri = 'across'; // app's init orientation could move to config object
                
                // Reorder the problems array ascending by POSITION
                puzz.data.sort(function(a,b) {
                    return a.position - b.position;
                });

                // Set keyup handlers for the 'entry' inputs that will be added presently
                puzzEl.delegate('input', 'keyup', function(e){
                    mode = 'interacting';
                    
                    
                    // need to figure out orientation up front, before we attempt to highlight an entry
                    switch(e.which) {
                        case 39:
                        case 37:
                            currOri = 'across';
                            break;
                        case 38:
                        case 40:
                            currOri = 'down';
                            break;
                        default:
                            break;
                    }
                    
                    if ( e.keyCode === 9) {
                        return false;
                    } else if (
                        e.keyCode === 37 ||
                        e.keyCode === 38 ||
                        e.keyCode === 39 ||
                        e.keyCode === 40 ||
                        e.keyCode === 8 ||
                        e.keyCode === 46 ) {            
                                            

                        
                        if (e.keyCode === 8 || e.keyCode === 46) {
                            currOri === 'across' ? nav.nextPrevNav(e, 37) : nav.nextPrevNav(e, 38); 
                        } else {
                            nav.nextPrevNav(e);
                        }
                        
                        e.preventDefault();
                        return false;
                    } else {
                        
                        console.log('input keyup: '+solvedToggle);
                        
                        puzInit.checkAnswer(e);

                    }

                    e.preventDefault();
                    return false;                   
                });
        
                // tab navigation handler setup
                puzzEl.delegate('input', 'keydown', function(e) {

                    if ( e.keyCode === 9) {
                        
                        mode = "setting ui";
                        if (solvedToggle) solvedToggle = false;

                        //puzInit.checkAnswer(e)
                        nav.updateByEntry(e);
                        
                    } else {
                        return true;
                    }
                                            
                    e.preventDefault();
                                
                });
                
                // tab navigation handler setup
                puzzEl.delegate('input', 'click', function(e) {
                    mode = "setting ui";
                    if (solvedToggle) solvedToggle = false;

                    console.log('input click: '+solvedToggle);
                
                    nav.updateByEntry(e);
                    e.preventDefault();
                                
                });
                
                
                // click/tab clues 'navigation' handler setup
                clues.delegate('li', 'click', function(e) {
                    mode = 'setting ui';
                    
                    if (!e.keyCode) {
                        nav.updateByNav(e);
                    } 
                    e.preventDefault(); 
                });
                
                
                // highlight the letter in selected 'light' - better ux than making user highlight letter with second action
                puzzEl.delegate('#puzzle', 'click', function(e) {
                    $(e.target).focus();
                    $(e.target).select();`+`
                });
                
                // DELETE FOR BG
                puzInit.calcCoords();
                
                // Puzzle clues added to DOM in calcCoords(), so now immediately put mouse focus on first clue
                clueLiEls = $('#puzzle-clues li');
                $('#' + currOri + ' li' ).eq(0).addClass('clues-active').focus();
            
                // DELETE FOR BG
                puzInit.buildTable();
                puzInit.buildEntries();
                                    
            },
            
            /*
                - Given beginning coordinates, calculate all coordinates for entries, puts them into entries array
                - Builds clue markup and puts screen focus on the first one
            */
            calcCoords: function() {
                /*
                    Calculate all puzzle entry coordinates, put into entries array
                */
                for (var i = 0, p = entryCount; i < p; ++i) {       
                    // set up array of coordinates for each problem
                    entries.push(i);
                    entries[i] = [];

                    for (var x=0, j = puzz.data[i].answer.length; x < j; ++x) {
                        entries[i].push(x);
                        coords = puzz.data[i].orientation === 'across' ? "" + puzz.data[i].startx++ + "," + puzz.data[i].starty + "" : "" + puzz.data[i].startx + "," + puzz.data[i].starty++ + "" ;
                        entries[i][x] = coords; 
                    }

                    // while we're in here, add clues to DOM!
                    $('#' + puzz.data[i].orientation).append('<li tabindex="1" data-position="' + i + '">' + puzz.data[i].clue + '</li>'); 
                }               
                
                // Calculate rows/cols by finding max coords of each entry, then picking the highest
                for (var i = 0, p = entryCount; i < p; ++i) {
                    for (var x=0; x < entries[i].length; x++) {
                        cols.push(entries[i][x].split(',')[0]);
                        rows.push(entries[i][x].split(',')[1]);
                    };
                }

                rows = Math.max.apply(Math, rows) + "";
                cols = Math.max.apply(Math, cols) + "";
    
            },
            
            /*
                Build the table markup
                - adds [data-coords] to each <td> cell
            */
            buildTable: function() {
                for (var i=1; i <= rows; ++i) {
                    tbl.push("<tr>");
                        for (var x=1; x <= cols; ++x) {
                            tbl.push('<td data-coords="' + x + ',' + i + '"></td>');        
                        };
                    tbl.push("</tr>");
                };

                tbl.push("</table>");
                puzzEl.append(tbl.join(''));
            },
            
            /*
                Builds entries into table
                - Adds entry class(es) to <td> cells
                - Adds tabindexes to <inputs> 
            */
            buildEntries: function() {
                var puzzCells = $('#puzzle td'),
                    light,
                    $groupedLights,
                    hasOffset = false,
                    positionOffset = entryCount - puzz.data[puzz.data.length-1].position; // diff. between total ENTRIES and highest POSITIONS
                    
                for (var x=1, p = entryCount; x <= p; ++x) {
                    var letters = puzz.data[x-1].answer.split('');

                    for (var i=0; i < entries[x-1].length; ++i) {
                        light = $(puzzCells +'[data-coords="' + entries[x-1][i] + '"]');
                        
                        // check if POSITION property of the entry on current go-round is same as previous. 
                        // If so, it means there's an across & down entry for the position.
                        // Therefore you need to subtract the offset when applying the entry class.
                        if(x > 1 ){
                            if (puzz.data[x-1].position === puzz.data[x-2].position) {
                                hasOffset = true;
                            };
                        }
                        
                        if($(light).empty()){
                            $(light)
                                .addClass('entry-' + (hasOffset ? x - positionOffset : x) + ' position-' + (x-1) )
                                .append('<input maxlength="1" val="" type="text" tabindex="-1" />');
                        }
                    };
                    
                };  
                
                // Put entry number in first 'light' of each entry, skipping it if already present
                for (var i=1, p = entryCount; i < p; ++i) {
                    $groupedLights = $('.entry-' + i);
                    if(!$('.entry-' + i +':eq(0) span').length){
                        $groupedLights.eq(0)
                            .append('<span>' + puzz.data[i].position + '</span>');
                    }
                }   
                
                util.highlightEntry();
                util.highlightClue();
                $('.active').eq(0).focus();
                $('.active').eq(0).select();
                                    
            },
            
            
            /*
                - Checks current entry input group value against answer
                - If not complete, auto-selects next input for user
            */
            checkAnswer: function(e) {
                
                var valToCheck, currVal;
                
                util.getActivePositionFromClassGroup($(e.target));
            
                valToCheck = puzz.data[activePosition].answer.toLowerCase();

                currVal = $('.position-' + activePosition + ' input')
                    .map(function() {
                        return $(this)
                            .val()
                            .toLowerCase();
                    })
                    .get()
                    .join('');
                
                //console.log(currVal + " " + valToCheck);
                if(valToCheck === currVal){ 
                    $('.active')
                        .addClass('done')
                        .removeClass('active');
                
                    $('.clues-active').addClass('clue-done');

                    solved.push(valToCheck);
                    solvedToggle = true;
                    return;
                }
                
                currOri === 'across' ? nav.nextPrevNav(e, 39) : nav.nextPrevNav(e, 40);
                
                //z++;
                //console.log(z);
                //console.log('checkAnswer() solvedToggle: '+solvedToggle);

            }               


        }; // end puzInit object
        

        var nav = {
            
            nextPrevNav: function(e, override) {

                var len = $actives.length,
                    struck = override ? override : e.which,
                    el = $(e.target),
                    p = el.parent(),
                    ps = el.parents(),
                    selector;
            
                util.getActivePositionFromClassGroup(el);
                util.highlightEntry();
                util.highlightClue();
                
                $('.current').removeClass('current');
                
                selector = '.position-' + activePosition + ' input';
                
                //console.log('nextPrevNav activePosition & struck: '+ activePosition + ' '+struck);
                    
                // move input focus/select to 'next' input
                switch(struck) {
                    case 39:
                        p
                            .next()
                            .find('input')
                            .addClass('current')
                            .select();

                        break;
                    
                    case 37:
                        p
                            .prev()
                            .find('input')
                            .addClass('current')
                            .select();

                        break;

                    case 40:
                        ps
                            .next('tr')
                            .find(selector)
                            .addClass('current')
                            .select();

                        break;

                    case 38:
                        ps
                            .prev('tr')
                            .find(selector)
                            .addClass('current')
                            .select();

                        break;

                    default:
                    break;
                }
                                                        
            },

            updateByNav: function(e) {
                var target;
                
                $('.clues-active').removeClass('clues-active');
                $('.active').removeClass('active');
                $('.current').removeClass('current');
                currIndex = 0;

                target = e.target;
                activePosition = $(e.target).data('position');
                
                util.highlightEntry();
                util.highlightClue();
                                    
                $('.active').eq(0).focus();
                $('.active').eq(0).select();
                $('.active').eq(0).addClass('current');
                
                // store orientation for 'smart' auto-selecting next input
                currOri = $('.clues-active').parent('ol').prop('id');
                                    
                activeClueIndex = $(clueLiEls).index(e.target);
                //console.log('updateByNav() activeClueIndex: '+activeClueIndex);
                
            },
        
            // Sets activePosition var and adds active class to current entry
            updateByEntry: function(e, next) {
                var classes, next, clue, e1Ori, e2Ori, e1Cell, e2Cell;
                
                if(e.keyCode === 9 || next){
                    // handle tabbing through problems, which keys off clues and requires different handling        
                    activeClueIndex = activeClueIndex === clueLiEls.length-1 ? 0 : ++activeClueIndex;
                
                    $('.clues-active').removeClass('.clues-active');
                                            
                    next = $(clueLiEls[activeClueIndex]);
                    currOri = next.parent().prop('id');
                    activePosition = $(next).data('position');
                                            
                    // skips over already-solved problems
                    util.getSkips(activeClueIndex);
                    activePosition = $(clueLiEls[activeClueIndex]).data('position');
                    
                                                                                            
                } else {
                    activeClueIndex = activeClueIndex === clueLiEls.length-1 ? 0 : ++activeClueIndex;
                
                    util.getActivePositionFromClassGroup(e.target);
                    
                    clue = $(clueLiEls + '[data-position=' + activePosition + ']');
                    activeClueIndex = $(clueLiEls).index(clue);
                    
                    currOri = clue.parent().prop('id');
                    
                }
                    
                    util.highlightEntry();
                    util.highlightClue();
                    
                    //$actives.eq(0).addClass('current');   
                    //console.log('nav.updateByEntry() reports activePosition as: '+activePosition);    
            }
            
        }; // end nav object

        
        var util = {
            highlightEntry: function() {
                // this routine needs to be smarter because it doesn't need to fire every time, only
                // when activePosition changes
                $actives = $('.active');
                $actives.removeClass('active');
                $actives = $('.position-' + activePosition + ' input').addClass('active');
                $actives.eq(0).focus();
                $actives.eq(0).select();
            },
            
            highlightClue: function() {
                var clue;               
                $('.clues-active').removeClass('clues-active');
                $(clueLiEls + '[data-position=' + activePosition + ']').addClass('clues-active');
                
                if (mode === 'interacting') {
                    clue = $(clueLiEls + '[data-position=' + activePosition + ']');
                    activeClueIndex = $(clueLiEls).index(clue);
                };
            },
            
            getClasses: function(light, type) {
                if (!light.length) return false;
                
                var classes = $(light).prop('class').split(' '),
                classLen = classes.length,
                positions = []; 

                // pluck out just the position classes
                for(var i=0; i < classLen; ++i){
                    if (!classes[i].indexOf(type) ) {
                        positions.push(classes[i]);
                    }
                }
                
                return positions;
            },

            getActivePositionFromClassGroup: function(el){

                    classes = util.getClasses($(el).parent(), 'position');

                    if(classes.length > 1){
                        // get orientation for each reported position
                        e1Ori = $(clueLiEls + '[data-position=' + classes[0].split('-')[1] + ']').parent().prop('id');
                        e2Ori = $(clueLiEls + '[data-position=' + classes[1].split('-')[1] + ']').parent().prop('id');

                        // test if clicked input is first in series. If so, and it intersects with
                        // entry of opposite orientation, switch to select this one instead
                        e1Cell = $('.position-' + classes[0].split('-')[1] + ' input').index(el);
                        e2Cell = $('.position-' + classes[1].split('-')[1] + ' input').index(el);

                        if(mode === "setting ui"){
                            currOri = e1Cell === 0 ? e1Ori : e2Ori; // change orientation if cell clicked was first in a entry of opposite direction
                        }

                        if(e1Ori === currOri){
                            activePosition = classes[0].split('-')[1];      
                        } else if(e2Ori === currOri){
                            activePosition = classes[1].split('-')[1];
                        }
                    } else {
                        activePosition = classes[0].split('-')[1];                      
                    }
                    
                    console.log('getActivePositionFromClassGroup activePosition: '+activePosition);
                    
            },
            
            checkSolved: function(valToCheck) {
                for (var i=0, s=solved.length; i < s; i++) {
                    if(valToCheck === solved[i]){
                        return true;
                        
                    }

                }
            },
            
            getSkips: function(position) {
                if ($(clueLiEls[position]).hasClass('clue-done')){
                    activeClueIndex = position === clueLiEls.length-1 ? 0 : ++activeClueIndex;
                    util.getSkips(activeClueIndex);                     
                } else {
                    return false;
                }
            }
            
        }; // end util object

            
        puzInit.init();

                        
}
var puzz={};//将数据数组放入对象文字中,以将其命名为安全名称空间
puzz.data=入口数据;
//在拼图包装器div之后追加线索标记
//应将其移动到配置对象中
此。在('AcrossDown')之后;
//初始化一些变量
变量tbl=[''],
puzzEl=这个,
线索=$(“#谜题线索”),
俱乐部,
coords,
entryCount=puzz.data.length,
条目=[],
行=[],
cols=[],
已解决=[],
tabindex,
$actives,
活动位置=0,
activeClueIndex=0,
柯罗里,
targetInput,
模式='交互',
solvedToggle=false,
z=0;
var puzInit={
init:function(){
currOri='cross';//应用程序的初始化方向可能会移动到配置对象
//按位置升序重新排列问题数组
puzz.data.sort(函数(a,b){
返回a位置-b位置;
});
//为当前添加的“条目”输入设置密钥设置处理程序
puzzEl.delegate('input','keyup',函数(e){
模式='交互';
//在我们试图突出显示条目之前,需要先确定方向
开关(e.which){
案例39:
案例37:
currOri=‘跨越’;
打破
案例38:
案例40:
currOri=‘向下’;
打破
违约:
打破
}
如果(如keyCode===9){
返回false;
}否则如果(
e、 键代码===37||
e、 键代码===38||
e、 键代码===39||
e、 键代码===40||
e、 键代码===8||
e、 键码===46){
如果(e.keyCode==8 | | e.keyCode==46){
currOri==='穿过'?导航下一个导航(e,37):导航下一个导航(e,38);
}否则{
导航下一个导航(e);
}
e、 预防默认值();
返回false;
}否则{
log('input keyup:'+solvedToggle);
puzInit.核对答案(e);
}
e、 预防默认值();
返回false;
});
//选项卡导航处理程序设置
puzzEl.delegate('input','keydown',函数(e){
如果(如keyCode===9){
mode=“设置用户界面”;
如果(solvedToggle)solvedToggle=false;
//puzInit.核对答案(e)
导航更新入口(e);
}否则{
返回true;
}
e、 预防默认值();
});
//选项卡导航处理程序设置
puzzEl.delegate('输入','单击',函数(e){
mode=“设置用户界面”;
如果(solvedToggle)solvedToggle=false;
console.log('input click:'+solvedtogle);
导航更新入口(e);
e、 预防默认值();
});
//单击/选项卡“导航”处理程序设置
线索。代表('li','click',函数(e){
模式='设置用户界面';
如果(!e.keyCode){
导航更新ynav(e);
} 
e、 预防默认值();
});
//在选定的“灯光”中高亮显示字母-比使用第二个操作让用户高亮显示字母更好
puzzEl.delegate(“#拼图”,“点击”,函数(e){
$(e.target.focus();
$(e.target).select()`+`
});
//为BG删除
puzInit.calccoods();
//在calcCoords()中将谜题线索添加到DOM中,所以现在立即将鼠标焦点放在第一条线索上
clueLiEls=$(“#拼图线索li”);
$('#'+currOri+'li').eq(0).addClass('clues-active').focus();
//为BG删除
puzInit.buildTable();
puzInit.buildEntries();