Ich versuche, ein Tictactoe-Projekt in jQuery zu erstellen, und ich habe ein großes Problem ...
Die Kacheln befinden sich in <td>
- Tags und ich versuche, dies so zu gestalten, dass der Benutzer beim Klicken auf die Kachel die Funktion "markiert" aufruft.
Wenn wir uns nun die "markierte" Funktion ansehen, soll $(this)
der Knoten <td>
Sein, von dem aus die Funktion aufgerufen wurde.
Da es jedoch nichts tat, überprüfte ich die Konsole und anscheinend enthielt $(this)
das DOM Window-Objekt.
Kann ich trotzdem die richtige Art von $(this)
an die "markierte" Funktion senden?
Vielen Dank!
<script type="text/javascript">
var TURN_X = false;
var TURN_O = true;
var turn = false; // this is to see whos turn it is.
$(document).ready(function(){
var listCells = $.makeArray($("td"));
$("td").click(function(){marked(listCells)}); //THIS IS WHERE I HAVE PROBLEMS
return false;
});
function marked(arr)
{
console.log($(this)); // THIS CONSOLE LOG RETURNS "DOM Window"
$(this).addClass("marked");
if(turn == TURN_X)
{
this.innerHTML = "X";
turn = false;
}
else
this.innerHTML = "O";
var tileNum = $(this).attr("id");
}
Ihr Code folgt nicht den richtigen Grundsätzen.
$(function(){
var TURN_X = "X",
TURN_O = "O",
turn = TURN_O,
$listCells = $("td");
function marked() { // define event handler
var $this = $(this),
tileNum = $this.attr("id");
if ( !($this.hasClass("marked") ) {
$this.addClass("marked").text(turn);
turn = (turn == TURN_X) ? TURN_O : TURN_X;
}
}
$listCells.click(marked); // attach event handler
});
this
für Sie verwaltet. this
ist immer das, was Sie erwarten, wenn Sie Rückruffunktionen direkt übergeben, anstatt sie selbst aufzurufen.Senden Sie das Element, das das Ereignis auslöst, an die folgende Funktion:
$("td").click(function(){
marked($(this));
return false;
});
und in der Funktion:
function marked(td)
{
console.log($(td));
$(td).addClass("marked");
//....
}
Einfacher gesagt, benutze bind:
$(".detailsbox").click(function(evt){
test.bind($(this))();
});
function test()
{
var $this = $(this);
}
Versuchen:
$("td").click(function(event){
marked(listCells, $(this));
});
Dann:
function marked(arr, sel) {
console.log($(this));
sel.addClass("marked");
if(turn == TURN_X) {
this.innerHTML = "X";
turn = false;
} else {
this.innerHTML = "O";
}
var tileNum = $(this).attr("id");
}
$(document).ready(function(){
var TURN_X = false,
TURN_O = true,
turn = false,
listCells = $.makeArray($("td"));
$("td").click(function() {
marked(listCells, this)
});
function marked(arr, self) {
$(self).addClass("marked");
if(turn == TURN_X) {
self.innerHTML = "X";
turn = false;
}else{
self.innerHTML = "O";
var tileNum = self.id;
}
}
});
versuche dies:
$(function(){
var listCells = $.makeArray($("td"));
$("td").click(function(){marked($(this),listCells)});
});
function marked(o,arr)
{
...
Sie können die call
-Methode verwenden, um den Bereich für die Funktion anzugeben:
$("td").click(function(){ marked.call(this, listCells); });
Jetzt kann die Funktion marked
mit dem Schlüsselwort this
auf das angeklickte Element zugreifen.
Sie müssen $(this)
an Ihre Funktion übergeben:
$("td").click(function(){ marked(listCells, $(this))} );
Und ändern Sie Ihre Funktion wie folgt:
function marked(arr, that)
{
that.addClass("marked");
if(turn == TURN_X)
{
that.innerHTML = "X";
turn = false;
}
else
that.innerHTML = "O";
var tileNum = that.attr("id");
}