2014-12-05 3 views
0

아직도 내가 내가 할 이제 마지막으로 한 가지 자바 스크립트를 사용하여 구축 된 지뢰 찾기의 내 프로그램의 끝 부분에있어 잘배치 플래그

에 추가 도움을 찾고 폭탄 인 광장에 깃발을 놓고 있습니다. 그것을지고 코드의 일부는 'document.getElementById를 (...)'null의 경우, 또는하지 개체 여기

된다

오류 : 오른쪽 클릭하면 기능을 사용하여 난의 오류를 얻고있다 . 이제는 내 이미지가 폴더에 있고 깃발 이미지는 sqt01이라고합니다. 그래서 document.getElementbyId 부분을 다른 이미지를 가리키는 부분으로 변경했지만 오류가 발생합니다.

//Global 
//store the value of each square 
var gaValue = new Array(8); 
for (i = 0; i <= 8; i++) { 
    gaValue[i] = new Array(8); 
} 
for (i = 0; i <= 8; i++) { 
    //loop through each item in those row 
    for (j = 0; j <= 8; j++) { 
     gaValue[i][j] = 0; 
    } 
} 
//Store the status of each square 
var gaSquare = new Array(8); 
for (j = 0; j <= 8; j++) { 
    gaSquare[j] = new Array(8); 
} 
for (j = 0; j <= 8; j++) { 
    //loop through each item in those row 
    for (i = 0; i <= 8; i++) { 
     gaSquare[i][j] = 'c'; 
    } 
} 
     //Track of whether the game is over or not (starts this with false) 
var gbGameOver = false; 

      function vInit() 
    { 
       var strHTML; 
       var i; 
       var j; 

       strHTML = "<table style='margin-left:auto;margin-right:auto'>"; 
       strHTML += "<tr><td colspan='8' style='text-align:center'>MineSweeper</td></tr>"; 
       strHTML += "<tr><td colspan='8' style='text-align:center'><input type='button' id='btnNew' value='New Game' onclick='vNewGame()'></td></tr>"; 

     //Loop through the rows to build the table of tiles 
     for (i = 0; i < 8; i++) 
     { 
      strHTML += "<tr>"; 
      for (j = 0; j < 8; j++) 

       strHTML += '<td><img src="images/sqt0.png" id="square' + i + ', ' + j + '" onclick="vClick(' + i + ', ' + j + ')" onmousedown="vRightClick(' + i + ', ' + j + ')"/></td>'; 

      strHTML += "<tr>"; 
     } 
     strHTML += '<tr><td colspan="8" style="text-align:center"><textarea id="taOut" cols="18" rows="10"></textarea></td></tr>'; 
     strHTML += "</table>"; 
     frmGrid.innerHTML = strHTML; 

     //Place bombs 
     var iBomb = 0; 
     var iRow = Math.floor(Math.random() * 8); 
     var iCol = Math.floor(Math.random() * 8); 

     while (iBomb < 8) 
     { 
      while (gaValue[iRow][iCol] == 9) 
      { 
       iRow = Math.floor(Math.random() * 8); 
       iCol = Math.floor(Math.random() * 8); 
      } 
      gaValue[iRow][iCol] = 9; 
      iBomb++; 
     } 
     //Calculate clue values around mines 
     var iMine = 0; 
     for (i = 0; i < 8; i++) 
     { 
      for (j = 0; j < 8; j++) 
      { 
       for (k = (i - 1) ; k <= (i + 1) ; k++) 
        for (m = (j - 1) ; m <= (j + 1) ; m++) 
         if (k >= 0 && k <= 7 && j >= 0 && j <= 7) 
          if (gaValue[k][m] == 9) 
           iMine++; 
       if (gaValue[i][j] != 9) 
        gaValue[i][j] = iMine; 
       iMine = 0; 
      } 
     } 
    } 
    //Get the ID of the image I need to change 
    function vClick(iRow, iCol) 
    { 
     var strID = "square" + iRow + ", " + iCol; 
     var strOut = "Gameover"; 

     if (gbGameOver == false) 
     { 

      gaSquare[iRow][iCol] = 'o'; 
      document.getElementById(strID).src = "images/" + gaValue[iRow][iCol] + ".png"; 

      if (gaValue[iRow][iCol] == 9) 
      { 
       document.getElementById('taOut').value = strOut; 
       vOver(); 
      } 
      if (gaValue[iRow][iCol] == 0) 
      { 
       vZero2(iRow, iCol); 
      } 
     } 
    } 

    //GameOver  
    function vOver()  
    { 
     var i; 
     var j; 
     var strID; 

     for (i = 0; i < 8; i++) 
      for (j = 0; j < 8; j++) 
      { 
       strID = "square" + i + ", " + j; 
       document.getElementById(strID).src = "images/" + gaValue[i][j] + ".png"; 
      } 
    } 
//Clearing area 
    function vZero2(iRow, iCol) 
    { 
     var i; 
     var j; 
     for (i = iRow - 1; i <= (iRow + 1) ; i++) 
     { 
      for (j = iCol - 1; j <= iCol + 1; j++) 
      { 
       if (i >= 0 && i < 8 && j >= 0 && j < 8) 
        if (gaSquare[i][j] != 'o') 
         vClick(i, j); 
      } 
     } 
    } 

//Start new game 
    function vNewGame() 
    {  
     for (i = 0; i < 8; i++) 
      for (j = 0; j < 8; j++) 
      { 
       gaValue[i][j] = 0; 
       gaSquare[i][j] = 'c'; 
       document.getElementById('square' + i + ', ' + j).src = 'images/sqt0.png'; 
      } 
     gbGameOver = false; 
     vInit(); 
    }    
     //no menu on right click 
    function bIsRightButtonClicked(e) { 
     var rightclick = false; 
     e = e || window.event; 
     if (e.which) { 
      rightclick = (e.which == 3); 
     } else if (e.button) { 
      rightclick = (e.button == 2); 
     } 
     return rightclick; 
    } 
//Getting Flag when you right click 
     function vRightClick(iRow, iCol, e) 
     { 
      if (bIsRightButtonClicked(e)) 
      { 
       gaSquare[iRow][iCol] = 'c'; 
       gaSquare[iRow][iCol] = 'f'; 
       document.getElementById('square' + i + ', ' + j).src = 'images/sqt1.png'; // Error: 'document.getElementById(...)' is null or not an object 
       vOver(); 
      } 
     } 


    //Getting Flag when you right click 
      function vRightClick(iRow, iCol, e) 
      { 
       if (bIsRightButtonClicked(e)) 
       { 
        gaSquare[iRow][iCol] = 'c'; 
        gaSquare[iRow][iCol] = 'f'; 
        document.getElementById('square' + i + ', ' + j).src = 'images/sqt1.png'; // Error: 'document.getElementById(...)' is null or not an object 
        vOver(); 
       } 
      } 
+1

문제는 당신이 만든 이드. ID는 공백뿐만 아니라 콜론과 같은 특수 문자를 포함 할 수 없습니다. –

+0

그래서 나에게 말하고있는 것 ... 나는 코드의 다른 줄에 'square'+ i + ','+ j와 같은 id를 가진 요소를 가지고있다. – dmbfan42

+0

아마도 ID가있는 부분을 포함했다면 참조하려고하는 것은 만들어 졌습니까? – leigero

답변

1

dom 요소 ID 속성에 공백이나 쉼표를 사용할 수 없습니다 (this post for more details and references 참조). 로 시작해야합니다 나는 당신 대체 할 그와

ID and NAME tokens must begin with a letter ([A-Za-z]) and may be followed by any number of letters, digits ([0-9]), hyphens ("-"), underscores ("_"), colons (":"), and periods (".")

하여 ID 년대에 '을'은 '_'

코드를 변경해야하는 것의 몇 가지 예 :

... 

strHTML += '<td><img src="images/sqt0.png" id="square' + i + '_' + j + 
    '" onclick="vClick(' + i + ', ' + j + 
    ')" onmousedown="vRightClick(' + i + ', ' + j + ')"/></td>'; 

... 

document.getElementById('square' + i + '_' + j) 

... 

var strID = "square" + iRow + "_" + iCol; 

... 

onclickonmousedown 처리기/코드 생성은 동일하게 유지됩니다.

+0

그래서 모든 쉼표를 밑줄로 바꾸어야합니까? – dmbfan42

+0

거의 모든 쉼표를 사용할 수 있습니다. 예를 들어 vRightClick ('+ i +', '+ j +') ''을 사용하면 쉼표를 유지할 수 있습니다. –

+0

은 ID 생성/액세스에 직접 사용되는 모든 쉼표를 밑줄로 바꿉니다. –