Antworten auf deine Fragen:
Neues Thema erstellen

[jQuery] replacewith in einer Tabelle

didi01

Aktives Mitglied

Hallo zusammen,

ich habe eine Datenbankabfrage und lasse das Ergebnis in einer Tabelle anzeigen. Bei einer Spalte möchte ich, dass der User durch anklicken die Werte über ein sogenanntes "In Place Editing" bearbeiten und abspeichern kann.

Für ein einzelnes Label außerhalb einerTabelle habe ich das mit folgemdem Code auch schon realisieren können.

PHP:
<div id="change">Test!</div>

<script>
   $("#change").click(function () {
        $(this).replaceWith("<input type='text' name='ls_nr' size='6'    maxlength='6' value='" + $(this).text() + "'>&nbsp;<input type='submit' name='aendern1' value='Ändern'>" );
  });
  </script>
]Wenn ich innerhalb eines <td> in der Tabelle den zu ändernden Wert in das <div> mit der id="change" packe passiert nichts, egal ob ich die click(function) innerhalb oder außerhalb der Tabelle habe.

Ich habe auch schon gesehen das es ein jQuery Plugin gibt das dies können soll. (tEditable). Dies scheint es aber nicht mehr zu geben.

Meine Frage ist nun wie realisiere ich dieses In Place Editing innerhalb einer Tabelle.

Vielen Dank für Eure Hilfe im Voraus

Gruß
didi01
 

didi01

Aktives Mitglied

AW: [jQuery] replacewith in einer Tabelle

Hi Duddle,

danke für den Hinweis. Ich werd's dann ausprobieren.

Ich habe allerdings an der reinen jQuery Version weiter gemacht, und es geschafft, die divs in ein Input Feld umzuwandlen. Das ging dann nur weil die divs einen eindeutigen namen benötigten. Ich habe dazu einfach eine Zählvariable an den Namen angehangen. sh. Code.

PHP:
<td class="label3"><div id="lsnr_change<?php echo $i;?>"><?php echo $data[1];?></div></td>
Über einen AJAX request ist es mir auch gelungen, den Inhalt des neu erzeugten Input Feldes beim Event onblur in die Datenbank zu schreiben.

Jetzt habe ich noch 2 Probleme.

  1. Das ganze funktioniert im Moment nur wenn ich nur 1 div in ein input Feld umwandele.
  2. Ich möchte, wenn ich ein anderes div anklicke, oder einfach mit TAB verlasse, dass das div welches ich vorher angeklickt und zu einem input Feld wurde, wieder in ein div zurückverwandelt wird.
Kann mir da bitte nochmal jemand helfen.

Gruß
didi01
 

saila

Moderatorle

AW: [jQuery] replacewith in einer Tabelle

Hi,

im Grunde ist das recht simpel. Du hast deinen Content sicherlich auch in einem div-container. Dieser hat hoffentlich eine id. Wenn nicht vergebe eine wie z.B. id="content". Danach machst du beim Click-Event, welchen du ja schon umgesetzt hast zuvor per $('#content').find('input:text').replaceWith('<div>bla</div>'); und lässt dein rest (ajax) weiter durchlaufen.

Einfacher wäre es noch, wenn du dem neu erzeugten input-type text eine id vergibst. Das macht find noch schneller bzw. du kannst direkt per $('#deine_vergebene_input_tag_id').replaceWith(); über die id auf den sicherlich einzig existierenden input-type-text zugreifen und wieder ersetzen.
 

didi01

Aktives Mitglied

AW: [jQuery] replacewith in einer Tabelle

Hi,

im Grunde ist das recht simpel. Du hast deinen Content sicherlich auch in einem div-container. Dieser hat hoffentlich eine id. Wenn nicht vergebe eine wie z.B. id="content". Danach machst du beim Click-Event, welchen du ja schon umgesetzt hast zuvor per $('#content').find('input:text').replaceWith('<div>bla</div>'); und lässt dein rest (ajax) weiter durchlaufen.

Einfacher wäre es noch, wenn du dem neu erzeugten input-type text eine id vergibst. Das macht find noch schneller bzw. du kannst direkt per $('#deine_vergebene_input_tag_id').replaceWith(); über die id auf den sicherlich einzig existierenden input-type-text zugreifen und wieder ersetzen.

Hallo,

so habe ich es auch gestern noch hinbekommen, die einzige Schwierigkeit die ich noch hatte war, dass ich einen Wert nur einmal ändern konnte. Das lag daran, dass das mit replaceWith erzeugte Element noch nicht im DOM eingebunden war. Ich habe dann aber im Netz die Info gefunden, dass es ein jQuery Plugin gibt mit dem Namen Livequery. Dies Plugin löste dieses Problem dann auch noch.

Ich habe gestern das Ganze noch nochmal zusammengefasst und niedergeschrieben. Nun stellt sich mir die Frage, soll ich das Ergebnis hier in dieser Diskussion posten, oder tatsächlich als Tutorial veröffentlichen.

Besteht überhaupt Interesse an so einem Tutorial?

Gruß
didi01
 

sokie

Mod | Web

AW: [jQuery] replacewith in einer Tabelle

eigentlich solltest du so ein Problem mit den jQuery Mitteln ohne hesondertes Plugin hinbekommen. Seit der Version 1.4 gibt es dafür die live()-Methode .live() ? jQuery API
 

didi01

Aktives Mitglied

AW: [jQuery] replacewith in einer Tabelle

eigentlich solltest du so ein Problem mit den jQuery Mitteln ohne hesondertes Plugin hinbekommen. Seit der Version 1.4 gibt es dafür die live()-Methode .live() ? jQuery API

Hi sokie,

die Version von jQuery die verwende ist 1.3.2, dort war die live()-Methode offensichtlich noch nicht eingebaut. Die betreffende Programmzeile die ich nach einfügen des LiveQuery Plugins gemacht habe sieht folgendermaßen aus.

PHP:
$("#lsnr_change<?php echo $i;?>").live('click',function() {
Ich werde mir mal die neuste Version von jQuery besorgen, und dann das ganze ohne das Plugin neu machen. Der Aufruf ist wahrscheinlich dann noch identisch.

Auf jeden Fall vielen Dank für Info.

Gruß
didi01
 

saila

Moderatorle

AW: [jQuery] replacewith in einer Tabelle

Hi,

für das Vorhaben wird im Grunde keine live() methode erforderlich sein. Du inizialisierst ja vorweg die Funktion und somit ist die einzigste Frage, wie du auf das immer wieder neu erzeugte :text-Object zugreifen kannst. Das wiederum kannst du mit find().

Die live()-Methode hat je nach Einsatz einen expliziten nebeneffekt. Wenn zum Beispiel ein change oder click-Event an das Objekt per live angehängt wird, führt dies beim wiederholten aufruf zu mehrfachausführungen des jeweiligen Events. Dies wiederum wäre dann mit unbind zu lösen. Eine Alternative stellt find() dar.
 

didi01

Aktives Mitglied

AW: [jQuery] replacewith in einer Tabelle

Hi,

für das Vorhaben wird im Grunde keine live() methode erforderlich sein. Du inizialisierst ja vorweg die Funktion und somit ist die einzigste Frage, wie du auf das immer wieder neu erzeugte :text-Object zugreifen kannst. Das wiederum kannst du mit find().

Die live()-Methode hat je nach Einsatz einen expliziten nebeneffekt. Wenn zum Beispiel ein change oder click-Event an das Objekt per live angehängt wird, führt dies beim wiederholten aufruf zu mehrfachausführungen des jeweiligen Events. Dies wiederum wäre dann mit unbind zu lösen. Eine Alternative stellt find() dar.

Hi,

das mit dem find habe ich jetzt nicht richtig verstanden. Wenn ich jetzt das live gegen das find austausche passiert gar nichts mehr.

PHP:
// Vorher
$("#lsnr_change<?php echo $i;?>").live('click',function() {

// Nachher
$("#lsnr_change<?php echo $i;?>").find('click',function() {
Die Konsole von Firebug sagt auch nichts.

Gruß
didi01
 

saila

Moderatorle

AW: [jQuery] replacewith in einer Tabelle

Hi,

da bin ich über das Ziel geschossen :) find() ist nicht erforderlich!

Du generierst ja einen neuen input-type:text. In diesem ist die js-Funktion enthalten:
onblur(this). Also
Code:
<input type="text" name="edit" value="" onblur="edit(this)" />

Die Funktion edit(obj) wäre somit als neue Funktion noch zu definieren. Abgesehen davon müsste die Logik ansich noch erweitert werden. Eigentl. könntest du um den input-type text ein form setzen, was das auslesen für die ajax-methode verbessern würde. Den du benötigst noch eine id, welche dir sagt, welche Zeile in der DB zu ändern ist. Und diese ID könnte als input type:hidden gesetzt werden.

Zurück zu onblur. Verliert das objekt den Focus, wird dann die in dir definierte ajax-Funktion ausgelöst. Gleiches könntes du bzgl. keyup (code 13) setzen (also Enter drücken).

Es ist gut möglich, dass dies etwas viel oder verwirrend ist. Wenn ich kurz Zeit finde, führe ich einen Speispielcode auf, welcher du zum Testen verwenden kannst.
 

didi01

Aktives Mitglied

AW: [jQuery] replacewith in einer Tabelle

Es ist gut möglich, dass dies etwas viel oder verwirrend ist. Wenn ich kurz Zeit finde, führe ich einen Speispielcode auf, welcher du zum Testen verwenden kannst.

Hi,
nö, ist nicht verwirrend. Sorry, dass ich erst jetzt antworte, aber ich habe diese Diskussion nicht aus den Augen den Augen verloren.

Wie gesagt, ich habe mich ja schon durchgebissen und eine Lösung. Um das ganze ein wenig klarer zu machen, liste ich hier mal jetzt die wichtigsten Codezeilen auf.

In meiner Startseite habe ich zurerst die jQuery.js Datei, Das XMLHTTP ReqestObject und eine weitere Javascript Datei in der der Request und der handle respose gestartet wird eingebunden.

PHP:
<script src="./include/jquery-1.4.2.min.js" type="text/javascript"></script>
<script language="JavaScript" src="xmlhttprequestobjekt.js"></script>
<script language="Javascript" src="change_name.js"></script>
Die Schleife die mir die Ergebnisse anzeigt sieht folgendermaßen aus

PHP:
$i = 1;
while($zeile = $res->fetch_object()) {
?>

    <tr>
        <td><?php echo $zeile->vorname;?></td>
        <td><div id="back<?php echo $i;?>"><div id="change<?php echo $i;?>" style="cursor: hand;"><?php echo $zeile->nachname;?></div></div></td>
    </tr>

    <script>
        $("#change<?php echo $i;?>").live('click',function() {
          $(this).replaceWith("<input type='text' id='nachname' name='nachname' onblur='sndReq();'  value='" + $(this).text() + "'>&nbsp;<input type='hidden' name='rf' value='<?php echo $i;?>'>&nbsp;<input type='hidden' name='ds_id' value='<?php echo $zeile->id?>'>" );
          document.FORMULAR.nachname.focus();
        });
    </script>

<?php
$i++;
}
in dem onBlur Event wird die Function sndRec() aufgerufen die in der Datei change_name.js ist. Der Inhalt dieser Datei sieht folgendermaßen aus.

PHP:
function sndReq() {
    var nachname = document.FORMULAR.nachname.value;
    var ds_id = document.FORMULAR.ds_id.value;
    var rf = document.FORMULAR.rf.value;
                
    
    resObjekt.open('get', 'change_name.php?ds_id=' + ds_id + '&rf=' + rf + '&nachname=' + nachname , true);
    resObjekt.onreadystatechange = handleResponse;
    resObjekt.send(null);    
}

function handleResponse() {
    if(resObjekt.readyState == 4) {
        rf = document.FORMULAR.rf.value;
        document.getElementById('back' + rf).innerHTML = resObjekt.responseText;
    }
}
Hier werden jetzt die Inhalte der mit replaceWith erzeugten Textfelder in eine Variable gepackt und an die PHP Datei weitergeleitet die mir dann die Änderung in der Datenbank macht. Diese PHP Datei hat den Namen change_name.php und hat folgenden Inhalt.

PHP:
// Abspeichern des neuen Wertes
$sql = "UPDATE mitarbeiter SET nachname = '".$nachname."'
        WHERE id = '".$ds_id."'";
$res = $mysqli->query($sql);

// Auslesen des soeben gänderten Wertes
$sql = "SELECT id, vorname, nachname
        FROM mitarbeiter
        WHERE id = '".$ds_id."'";
$res = $mysqli->query($sql);
$zeile = $res->fetch_object();
?>

<div id="change<?php echo $rf;?>"><?php echo $zeile->nachname;?></div>
Zuerst wird der geänderte Wert in die Datenbank geschrieben. Danach hole die Änderung wieder heraus (kann man sich wahrscheinlich auch sparen und direkt die Variable aus der Update Anweisung nehmen.). Der div Container ist der Teil, der über den handle response wieder an die Startseite zurückgegeben wird und das Textfeld wieder umwandelt, so dass man wieder die normale Ausgabetabelle angezeigt wird. Jetzt aber mit dem geänderten Wert.

In diesem Code habe ich noch (hier jetzt nicht zu sehen) nachträglich an das onsubmit Event des Formulares auch die Function sndRec(). Damit wenn der User nach der Änderung die Return Taste drückt das ganze immer noch funktioniert. Und es klappe alles wunderbar.

Wenn Du allerdings eine elegantere (bessere) Lösung hast, bin ich natürlich auch daran intersssiert.

Gruß
didi01
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben