Gå til innhold

Anbefalte innlegg

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
Lenke til kommentar
Videoannonse
Annonse

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
Lenke til kommentar

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...