robot
最新文章(10)
Mqskit 和其它相關工具
CPython 的 GC 二、三事
寫 Mecurial Extension 是件快樂的事!
Mozilla 台灣辨公室徵人啟事
關於 Apple 的兩項專利
core dump 之前的 frame
怎麼發出 beep 聲?
先承認你要找的是奴才吧!
程式碼要清的多乾淨?
FreeBSD 的 Thread-Local Storage 實作
首頁
新編
最新留言
Entries RSS
重要關鍵字(10)
coding (122)
Python (93)
FreeBSD (71)
WEB (61)
URL (48)
hardware (46)
javascript (36)
Linux (34)
blog (30)
C++ (16)
所有關鍵字
新增 URL
bookmarklet 物件插入網頁
by thinker
2 Columns
關鍵字:
WEB
javascript
coding
寫 bookmarklet 時,常會需要插入物件到目前網頁。簡單或少數的物件,當然可以使用 $javascript$ 和 DOM 進行插入。但是複雜、大量的物件,寫 code 插入是很辛苦的。最好是 linkname:load http://developer.mozilla.org/en/docs/XML_in_Mozilla 遠端的 $XML$ 或 XHTML 檔案,使用 linkname:[document.importNode()] http://developer.mozilla.org/en/docs/DOM:document.importNode 將之插入網頁。 但是,若嘗試 load 遠端的 $XML$ 或 XHTML 檔,會發現因安全性考量,無法載入,Browser 只許可載入和目前文件同一 host 的遠端文件。為解決這個困境,可使用工具將 $XML$ 或 XHTML 文件轉成 $javascript$ 程式,並在目前文件插入 script tag,指定 src 屬性至遠端 $javascript$ 文件的 $URL$,即可載入。 {{{ o = document.createElement("script"); o.setAttribute("src", "$URL$ to remote $javascript$ document"); document.getElementsByTagName("body").item(0).appendChild(o); }}} 下面是一個 $Python$ 程式,可將指定的檔案編譯成一個 $javascript$ function,以重建 XHML 檔案 body tag 底下的物件。該 function 的名稱被指定為 xhtml_foo(),而 foo 為主檔名,如 foo.xhtml 的主檔名為 foo。載入完成後 (可使用 onload event 得知載入完成),呼叫該 function 即傳回一個 div DOM 物件。該 DOM 物件包涵原 XHTML 文件,body tag 下所有的內容。 {{{ #!/usr/local/bin/python from xml.sax import make_parser from xml.sax.handler import ContentHandler, feature_validation, feature_externa from xml.sax.saxutils import prepare_input_source def get_attr_str(attrs): from string import join names = attrs.getNames() attr_strs = ['["' + name + '","' + attrs.getValue(name) + '"]' for name in return '[' + join(attr_strs, ',') + ']' class xhtml2js_handler(ContentHandler): def __init__(self, xhtml_name): ContentHandler.__init__(self) self.xhtml_name = xhtml_name self.in_body = False pass def startDocument(self): print 'function %s() {' % (self.xhtml_name) print '\tvar top, content = new Object();' print '\tvar stk = new Array();' print '\tvar add = function(n, attrs) {' print '\t\tvar i, o = new_elm(n);' print '\t\tfor(i = 0; i < attrs.length; i++) {' print '\t\t\tif(attrs[i][0] == "id") eval("content." + attrs[i][1] + "= print '\t\t\telse o.setAttribute(attrs[i][0], attrs[i][1]);' print '\t\t}' print '\t\tstk[stk.length-1].appendChild(o);' print '\t\tstk.push(o);' print '\t}' print '\tvar txt = function(str) {' print '\t\tvar o = new_text(str);' print '\t\tstk[stk.length - 1].appendChild(o);' print '\t}' print print '\ttop = new_elm("div");' print '\tstk.push(top);' print pass def endDocument(self): print print '\ttop.xhtml_content = content;' print '\treturn top;' print '}' pass def startElement(self, name, attrs): if not self.in_body: if name.lower() == 'body': self.in_body = True pass return def endElement(self, name): if not self.in_body: return if name.lower() == 'body': self.in_body = False return self.close_node(name) pass def open_node(self, name, attrs): attr_str = get_attr_str(attrs) print '\tadd("%s", %s);' % (name, attr_str) pass def close_node(self, name): print '\tstk.pop();' pass def characters(self, content): if not self.in_body: return if not content.isspace(): print '\ttxt("%s");' % (content) pass pass pass if __name__ == '__main__': from sys import argv def filename_to_scriptname(name): from os.path import basename from string import maketrans name = basename(name) trans = maketrans('-$$ ', '___') r = 'xhtml_' + name.split('.')[0].translate(trans) return r fn=argv[1] fo = file(fn) parser = make_parser() parser.setFeature(feature_validation, False); parser.setFeature(feature_external_ges, False); parser.setFeature(feature_external_pes, False); handler = xhtml2js_handler(filename_to_scriptname(fn)); parser.setContentHandler(handler) parser.parse(prepare_input_source(fo)) pass }}}
最後更新時間: 2006-10-23 11:03:26 CST |
引用
查詢:
COMMENTS: