- From: Michael A. Puls II <shadow2531@gmail.com>
- Date: Fri, 20 Nov 2009 06:25:25 -0500
- To: "Julian Reschke" <julian.reschke@gmx.de>, public-html@w3.org
- Cc: "Maciej Stachowiak" <mjs@apple.com>
On Thu, 19 Nov 2009 10:09:45 -0500, Julian Reschke <julian.reschke@gmx.de> wrote: > Michael A. Puls II wrote: >> ... >> I tried the following with Opera: >> (function() { >> var oldCreateElement = Document.prototype.createElement; >> Document.prototype.createElement = function() { >> var args = arguments; >> if (args.length !== 1 && args.length !== 2) >> throw new Error("WRONG_ARGUMENTS_ERR"); >> if (args.length === 2) >> return this.createElementNS(args[0], args[1]); >> var pattern = /^\{(.+)\}(.+)$/g; >> var ref = this; >> var el = null; >> args[0].replace(pattern, function(match, ns, name) { >> el = ref.createElementNS(ns, name); >> }); >> return el !== null ? el : oldCreateElement.call(this, args[0]); >> }; >> })(); >> var x = document.createElement("{http://www.w3.org/1999/xhtml}div"); >> var y = document.createElement("http://www.w3.org/1999/xhtml", "div"); >> var z = document.createElement("div"); >> alert(x); >> alert(y); >> alert(z); >> Using the first way seems pretty cool by me fwiw. >> ... > > Very cool. A correction for "{}div": (function() { var oldCreateElement = Document.prototype.createElement; Document.prototype.createElement = function() { var args = arguments; if (args.length !== 1 && args.length !== 2) throw new Error("WRONG_ARGUMENTS_ERR"); if (args.length === 2) return this.createElementNS(args[0], args[1]); var el = null; var ref = this; args[0].replace(/^\{(.*)\}(.+)$/, function(match, ns, name) { if (ns === "") el = oldCreateElement.call(ref, name); else el = ref.createElementNS(ns, name); }); return el !== null ? el : oldCreateElement.call(this, args[0]); }; })(); var x = document.createElement("{http://www.w3.org/1999/xhtml}div"); var y = document.createElement("http://www.w3.org/1999/xhtml", "div"); var z = document.createElement("div"); var a = document.createElement("{}div"); alert(x); alert(y); alert(z); alert(a); (use HTMLDocument for both spots if you want that to work in Firefox) Other functions like getElementsByTagName, getAttributeNS and createAttributeNS could work the same way where you use "{ns}name", or separate args for ns and name, or just 'name' for the default namespace. Then, if the ua wants to store everything internally as "{ns}name", the NS functions could make sure to create "{ns}name" from the separate ns and name args before doing creation or lookup. And, in the non-NS functions, if they got the "{ns}name" form, they'd do the creation/lookup directly instead of splitting it apart into 2 arguments only to have the NS function put it back together before doing the creation/lookup (as an optimization). Something like that anyway. -- Michael
Received on Friday, 20 November 2009 11:26:00 UTC