2015-04-05 81 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; 
} 

(请记住,这个功能不是很有用)