Gå til innhold

Anbefalte innlegg

Skrevet (endret)

http://swchat.nostdal.org:6123/swchat/main.html

 

kildekode:

Skjult tekst: (Marker innholdet i feltet for å se teksten):

;;;; http://nostdal.org/SWChat/ ;;;;

 

(defpackage SWChat

  (:use :cl :SymbolicWeb :AmUtil))

(in-package :SWChat)

 

 

(defparameter *max-length* 100000)

 

 

(defclass SWChat (Application)

  ((username :accessor username-of

            :initform (concatenate 'string "anonymous-" (SW::generateID)))

 

  (messages :accessor messages-of :allocation :class

            :initform "")

 

  (participants :accessor participants-of :allocation :class

                :initform (make-instance 'AppGroup)))

 

  (:default-initargs

  :name "SWChat"

  :static-path "/home/lars/programming/lisp/swchat/static/"))

(export 'SWChat)

 

 

 

(defmethod initialize-instance :after ((app SWChat) &key)

  ;; TODO: Some way the instances get removed from the group.

  (add app (participants-of app))

 

  ;; Set up handlers.

  (setf (handler-of app "say") 'say)

  (setf (handler-of app "redraw") 'redraw))

 

 

 

(defmethod scrollView ((app Ajax))

  "Scroll view so one sees the last message arrived."

  (evalJS app "getElt('messages').scrollTop = getElt('messages').scrollHeight;"))

 

 

 

(defmethod redraw ((app SWChat))

  (setElement app "messages" (messages-of app))

  (setValue app "nick" (mkstr "anonymous-" (SW::generateID)))

  (scrollView app))

 

 

 

(defmethod say ((app SWChat) (message string) (nick string))

  (setf message (mkstr "<br/>" nick ": " (AmWeb:escapeHTML (AmWeb:urlDecode message))))

 

  ;; Update server side..

  (setf (messages-of app)

        (concatenate 'string (messages-of app) message))

 

  ;; ..but make sure it doesn't store too much.

  (when (> (- (length (messages-of app)) *max-length*) 0)

    (setf (messages-of app)

          (subseq (messages-of app)

                  (- (length (messages-of app)) *max-length*)

                  (length (messages-of app)))))

 

  ;; Send message to `app' (the one who sent the message originally).

  (appendToElement app "messages" message)

  (scrollView app)

 

  ;; Send message to every other client.

  (appendToElement (participants-of app) "messages" message)

  (scrollView (participants-of app))

  (dispatch (participants-of app) app))

 

edit:

oh, jeg har kun bekreftet at denne fungerer under Firefox og Opera (noen småbugs i Opera fortsatt, men ok) .. en på IRC nevnte at den fungerte under Safari og Konqueror også

 

om noen er interesserte i et samarbeid m.t.p. design eller lignende er det bare å ta kontakt :) (jeg har et par andre eksempler liggende også ..)

Endret av dayslepr
Videoannonse
Annonse
Skrevet (endret)

nå skal denne fungere under både Firefox (1.5.0.3), Opera (9.00 beta) og Internet Explorer (6.0.2800.1106) .. :)

 

edit:

err .. Opera er ikke heeelt på plass ennå :ermm:

Endret av dayslepr
Skrevet (endret)

hm, det er ikke noen som har litt greie på AJAX/JavaScript i Opera her?

 

denne applikasjonen http://nostdal.org:6123/hello-world/hello-world.html skal oppdatere tallet ved siden av "The time is: " hvert sekund, men under Opera så skjer ikke dette

 

  debugMsg("debug", "server-initiated: about to send new request");
 window.xhr_si.onreadystatechange = siHandler;
 window.xhr_si.open("POST", "?type=server-initiated", true);
 window.xhr_si.setRequestHeader('Content-Type',
                                'application/x-www-form-urlencoded; charset=UTF-8');
 window.xhr_si.setRequestHeader('User-Agent', navigator.userAgent);
 window.xhr_si.send("");
 debugMsg("debug", "server-initiated: new request sent");

 

siHandler, readyState: 1

server-initiated: about to send new request

siHandler, readyState: 4

siHandler, readyState: 3

updateElements, response_text: '[["setElement","time",3357397454],["setElement","session-id","4677"]]'

sndReq: '[["redraw"]]'

queueReq: '[["redraw"]]'

server-initiated: new request sent

siHandler, readyState: 1

server-initiated: about to send new request

 

siste debug-melding er øverst .. det som er snedig, er at etter jeg har kallt abort og skal resende http-requesten (ajax dette) så sender den ikke, den blokker og siste melding blir da "about to send new request" - altså den blir aldri sendt .. har noen peil på dette? IE og FF fungerer som de skal

 

edit: rop om mer info trengs!

Endret av dayslepr

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...