1 /**
  2  * Hilo
  3  * Copyright 2015 alibaba.com
  4  * Licensed under the MIT License
  5  */
  6 
  7 /**
  8  * <iframe src='../../../examples/DOMElement.html?noHeader' width = '330' height = '250' scrolling='no'></iframe>
  9  * <br/>
 10  * 使用示例:
 11  * <pre>
 12  * var domView = new Hilo.DOMElement({
 13  *     element: Hilo.createElement('div', {
 14  *         style: {
 15  *             backgroundColor: '#004eff',
 16  *             position: 'absolute'
 17  *         }
 18  *     }),
 19  *     width: 100,
 20  *     height: 100,
 21  *     x: 50,
 22  *     y: 70
 23  * }).addTo(stage);
 24  * </pre>
 25  * @name DOMElement
 26  * @class DOMElement是dom元素的包装。( 注意:DOMElement 的父容器必须是 stage )
 27  * @augments View
 28  * @param {Object} properties 创建对象的属性参数。可包含此类所有可写属性。特殊属性有:
 29  * <ul>
 30  * <li><b>element</b> - 要包装的dom元素。必需。</li>
 31  * </ul>
 32  * @module hilo/view/DOMElement
 33  * @requires hilo/core/Hilo
 34  * @requires hilo/core/Class
 35  * @requires hilo/view/View
 36  * @requires hilo/view/Drawable
 37  */
 38 var DOMElement = Class.create(/** @lends DOMElement.prototype */{
 39     Extends: View,
 40     constructor: function(properties){
 41         properties = properties || {};
 42         this.id = this.id || properties.id || Hilo.getUid("DOMElement");
 43         DOMElement.superclass.constructor.call(this, properties);
 44 
 45         this.drawable = new Drawable();
 46         var elem = this.drawable.domElement = properties.element || Hilo.createElement('div');
 47         elem.id = this.id;
 48 
 49         if(this.pointerEnabled && !elem.style.pointerEvents){
 50             elem.style.pointerEvents = 'visible';
 51         }
 52     },
 53 
 54     /**
 55      * 覆盖渲染方法。
 56      * @private
 57      */
 58     _render: function(renderer, delta){
 59         if(!this.onUpdate || this.onUpdate(delta) !== false){
 60             renderer.transform(this);
 61             if(this.visible && this.alpha > 0){
 62                 this.render(renderer, delta);
 63             }
 64         }
 65     },
 66 
 67     /**
 68      * 覆盖渲染方法。
 69      * @private
 70      */
 71     render: function(renderer, delta){
 72         if(renderer.renderType !== 'dom'){
 73             var canvas = renderer.canvas;
 74             var stage = this.parent;
 75             var domElementContainer = renderer._domElementContainer;
 76             if(!renderer._domElementContainer){
 77                 domElementContainer = renderer._domElementContainer = Hilo.createElement('div', {
 78                     style:{
 79                         'position':'absolute',
 80                         'transform':'scale3d(' + stage.scaleX + ',' + stage.scaleY + ', 1)',
 81                         'transformOrigin':'0 0',
 82                         'zIndex':'1'
 83                     }
 84                 });
 85                 canvas.parentNode.insertBefore(renderer._domElementContainer, canvas.nextSibling);
 86             }
 87 
 88             var elem = this.drawable.domElement, depth = this.depth,
 89                 nextElement = domElementContainer.childNodes[0], nextDepth;
 90             if(elem.parentNode) return;
 91 
 92             //draw dom element just after stage canvas
 93             while(nextElement && nextElement.nodeType != 3){
 94                 nextDepth = parseInt(nextElement.style.zIndex) || 0;
 95                 if(nextDepth <= 0 || nextDepth > depth){
 96                     break;
 97                 }
 98                 nextElement = nextElement.nextSibling;
 99             }
100             domElementContainer.insertBefore(this.drawable.domElement, nextElement);
101         }else{
102             renderer.draw(this);
103         }
104     }
105 });