Content deleted Content added
Mike Dillon (talk | contribs) m rollback |
Mike Dillon (talk | contribs) fix broken browsers without createElementNS |
||
(15 intermediate revisions by the same user not shown) | |||
Line 1:
// <pre><nowiki>
function
var
var
var
var
var isFunction = function (o) { return isType(o, typeof function () {}); };
var isObject = function (o) { return isType(o, typeof new Object()); };
var isUndefined = function (o) { return isType(o, (function (x) { return typeof x })()); };
var isDefined = function (o) { return !isUndefined(o); }; // NOTE: null is "defined"
var isPrimitive = function (o) {
return isString(o) || isNumber(o) || isBool(o) || isFunction(o);
}
var isNode = function (o) { return isDefined(o) && o != null && isNumber(o.nodeType); }
// Default tag names to be installed into the namespace as functions
var
"bdo", "script", "style", "object", "param", "iframe", "link", "meta", "p",
"pre", "a", "div", "span", "ul", "ol", "li", "img", "hr", "br", "em", "strong",
"sup", "sub", "tt", "abbr", "acronym", "del", "ins", "cite", "blockquote",
"code", "table", "tbody", "tfoot", "tr", "th", "td", "col", "colgroup", "caption",
"form", "input", "select", "option", "optgroup", "button", "textarea",
"h1", "h2", "h3", "h4", "h5", "h6", "label", "canvas", "fieldset", "legend"
];
// Default event types
var defaultEventTypes = [
// HTML 4.0
"Abort", "Blur", "Change", "Click", "DblClick", "DragDrop", "Error",
"Focus", "KeyDown", "KeyPress", "KeyUp", "Load", "MouseDown",
"MouseMove", "MouseOut", "MouseOver", "MouseUp", "Move", "Reset",
"Resize", "Select", "Submit", "Unload"
];
// Create an anonymous namespace if none was provided
if (isUndefined(namespace)) namespace = {};
// Settings
var settings = {
"namespaceUri": "http://www.w3.org/1999/xhtml",
"invokeFunctions": true,
"tagNames": defaultTagNames,
"eventTypes": defaultEventTypes
};
// Override default settings with specified options
if (options) {
for (var p in options) {
settings[p] = options[p];
}
}
// If the browser doesn't understand createElementNS, fake it (God help them...)
if (isUndefined(document.createElementNS)) {
return document.createElement(name);
};
}
// Creates the DOM
var createDomElement = function(name) {
return document.createElementNS(settings.namespaceUri, name);
};
var defaultAttributeHandler = function (elem, attrName, attrValue) {
// Invoke function callbacks of zero or one argument and use their result as the new attrValue
if (settings.invokeFunctions && isFunction(attrValue) && attrValue.length <= 1) {
attrValue = attrValue(elem);
}
Line 48 ⟶ 76:
// Stringify non-string values
if (
attrValue = attrValue.toString();
}
Line 55 ⟶ 83:
elem.setAttribute(attrName, attrValue);
};
var createAttributeOverrideHandler = function (overrideName) {
return function (elem, attrName, attrValue) {
defaultAttributeHandler(elem, overrideName, attrValue);
};
};
var createEventHandlerAttributeHandler = function (overrideName) {
return function (elem, attrName, attrValue) {
if (!isFunction(attrValue)) {
attrValue = new Function(attrValue);
}
elem[overrideName || attrName] = attrValue;
};
};
var attributeHandlers = {};
for (var i in settings.eventTypes) {
var handlerName = "on" + settings.eventTypes[i];
var internalName = handlerName.toLowerCase();
// Force lower case
attributeHandlers[internalName] = createEventHandlerAttributeHandler();
// Allow mixed case (with lower case internal name)
attributeHandlers[handlerName] = createEventHandlerAttributeHandler(internalName);
}
// Conditionally add I.E. name overrides
/*@cc_on
attributeHandlers["for"] = createAttributeOverrideHandler("htmlFor");
attributeHandlers["maxlength"] = createAttributeOverrideHandler("maxLength");
attributeHandlers["class"] = createAttributeOverrideHandler("className");
attributeHandlers["accesskey"] = createAttributeOverrideHandler("accessKey");
attributeHandlers["style"] = function (elem, attrName, attrValue) {
elem.style.cssText = attrValue;
};
@*/
// Detects if the first element is a hash of attributes and if so,
Line 66 ⟶ 132:
}
//
if (args[0] == null) {
return 0;
}
//
return 0;
}
//
if (
return 0;
}
//
var attrs = args[0];
for (var attrName in attrs) {
defaultAttributeHandler(elem, attrName, attrs[attrName]);
} else {
attributeHandlers[attrName](elem, attrName, attrs[attrName]);
}
}
Line 95 ⟶ 161:
};
//
var elem = createDomElement(name);
// Process attribute hash, if any and skip the argument count returned
var firstChild = processDomAttributes(elem, arguments);
// Process the remaining children, if any
for (var i = firstChild; i < arguments.length; i++) {
var child = arguments[i];
if (child == null) {
continue;
}
// Convert any non-DOM nodes to text nodes with toString()
if (!isNode(child)) {
child = document.createTextNode(child.toString());
}
elem.appendChild(child);
}
return elem;
};
};
// Populate the namespace
for (var i in settings.tagNames) {
var tagName = settings.tagNames[i];
namespace[tagName] = createDomElementBuilder(tagName);
// Return the namespace for those relying on anonymous creation
return namespace;
}
// Build the Easy DOM functions in an anonymous namespace
easyDom = buildEasyDomNamespace();
// Namespace pollution
// </nowiki></pre>
|