textvak dat iedereen kan aanpassen

Status
Niet open voor verdere reacties.

Example5

Terugkerende gebruiker
Lid geworden
9 mrt 2008
Berichten
2.172
beste...

ik ben op zoek naar een stukje code het maken van een tekstvak dat iedereen aan kan passen. dus simpelweg een soort commentbox, maar wanneer iemand er dan in typt de wordt dit opgeslagen en de volgende bezoekers zullen dit bericht dan ook zien.

heeft iemand hier een voorbeeldje van?

alvast bedankt
 
bedankt, maar dat is niet precies wat ik zoek.
wil ik wil is meer vergelijkbaar met http://www.yourworldoftext.com/

een groot tekstvak (zoals het commentvak hier), waar je gewoon je tekst in kan typen, en dat deze blijft staan. de volgende bezoeker kan de tekst dan zien, aanpassen, of er wat aan toevoegen.
 
Voor zoiets is de basis in ieder geval redelijk makkelijk te maken. Je hebt wel een server-side taal nodig om de inhoud van het tekstvak op te slaan en te onthouden voor een andere gebruiker. PHP is een goede optie. Heb je zoiets tot je beschikking?
 
ja dat snap ik allemaal nog wel, een tekstveldje kan ik wel maken en dat het met alleen html ook niet gaat lukken is ook duidelijk...

php, mysql etc heb ik allemaal tot mijn beschikking, alleen de kennis om het te maken nog niet.
 
Laatst bewerkt:
Hehe, k :P Moest het toch even vragen ^^

Oké, hier is een voorbeeldje, meer basic zie je ze bijna niet. Je kunt 't nog altijd stukken ingewikkelder maken. Natuurlijk wil je wat stijl toevoegen, maar verder kun je nog nadenken over dingen als synchronisatie. Wat gebeurt er bijvoorbeeld als twee gebruikers tegelijk nieuwe content opslaan?

index.htm
[JS]<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/javascript">

var Settings = {
PHP: "contentManager.php"
};

function main() {

var textarea = _("textarea", {innerHTML: getData()}, document.body);
var btn_save = _("input", {type: "button", value: "Opslaan"}, document.body);
btn_save.addEventListener("click", function() {
saveData(textarea.value);
}, false);

}
function saveData(data) {
send({
action: "SAVE",
data: data
});
}
function getData() {
return send({
action: "GET"
}).data;
}
function send(data) {

var xhr = new XMLHttpRequest();
xhr.open("POST", Settings.PHP, false);
xhr.send(JSON.stringify(data));
return JSON.parse(xhr.responseText);

}
var _ = (function() {

function extend(obj, ext) {
for (var p in ext) {
if (typeof ext[p] === "object") {
extend(obj[p], ext[p]);
}
else {
obj[p] = ext[p];
}
}
}
function _(tag, attributes, parent) {
var el = document.createElement(tag);
if (attributes) extend(el, attributes);
if (parent) parent.appendChild(el);
return el;
}

return _;

})();
window.onload = main;

</script>
<title></title>
</head>
<body></body>
</html>
[/JS]

contentManager.php
PHP:
<?php

class FileNotExistException extends Exception {
    public function __construct($fileName) {
        parent::__construct("File (" . $fileName . ") does not exist");
    }
}

function file_get_json  ($fileName) {
    $content = file_get_contents($fileName);
    if ($content === false && !file_exists($fileName)) {
        throw new FileNotExistException($fileName);
    }
    $json = json_decode($content, true);
    if ($json === null) {
        throw new Exception("No json in (" . $fileName . ")");
    }
    return $json;
}
function file_put_json  ($fileName, $data) {
    file_put_contents($fileName, json_encode($data));
}

function info($val) {
    global $_RESPONSE;
    array_push($_RESPONSE["info"], $val);
}
function warn($val) {
    global $_RESPONSE;
    array_push($_RESPONSE["warning"], $val);
}

define(DATA, "content.json");

try {

    $_POST = file_get_json("php://input");
    $_DATA = $_POST["data"];
    $_RESPONSE = array(
        "action" => $_POST["action"],
        "data" => null,
        "error" => null,
        "info" => array(),
        "warning" => array()
    );

    switch ($_POST["action"])
    {

        case "GET":
            $_RESPONSE["data"] = file_get_json(DATA);
            break;

        case "SAVE":
            file_put_json(DATA, $_DATA);
            break;

        default:
            throw new Exception("No such action (" . $_POST["action"] . ")");
            break;
    }
}
catch (Exception $e) {
    $_RESPONSE["error"] = $e->getMessage();
}

echo json_encode($_RESPONSE);

?>
 
bedankt voor de hulp robin, helaas werkt de code die jij linkte bij mij niet. hij geeft {"error":"No json in (php:\/\/input)"} op in php pagina aan en de index pagina blijft blank. zie ik iets over het hoofd?
 
Ohja, sorry :P Het ding verwacht ook nog een file "content.json", die in de eerste instantie alleen twee quotes bevat:

content.json
Code:
""

Daarna zou het tekstvak moeten werken via index.htm. contentManager.php hoef je niet te bezoeken in je browser, die wordt 'achter de schermen' door index.htm gebruikt om de data te laden en op te slaan ;)
 
bedankt! dat is inderdaad ongeveer wat ik wilde. ik ga nu een beetje op zoek naar aanpassingen om te zorgen dat ie automatisch opslaat en je overal kan beginnen en niet alleen zoals bij word aan het begin van een nieuwe zin ofzo

bedankt zo ver :)
 
Super :) Ik zal ook nog even in de goede richting wijzen ^^

Voor het automatisch opslaan wil je waarschijnlijk een "keyup"-event gebruiken voor de textarea. Het deel van de save-button in de functie main kun je weghalen. In plaats daarvan krijg je iets als
[JS]textarea.addEventListener("keyup", function() {
saveData(textarea.value);
}, false);[/JS]

Dan ga je waarschijnlijk merken dat als je heel snel typt, 't ding letters 'overslaat'. Dat heeft te maken met het feit dat het opslaan van de data synchroon gebeurt. Dat wil zeggen dat iedere keer dat je een toets loslaat, er gewacht wordt tot de inhoud van het tekstvak verstuurd is naar de server. De letters die je typt tijdens dat opslaan worden overgeslagen. Oplossing: asynchroon opslaan! :D Tutorial die ik een aanrader vind: http://www.w3schools.com/ajax/default.asp


Het overal-kunnen-beginnen-met-typen is iets meer werk. Je hebt wat code nodig die een aantal dingen voor je uitzoekt. Wanneer een gebruiker op je textarea klikt ("click"-event), wil je weten of er op het punt dat hij klikt al tekst staat. Zo ja: doe niks (default van de textarea is de caret plaatsen waar geklikt is). Zo nee: zorg dat de tekst aangevuld wordt tot het punt waar is geklikt (met spaties ofzo), en plaats daar de caret programmatisch.
[JS]textarea.addEventListener("click", function(e) {
var x = e.pageX; //x-coördinaat van de klik op de (!)pagina
var y = e.pageY; //y-coördinaat van de klik op de pagina

/* Uitzoekwerk... */
}, false);[/JS]

Gewoon wat ideeën... Ik weet niet hoeveel verstand je al van JavaScript hebt (en hoe snel je 't oppikt), maar als je ergens vastloopt horen we 't wel :)
 
ik ga het inderdaad eens proberen uit te vogelen, ben een beetje bezig met js dus zal inderdaad eens kijken hoe snel dat allemaal gaat
 
Heb trwns nog een beter (denk ik) idee voor het overal kunnen beginnen: vul gewoon in de eerste instantie het hele tekstvak op met spaties. Dan, voor iedere letter die je tikt ("keypress"-event), verwijder er ééntje achter de caret. Voor iedere backspace of het verwijderen van een geselecteerd stuk tekst, zet het aantal spaties ter lengte van die geselecteerde tekst weer terug achter de caret :)

Moet je je wel weer bedenken wat je wil doen als je typt vlak voor de tekst van een andere gebruiker. Wil je er gewoon overheen typen, is bovenstaande beschrijving gewoon van toepassing. Wil je 't laten opschuiven, dan moet je weer wat extra controles uitvoeren :P
 
Laatst bewerkt:
Oplossing: asynchroon opslaan! :D

Om de hoeveelheid overkill in XHR te verminderen, kan je misschien iets slimmers verzinnen, omdat je anders per keystroke een request krijgt. Dingen die me zo nu eventjes te binnen schieten zijn iets in de richting van:

  • een buffer: sla keystrokes + locatie op, en stuur elke 5 secondes (als er wat getyped is) de data naar de server. Client-side kan het uiteraard wel direct op het scherm verschijnen. Bij een unload event uiteraard de resterende data versturen
  • websockets, hoewel dit misschien ook wat overkill is



:thumb:
 
@robin. klinkt op zich goed maar je moet er wel rekening mee houden dat ik eigenlijk een gevuld scherm wil hebben. dus een tekstbox van paginabreedte en hoogte. een bezoeker met een lage resolutie zal dan minder spaties nodig hebben dan een full hd scherm... ook weer een probleempje.

klinkt inderdaad ook goed that guy, zal eerst nog wel even wat met js moeten puzzelen, want kan er bar weinig van. dus ga eerst nog eens een lading tuts volgen.
 
Well, dat world of text geval wat je eerder had gepost doet het via een heleboel divs en tables. De divs zijn volgens mij even groot als je scherm, en de tabel zit vol met karakters, een td voor elk karakter, en een table voor elke regel.

Nu vind ik dit zelf een beetje apart omdat het nogal een overkill aan elementen is, dus misschien kan je een elegantere oplossing vinden zoals canvas oid.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan