2015-04-05 83 views
1

我有來自大學的作業,經典的15個難題。我對這兩種風格有問題。下面是代碼,我有問題undefined style

function siirra_pala(pala) { 
var palaRivi = parseInt(pala.style.top)/palanKoko; 
var palaSarake = parseInt(pala.style.left)/palanKoko; 
} 

錯誤代碼是「遺漏的類型錯誤:無法讀取屬性未定義的‘頂’」和「遺漏的類型錯誤:無法讀取屬性未定義的‘左’」。

如果有幫助: siirra_pala(PALA)是move_tile(瓦) palaRivi是tileRow和palaSarake是tileColumn palanKoko是tileSize。

我已經palanKoko設置爲100和風格被定義爲:

function muodosta_palat(pelialue) { 
for (var y = 0; y < 4; y++) { 
    for (var x = 0; x < 4; x++) { 
     if (!(x === tyhja_paikka.x && y === tyhja_paikka.y)) { 
      var pala = document.createElement('div'); 
      pala.id = 'pala' + x + y; 
      pala.textContent = 4 * y + x + 1; 
      pala.style.left = x * palanKoko + 'px'; 
      pala.style.top = y * palanKoko + 'px'; 
      pala.className = 'pala'; 
      pelialue.appendChild(pala); 
     } 
    } 
} 

如果你需要更多的代碼,請告訴哪一個。謝謝

@Bergi:

window.onload = function() { 

muodosta_palat(document.getElementById('pelialue')); 
var palat = document.querySelectorAll(".pala"); 
document.getElementById('sekoitusnappi').onclick = sekoita; 
for (var i = 0; i < palat.length; i++) { 
    palat[i].addEventListener("click", siirra_pala); 
    palat[i].addEventListener("mouseover", mouseOver); 
    palat[i].addEventListener("mouseout", mouseOut); 
} 
}; 
+0

也許您在開始填充樣式屬性之前缺少'pala.style = {}'。 – 2015-04-05 10:44:45

+1

你在哪裏叫'siirra_pala'和什麼論點? – Bergi 2015-04-05 10:46:17

+0

@OmriAharon:不,pala是一個div,並且已經有'.style'屬性了 – Bergi 2015-04-05 10:46:45

回答

2

從你的錯誤看起來pala是未定義的(未設置,不存在),至少不在該函數的範圍內。

變量pala是在一個函數內創建的,並且在此函數中只有已知的。你想要做的就是捕獲點擊事件,並將點擊事件傳遞給函數。

如果更改調用函數..

palat[i].addEventListener("click", function() { siirra_pala(this) }); 

參考應該沒問題。

+1

修復程序會執行此操作。然而,你寫的第一行是不正確的 - pala實際上是根據錯誤來定義的,因爲錯誤說'未定義的頂部',這意味着'style'屬性是未定義的。 – 2015-04-05 11:17:05

+0

實際上,在幾次測試之後:這似乎是因爲當@multi將eventlistener綁定到函數時,沒有參數時,事件被作爲參數'MouseEvent {dataTransfer:null..'發送。所以,雖然「pala」是一些東西,但並不是預期的。 jsfiddle.net/tv22wydd – Mackan 2015-04-05 11:48:17

+0

是的,這是真的:) – 2015-04-05 12:04:18

0

這裏:

palat[i].addEventListener("click", siirra_pala); 

傳遞給siirra_pala的參數是click事件,而不是點擊的元素。你應該修改你的函數,從事件對象中選擇單擊的元素屬性,或者簡單地使用this

看到這個:

document.getElementById('x').addEventListener("click", handler); 
 

 
function handler(e) { 
 
    console.log(e);  // full event object 
 
    console.log(this); // clicked element 
 
    this.style.background = "#aaa"; 
 
}
#x { 
 
    width: 50px; 
 
    height: 50px; 
 
    background: #eee; 
 
}
<div id="x"></div>


因此,對於你的功能修復將是這樣的:

function siirra_pala(pala) { 
    var palaRivi = parseInt(this.style.top)/palanKoko; 
    var palaSarake = parseInt(this.style.left)/palanKoko; 
} 

(請記住,這個功能不是很有用)