2009-09-01 2 views
0

Ich schreibe mir ein kleines Spiel in JavaScript, mit jQuery. Das Spiel hat eine Tafel mit Zellen darin, ähnlich wie Minesweeper: Der Benutzer klickt auf eine Zelle und seine Daten müssen in irgendeiner Weise geändert werden. Jede Zelle wird durch ein einfaches Bild dargestellt, aber es sind noch mehr Daten damit verbunden.Grid Sizer mit jQuery

Was ich in erster Linie brauche ist, wenn der Benutzer eine Zelle klickt, muss ich irgendwie die Zeile und Spalte, die angeklickt wurde bestimmen, manipulieren Sie die Daten entsprechend und ändern Sie die Ansicht. Wenn Sie den Click-Handler auf jede einzelne Zelle setzen, erscheint dies wie ein Overkill. Wenn Sie jedoch den Click-Handler auf die gesamte Tabelle setzen, wird PITA, um zu bestimmen, auf welche Tabellenzelle geklickt wurde.

Wie würden Sie mit solch einer Situation umgehen? Vielleicht gibt es schon ein Plugin, das die ganze Sache vereinfachen kann?

Antwort

1

Dies ist ein perfektes Beispiel für eine großartige Verwendung der live()-Funktion. Um die x- und y-Positionen finden müssen Sie nur die Anzahl der Zellen über Zeilen zählen, bevor oder diese:

$('#minesweeperTable td').live('click', function() { 
    var $this = $(this), 
     xPos = $this.prevAll('td').length, 
     yPos = $this.closest('tr').prevAll('tr').length 
    ; 
    // your code here 
}); 

Das beste daran ist, dass, egal wie viele Zellen, die Sie haben, gibt es nur ein Ereignis Handler, was für viel bessere Leistung macht.

+1

@nickf, es kann eine Zeile Code sein, aber Sie müssen berücksichtigen, wie viel Speicher hinter den Kulissen zugewiesen wird, bedeutet Schwere nicht, wie viele Zeilen Sie schreiben. – Sinan

+0

@sinan: es überquert die Knoten aufwärts, wahrscheinlich irgendwo im Bereich von 1-30 Knoten. Ich denke, dein PC kann damit umgehen. – nickf

+0

@nickf, Sie haben Recht, wenn es 30 Knoten oder sogar 300 Knoten gibt, was ist, wenn jede Zelle 10 mal 10 Pixel groß ist? Wenn der Spielbereich 1000x1000 ist, können Sie berechnen, wie viele Knoten es gibt, aber eine einfache mathematische Funktion kann leicht berechnen, auf welcher Zelle der Klick ausgelöst wird, weil Sie wissen, wie groß die Zellen sind. Beste. Sinan. – Sinan

2

Fügen Sie den Click-Handler für die gesamte Tabelle hinzu. Verwenden Sie event.target, um die angeklickte Zelle zu erhalten. Fügen Sie jeder Zelle ein Attribut hinzu, das Ihnen sagt, welche Zeile/Spalte es ist. Auf diese Weise müssen Sie kein massives/schweres JS ausführen, um es herauszufinden.

psuedocode:

$("table.game").click(function(e){ 
    var cell = e.target; 
    var pos = $(cell).attr("name").split["_"]; 
    var x = pos[0]; 
    var y = pos[1]; 
    return false; 
}); 

Markup:

<table class="game"> 
    <tbody> 
    <tr> 
    <td name="0_0"> 
    sdfasdfa 
    <td> 
    </tr> 
    </tbody> 
</table> 

Anmerkung: mit einem Namen mit einer Ziffer ist nicht gut starten, so fix wie

benötigt
+0

Über was "massive/schwere JS" sprichst du genau? Sehen Sie meine Antwort für wie einfach es ist. – nickf

+1

maksymko sagte, dass er ein Bild in jeder Zelle hat, so dass 'e.target' das Bild sein könnte und in diesem Fall wird diese Methode nicht funktionieren. Nee? – p4bl0

+0

Setzen Sie in diesem Fall das name-Attribut des Bildes auf die Zellenkoordinaten. Problem gelöst – mkoryak

0

Wenn Ihre Tabelle dynamisch erzeugt (js oder PHP zum Beispiel) Sie könnten jede Zelle mit einer Klasse und/oder ID-Attribute, die Ihnen die Informationen gaben.

Ich weiß nicht, wie Sie Ihre Zellen so in Pseudo-Code darstellen:

<table id="board"> 
    <row> 
    <cell id="cell-0x0" /> 
    <cell id="cell-0x1" /> 
    ... 
    </row> 
    <row> 
    <cell id="cell-1x0" /> 
    ... 
    </row> 
    ... 
</table> 

dann in jQuery:

$('#board cell').click(function(){ 
    var coord = $(this).attr('id').substr(5).split('x'); 
    // do your stuff 
}); 
0

Wenn Sie zu viele Tabellenzellen haben die Click-Handler einstellen würde schwer, aber Sie können einen Workaround zur Berechnung der Box-Nummer von Mausklick event.page.X und event.page.Y machen dies gibt Koordinaten angeklickt Pixel auf Ihrem Bildschirm und Sie können berechnen, welche Box unter diesem Pixel ist.

Oder

Sie können auch die bekommen den Knoten geklickt verwenden event.target.

auschecken jquery.event.

hoffe es hilft, Sinan.

+0

check out 'jquery.live()' – nickf

+0

+1, weil ich nicht denke, was Sie sagten, ist dumm, noch eine schlechte Anwser und ich sehe nicht, warum es downvoted wurde. – p4bl0

+0

das gleiche für Sie, manchmal können Sie nicht verstehen, was Leute hier oben sind, vergiss es. – Sinan

0

Die Click-Event-Bubbles und das ursprüngliche Ziel können in der srcElement-Eigenschaft des Event-Objekts gefunden werden (ich denke, oder es könnte eine andere Eigenschaft sein, aber es ist da).