;;;-*- Mode: Lisp; Package: HTTP-DEMO -*- (in-package :http-user) ;; ;; AJAX Test ;; ; JavaScript (define-script ajax (:Java-Script) :caller "\"submitRequest('/data?' + this.value, 'zone');\"" :script " function submitRequest(url, target) { var req = null; document.getElementById(target).innerHTML = 'Started...'; if (window.XMLHttpRequest) { req = new XMLHttpRequest(); if (req.overrideMimeType) { req.overrideMimeType('text/plain'); } } else if (window.ActiveXObject) { try { req = new ActiveXObject('Msxml2.XMLHTTP'); } catch (e) { try { req = new ActiveXObject('Microsoft.XMLHTTP'); } catch (e) {} } } req.onreadystatechange = function() { document.getElementById(target).innerHTML = 'Wait server...'; if(req.readyState == 4) { if(req.status == 200) { document.getElementById(target).innerHTML = req.responseText; } else { document.getElementById(target).innerHTML='Error: returned status code ' + req.status + ' ' + req.statusText; } } }; req.open('GET', url, true); req.send(null); }"))) ; Test data (defparameter *things* (let (things) (dotimes (x 10000 (reverse things)) (push (format nil "~r" x) things)))) (defun show-ajax (url stream) (declare (ignore url)) (let ((ajax-script (intern-script :ajax :java-script)) (title "AJAX Demo")) (with-successful-response (stream :html) (with-html-document (:stream stream) (with-document-preamble (:stream stream) (declare-title title :stream stream) (declare-script ajax-script stream)) (with-event-handlers (ajax-event (:java-script :key-up (event-caller ajax-script))) (with-document-body (:stream stream) (with-section-heading (title :stream stream) (accept-input 'string "text" :events ajax-event :label "Text:" :default nil :stream stream) (with-division (:id "zone" :stream stream))))))))) (defun first-n (n list) (if (> (length list) n) (subseq list 0 n) list)) (defun filter (text things) (remove-if-not #'(lambda (item) (if text (search text item) t)) things)) (defun emit-data (url stream) (with-slots (search-keys) url (let ((text (first url:search-keys))) (with-successful-response (stream :text) (with-paragraph (:stream stream) (dolist (item (first-n 10 (filter text *things*))) (write-string item stream) (break-line :stream stream))))))) (export-url "http://localhost:8000/ajax.html" :computed :response-function 'show-ajax) (export-url "http://localhost:8000/data?" :search :response-function 'emit-data) ; File version #| (define-script ajax (:Java-Script) :caller "\"submitRequest('/data?' + this.value, 'zone');\"" :location "http://localhost:8000/submitRequest.js") (export-url "http://localhost:8000/submitRequest.js" :java-script-file :pathname "submitRequest.js") |#