builder.js
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:5k
源码类别:

Ajax

开发平台:

Others

  1. // script.aculo.us builder.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
  2. // Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
  3. //
  4. // script.aculo.us is freely distributable under the terms of an MIT-style license.
  5. // For details, see the script.aculo.us web site: http://script.aculo.us/
  6. var Builder = {
  7.   NODEMAP: {
  8.     AREA: 'map',
  9.     CAPTION: 'table',
  10.     COL: 'table',
  11.     COLGROUP: 'table',
  12.     LEGEND: 'fieldset',
  13.     OPTGROUP: 'select',
  14.     OPTION: 'select',
  15.     PARAM: 'object',
  16.     TBODY: 'table',
  17.     TD: 'table',
  18.     TFOOT: 'table',
  19.     TH: 'table',
  20.     THEAD: 'table',
  21.     TR: 'table'
  22.   },
  23.   // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
  24.   //       due to a Firefox bug
  25.   node: function(elementName) {
  26.     elementName = elementName.toUpperCase();
  27.     
  28.     // try innerHTML approach
  29.     var parentTag = this.NODEMAP[elementName] || 'div';
  30.     var parentElement = document.createElement(parentTag);
  31.     try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
  32.       parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
  33.     } catch(e) {}
  34.     var element = parentElement.firstChild || null;
  35.       
  36.     // see if browser added wrapping tags
  37.     if(element && (element.tagName.toUpperCase() != elementName))
  38.       element = element.getElementsByTagName(elementName)[0];
  39.     
  40.     // fallback to createElement approach
  41.     if(!element) element = document.createElement(elementName);
  42.     
  43.     // abort if nothing could be created
  44.     if(!element) return;
  45.     // attributes (or text)
  46.     if(arguments[1])
  47.       if(this._isStringOrNumber(arguments[1]) ||
  48.         (arguments[1] instanceof Array) ||
  49.         arguments[1].tagName) {
  50.           this._children(element, arguments[1]);
  51.         } else {
  52.           var attrs = this._attributes(arguments[1]);
  53.           if(attrs.length) {
  54.             try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
  55.               parentElement.innerHTML = "<" +elementName + " " +
  56.                 attrs + "></" + elementName + ">";
  57.             } catch(e) {}
  58.             element = parentElement.firstChild || null;
  59.             // workaround firefox 1.0.X bug
  60.             if(!element) {
  61.               element = document.createElement(elementName);
  62.               for(attr in arguments[1]) 
  63.                 element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
  64.             }
  65.             if(element.tagName.toUpperCase() != elementName)
  66.               element = parentElement.getElementsByTagName(elementName)[0];
  67.           }
  68.         } 
  69.     // text, or array of children
  70.     if(arguments[2])
  71.       this._children(element, arguments[2]);
  72.      return element;
  73.   },
  74.   _text: function(text) {
  75.      return document.createTextNode(text);
  76.   },
  77.   ATTR_MAP: {
  78.     'className': 'class',
  79.     'htmlFor': 'for'
  80.   },
  81.   _attributes: function(attributes) {
  82.     var attrs = [];
  83.     for(attribute in attributes)
  84.       attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
  85.           '="' + attributes[attribute].toString().escapeHTML().gsub(/"/,'&quot;') + '"');
  86.     return attrs.join(" ");
  87.   },
  88.   _children: function(element, children) {
  89.     if(children.tagName) {
  90.       element.appendChild(children);
  91.       return;
  92.     }
  93.     if(typeof children=='object') { // array can hold nodes and text
  94.       children.flatten().each( function(e) {
  95.         if(typeof e=='object')
  96.           element.appendChild(e)
  97.         else
  98.           if(Builder._isStringOrNumber(e))
  99.             element.appendChild(Builder._text(e));
  100.       });
  101.     } else
  102.       if(Builder._isStringOrNumber(children))
  103.         element.appendChild(Builder._text(children));
  104.   },
  105.   _isStringOrNumber: function(param) {
  106.     return(typeof param=='string' || typeof param=='number');
  107.   },
  108.   build: function(html) {
  109.     var element = this.node('div');
  110.     $(element).update(html.strip());
  111.     return element.down();
  112.   },
  113.   dump: function(scope) { 
  114.     if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope 
  115.   
  116.     var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
  117.       "BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
  118.       "FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
  119.       "KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
  120.       "PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
  121.       "TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/s+/);
  122.   
  123.     tags.each( function(tag){ 
  124.       scope[tag] = function() { 
  125.         return Builder.node.apply(Builder, [tag].concat($A(arguments)));  
  126.       } 
  127.     });
  128.   }
  129. }