miniui从继承看控件处理

上文中的oo0OOl应该就是控件的基类。可以对照miniuiAPI文档中的Control。

然后许多控件是从Control类去继承。也可能有其他中间类。以mini-button为例:

lolO00 = function() {
    lolO00[ol0oOo][oO000O].apply(this, arguments)
}
;
OOOl(lolO00, oo0OOl, {
    text: "",iconCls: "",iconStyle: "",plain: false,checkOnClick: false,checked: false,groupName: "",img: "",
    ll0l01: "mini-button-plain", _hoverCls: "mini-button-hover",lOoo: "mini-button-pressed",loool: "mini-button-checked",lol101: "mini-button-disabled",
    allowCls: "",_clearBorder: false,uiCls: "mini-button",href: "",target: ""
});

O1l0O0(lolO00, "button");

//将构造函数添加至全局uiCls中
O1l0O0 = function(A, _) {
    _ = _.toLowerCase();
    if (!mini.classes[_]) {
        mini.classes[_] = A;
        A[OlO10o].type = _
    }
    var $ = A[OlO10o].uiCls;
    if (!mini.isNull($) && !mini.uiClasses[$])
        mini.uiClasses[$] = A
}
;

这是组织mini-button构造函数的地方。mini-button的构造函数继承自oo0OOl。为什么说lolO00对应着mini-button,因为增加属性中uiCls:“mini-button”,然后通过执行O1l0O0来将对应的“button”赋值给prototype的type属性,然后将构造函数与mini-nutton以属性-值得方式存放到mini.uiClasses集合中。

然后是时候看一下mini.parse()的处理了。

mini.parse = function(C, $) {
    mini.parsed = true;
    if (mini._firstParse) {
        if (document.body) document.body.style.visibility = "visible";
        mini._firstParse = false;
        var D = document.getElementsByTagName("iframe"),
        H = [];
        for (var E = 0,
        G = D.length; E < G; E++) {
            var A = D[E];
            H.push(A)
        }
        for (E = 0, G = H.length; E < G; E++) {
            var A = H[E],
            B = jQuery(A).attr("src");
            if (!B || B == "about:blank") continue;
            A.loaded = false;
            A._onload = A.onload;
            A._src = B;
            A.onload = function() {};
            A.src = ""
        }
        setTimeout(function() {
            for (var _ = 0,
            A = H.length; _ < A; _++) {
                var $ = H[_];
                if ($._src && jQuery($).attr("src") == "") {
                    $.loaded = true;
                    $.onload = $._onload;
                    $.src = $._src;
                    $._src = $._onload = null
                }
            }
        },
        20);
        setTimeout(function() {
            for (var A = 0,
            B = H.length; A < B; A++) {
                var $ = H[A],
                _ = jQuery($).attr("data-src");
                if (_) $.src = _
            }
        },
        30)
    }
    if (typeof C == "string") {
        var F = C;
        C = l1O1(F);
        if (!C) C = document.body
    }
    if (C && !mini.isElement(C)) C = C.el;
    if (!C) C = document.body;
    var _ = oO01ll;
    if (isIE) oO01ll = false;
    mini.ol10(C);//处理
    oO01ll = _;
    if ($ !== false) mini.layout(C)
};

因为我们调用的是mini.parse()且页面中没有iframe框架,直接看留下的部分。处理对象为document.body;处理方式为mini.ol10(C):

mini.ol10 = function(_) {
    if (!_) return;
    var $ = _.nodeName.toLowerCase();//$=‘body‘
    if (!$) return;
    if (jQuery(_).attr("noparser") != null) return;
    var C = String(_.className);//获取元素className
    if (C) {
        var D = mini.get(_);//尝试使用mini.get()获取元素,如果获取失败,表明当前元素可能可以被解析成mini控件
        if (!D) {
            var A = C.split(" ");//获取所有className
            for (var B = 0,
            F = A.length; B < F; B++) {//遍历每一个className,
                var E = A[B],
                J = mini.getClassByUICls(E);//看看mini.uiClasses里面有没有对应的控件名
                if (J) {//有,需要解析
                    l11l(_, E);//从元素上removeclass E
                    var H = new J();//利用找到的对应控件的构造函数创建对象
                    mini.applyTo[Oloool](H, _);//Oloool:call,在H对象上使用该方法,该方法中的this将指向H对象
                    _ = H.el;//将创建对象的el赋值给_
                    break
                }
            }
        }
    }//下面这行的判断是为了避免再循环其子节点如果符合要求,直接返回
    if ($ == "select" || l1llO1(_, "mini-menu") || l1llO1(_, "mini-datagrid") || l1llO1(_, "mini-treegrid") || l1llO1(_, "mini-tree") || l1llO1(_, "mini-button") || l1llO1(_, "mini-textbox") || l1llO1(_, "mini-buttonedit")) return;
    //递归遍历body中的所有nodeType == 1:element_node(元素节点)   var I = mini[l0loo](_, true);
for (B = 0, F = I.length; B < F; B++) {
        var G = I[B];
        if (G.nodeType == 1) if (G.parentNode == _) mini.ol10(G)
    }
};

最后看看mini.applyTo方法:

mini.applyTo = function(_) {
    _ = l1O1(_);//当传入元素对象时,返回该对象
    if (!_)
        return this;
    if (mini.get(_))
        throw new Error("not applyTo a mini control");
    var A = this[lo11lO](_);//getAttrs获取元素所有属性,为H对象的赋值做准备
    delete A._applyTo;
    //添加两个属性defaultValue,defaultText
    if (mini.isNull(A[OlOo]) && !mini.isNull(A.value))//defaultvalue
        A[OlOo] = A.value;
    if (mini.isNull(A.defaultText) && !mini.isNull(A.text))//defaulttext
        A.defaultText = A.text;
    var $ = _.parentNode;
    if ($ && this.el != _)
        $.replaceChild(this.el, _);//替换了
    if (window._mini_set)
        _mini_set(A, this);
    this[lOlol0](A);//set,一直调用到最基类的set方法,O010l0的set方法oooOo,将原元素的属性赋值到H对象上
    this.OlO1(_);//空方法
    return this
}
;

这边还有1个问题,H对象的el属性是怎样组建的?

今天遇到mini-fit使用的问题。面对自动生成的元素被设置成固定高度导致元素显示不全的问题,在最外层套一个mini-fit就好了。先记录一下,之后去看看。

Good night.

原文地址:https://www.cnblogs.com/jianIsTheBest/p/11247493.html

时间: 2024-10-29 10:00:07

miniui从继承看控件处理的相关文章

C#继承基本控件实现自定义控件

C#继承基本控件实现自定义控件 摘自:http://www.cnblogs.com/greatverve/archive/2012/04/25/user-control-inherit.html 自定义控件分三类:1.复合控件:基本控件组合而成.继承自UserControl2.扩展控件:继承基本控件,扩展一些属性与事件.比如继承Button3.自定义控件:直接继承自Control第一种情况上手比较容易,也比较常用,其中也有不少技巧,慢慢总结.比如要单独建个类库项目,才不会引起冲突.怎样把事件代码

下拉刷新:继承listView控件

1.首先初始化的时候给控件监听OnScrollListener,其中onScroll的参数里得到第一个显示的条目,当第一个条目为0的时候就可以执行下啦刷新了.第二覆写的方法是 onScrollStateChanged就是滑动状态的监听,3种状态都是常量:快速滑动,触摸移动,闲置状态,当为第二种时候调用getlastVisiableposition()得到显示的最后一个条目,当为总条目的个数-1时就可以上移加载更多没在初始化的时候跟header一样加上Foot.当显示最后一个的时候就显示foot,

[UE4]继承标准控件

可以继承自标准控件的自定义控件中把常用的方法封装,比如设置字体大小: 调用自定义控件的自定义函数 还可以继续创建子蓝图控件 原文地址:https://www.cnblogs.com/timy/p/9142640.html

JavaFX 初学入门(一):FXML嵌套与原始控件继承

说明 之前由于做一个小项目需要用swing,结果swing把我折腾的够呛.后来得知有javaFX这个类似于C#中WPF形式的利用XML来写界面的框架之后,马上就转到javaFX上了.找过一些资料但是帮助都不大,最后还是选择直接看官方demo.(我之前是做过android app,有些东西其实都是差不多的.) 下面选取官方demo中的一个 UnlockCustom . 这个demo中涉及到 继承原始控件(自定义),FXML 布局嵌套,以及一些控件动画等. 一.javaFX的入口函数 整个javaF

2、继承和组合,绘制方式定制控件

定制控件的方式 1.继承其他控件类. 例如,EditText,是继承TextView. 例子:带图标的文本框 public IconTextView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.IconTextView); resourceId = typedArray.

自定义控件之--继承控件(圆形TextView)

师从郭大,自学于心,继承控件无疑就是继承自现有控件,保持继承的控件的属性并进行必要的扩展. 比如下面这个自定义控件,它就保持了TextView的属性,并对TextView的外观进行必要的修改该来适应自己的项目,主要实现的是一个圆形的TextView的功能. 三个构造方法: onMesure():onMeasure()方法顾名思义就是用于测量视图的大小的,确定视图的宽度和高度的规格和大小; draw():视图绘制,canvas.drawCircle(getWidth()/2, getHeight(

用继承和组合方式定制控件

1. 定制控件的方式 2. 带标签的文本编辑框(不带命名空间) 3. 带图标的文本框(带命名空间) 4. 控件属性验证 1. 定制控件的方式 <1>继承其他控件类 Ctrl + 左键 --->EditText <2>组合方式. 当前控件类从容器类继承, 并将若干个控件添加到当前容器中 <3>绘制控件. 也就是控件类从View继承, 并在onDraw方法中从零开始绘制控件, 例如TextView 2. 带标签的文本编辑框(不带命名空间)

3、用继承和组合方式定制控件

定制控件的方式 ? 继承其它控件类(EditText.Button) ? 组合方式.当前控件类从容器类继承,并将若干个控件添加到当前的容器中. ? 绘制控件,也就是控件类从View继承,并在onDraw方法中从零绘制 控件.例如,TextView.  带标签的文本编辑框(不带命名空间) 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http:

C#编写第三方控件,实现窗体控件的一键赋值

. 事出有因 在写程序的时候,经常会写上面这样的代码,把查询的结果显示到窗体上,我们怎么做的呢? 一行一行的进行赋值,这样的代码写起来最枯燥,而且还容易出错.大家有没有发现,上面的代码都在做相同的事情-赋值.相类似的代码写了三遍以上,就要考虑是不是能对这个过程进行封装.封装出一个方法,帮我们自动完成这些重复性的操作. 思考过程 所接触项目中也有写好的类似方法.只是它涉及到了很多其它的方法,一个套一个,抽离出来特别不方便.而且还有几个令人不爽的地方: 第一是,控件在命名的时候必须和相对应实体属性相