QuickTip.js
上传用户:dawnssy
上传日期:2022-08-06
资源大小:9345k
文件大小:7k
源码类别:

JavaScript

开发平台:

JavaScript

  1. /*!  * Ext JS Library 3.1.0  * Copyright(c) 2006-2009 Ext JS, LLC  * licensing@extjs.com  * http://www.extjs.com/license  */ /**
  2.  * @class Ext.QuickTip
  3.  * @extends Ext.ToolTip
  4.  * @xtype quicktip
  5.  * A specialized tooltip class for tooltips that can be specified in markup and automatically managed by the global
  6.  * {@link Ext.QuickTips} instance.  See the QuickTips class header for additional usage details and examples.
  7.  * @constructor
  8.  * Create a new Tip
  9.  * @param {Object} config The configuration options
  10.  */
  11. Ext.QuickTip = Ext.extend(Ext.ToolTip, {
  12.     /**
  13.      * @cfg {Mixed} target The target HTMLElement, Ext.Element or id to associate with this quicktip (defaults to the document).
  14.      */
  15.     /**
  16.      * @cfg {Boolean} interceptTitles True to automatically use the element's DOM title value if available (defaults to false).
  17.      */
  18.     interceptTitles : false,
  19.     // private
  20.     tagConfig : {
  21.         namespace : "ext",
  22.         attribute : "qtip",
  23.         width : "qwidth",
  24.         target : "target",
  25.         title : "qtitle",
  26.         hide : "hide",
  27.         cls : "qclass",
  28.         align : "qalign",
  29.         anchor : "anchor"
  30.     },
  31.     // private
  32.     initComponent : function(){
  33.         this.target = this.target || Ext.getDoc();
  34.         this.targets = this.targets || {};
  35.         Ext.QuickTip.superclass.initComponent.call(this);
  36.     },
  37.     /**
  38.      * Configures a new quick tip instance and assigns it to a target element.  The following config values are
  39.      * supported (for example usage, see the {@link Ext.QuickTips} class header):
  40.      * <div class="mdetail-params"><ul>
  41.      * <li>autoHide</li>
  42.      * <li>cls</li>
  43.      * <li>dismissDelay (overrides the singleton value)</li>
  44.      * <li>target (required)</li>
  45.      * <li>text (required)</li>
  46.      * <li>title</li>
  47.      * <li>width</li></ul></div>
  48.      * @param {Object} config The config object
  49.      */
  50.     register : function(config){
  51.         var cs = Ext.isArray(config) ? config : arguments;
  52.         for(var i = 0, len = cs.length; i < len; i++){
  53.             var c = cs[i];
  54.             var target = c.target;
  55.             if(target){
  56.                 if(Ext.isArray(target)){
  57.                     for(var j = 0, jlen = target.length; j < jlen; j++){
  58.                         this.targets[Ext.id(target[j])] = c;
  59.                     }
  60.                 } else{
  61.                     this.targets[Ext.id(target)] = c;
  62.                 }
  63.             }
  64.         }
  65.     },
  66.     /**
  67.      * Removes this quick tip from its element and destroys it.
  68.      * @param {String/HTMLElement/Element} el The element from which the quick tip is to be removed.
  69.      */
  70.     unregister : function(el){
  71.         delete this.targets[Ext.id(el)];
  72.     },
  73.     
  74.     /**
  75.      * Hides a visible tip or cancels an impending show for a particular element.
  76.      * @param {String/HTMLElement/Element} el The element that is the target of the tip.
  77.      */
  78.     cancelShow: function(el){
  79.         var at = this.activeTarget;
  80.         el = Ext.get(el).dom;
  81.         if(this.isVisible()){
  82.             if(at && at.el == el){
  83.                 this.hide();
  84.             }
  85.         }else if(at && at.el == el){
  86.             this.clearTimer('show');
  87.         }
  88.     },
  89.     
  90.     getTipCfg: function(e) {
  91.         var t = e.getTarget(), 
  92.             ttp, 
  93.             cfg;
  94.         if(this.interceptTitles && t.title && Ext.isString(t.title)){
  95.             ttp = t.title;
  96.             t.qtip = ttp;
  97.             t.removeAttribute("title");
  98.             e.preventDefault();
  99.         }else{
  100.             cfg = this.tagConfig;
  101.             ttp = t.qtip || Ext.fly(t).getAttribute(cfg.attribute, cfg.namespace);
  102.         }
  103.         return ttp;
  104.     },
  105.     // private
  106.     onTargetOver : function(e){
  107.         if(this.disabled){
  108.             return;
  109.         }
  110.         this.targetXY = e.getXY();
  111.         var t = e.getTarget();
  112.         if(!t || t.nodeType !== 1 || t == document || t == document.body){
  113.             return;
  114.         }
  115.         if(this.activeTarget && ((t == this.activeTarget.el) || Ext.fly(this.activeTarget.el).contains(t))){
  116.             this.clearTimer('hide');
  117.             this.show();
  118.             return;
  119.         }
  120.         if(t && this.targets[t.id]){
  121.             this.activeTarget = this.targets[t.id];
  122.             this.activeTarget.el = t;
  123.             this.anchor = this.activeTarget.anchor;
  124.             if(this.anchor){
  125.                 this.anchorTarget = t;
  126.             }
  127.             this.delayShow();
  128.             return;
  129.         }
  130.         var ttp, et = Ext.fly(t), cfg = this.tagConfig, ns = cfg.namespace;
  131.         if(ttp = this.getTipCfg(e)){
  132.             var autoHide = et.getAttribute(cfg.hide, ns);
  133.             this.activeTarget = {
  134.                 el: t,
  135.                 text: ttp,
  136.                 width: et.getAttribute(cfg.width, ns),
  137.                 autoHide: autoHide != "user" && autoHide !== 'false',
  138.                 title: et.getAttribute(cfg.title, ns),
  139.                 cls: et.getAttribute(cfg.cls, ns),
  140.                 align: et.getAttribute(cfg.align, ns)
  141.                 
  142.             };
  143.             this.anchor = et.getAttribute(cfg.anchor, ns);
  144.             if(this.anchor){
  145.                 this.anchorTarget = t;
  146.             }
  147.             this.delayShow();
  148.         }
  149.     },
  150.     // private
  151.     onTargetOut : function(e){
  152.         // If moving within the current target, and it does not have a new tip, ignore the mouseout
  153.         if (this.activeTarget && e.within(this.activeTarget.el) && !this.getTipCfg(e)) {
  154.             return;
  155.         }
  156.         this.clearTimer('show');
  157.         if(this.autoHide !== false){
  158.             this.delayHide();
  159.         }
  160.     },
  161.     // inherit docs
  162.     showAt : function(xy){
  163.         var t = this.activeTarget;
  164.         if(t){
  165.             if(!this.rendered){
  166.                 this.render(Ext.getBody());
  167.                 this.activeTarget = t;
  168.             }
  169.             if(t.width){
  170.                 this.setWidth(t.width);
  171.                 this.body.setWidth(this.adjustBodyWidth(t.width - this.getFrameWidth()));
  172.                 this.measureWidth = false;
  173.             } else{
  174.                 this.measureWidth = true;
  175.             }
  176.             this.setTitle(t.title || '');
  177.             this.body.update(t.text);
  178.             this.autoHide = t.autoHide;
  179.             this.dismissDelay = t.dismissDelay || this.dismissDelay;
  180.             if(this.lastCls){
  181.                 this.el.removeClass(this.lastCls);
  182.                 delete this.lastCls;
  183.             }
  184.             if(t.cls){
  185.                 this.el.addClass(t.cls);
  186.                 this.lastCls = t.cls;
  187.             }
  188.             if(this.anchor){
  189.                 this.constrainPosition = false;
  190.             }else if(t.align){ // TODO: this doesn't seem to work consistently
  191.                 xy = this.el.getAlignToXY(t.el, t.align);
  192.                 this.constrainPosition = false;
  193.             }else{
  194.                 this.constrainPosition = true;
  195.             }
  196.         }
  197.         Ext.QuickTip.superclass.showAt.call(this, xy);
  198.     },
  199.     // inherit docs
  200.     hide: function(){
  201.         delete this.activeTarget;
  202.         Ext.QuickTip.superclass.hide.call(this);
  203.     }
  204. });
  205. Ext.reg('quicktip', Ext.QuickTip);