zoukankan      html  css  js  c++  java
  • NHibernate+spring.net+jquery打造UI控件库(mvc+webform两种实现) combox,shadow控件的初步实现(包括键盘,过滤功能)(附代码下载)

             如果这个控件不是已经着手几天了,本不打算写下去啦。既然完成啦,就发给大家用用吧。

             效果图先上吧:没兴趣的就没必要看下去,免得浪费大家的时间

            

             先说说阴影控件吧:

               IE:<div class="sw-ie-shadow"></diiv>然后用滤镜过滤边缘

               其他浏览器:      

    代码
    1 <div class="sw-shadow">
    2 <div class="sh">
    3 <div class="shl"></div>
    4 <div class="shr"></div>
    5 <div class="shc"></div>
    6 </div>
    7 <div class="sc">
    8 <div class="scl"></div>
    9 <div class="scr"></div>
    10 <div class="scc"></div>
    11 </div>
    12 <div class="sf">
    13 <div class="sfl"></div>
    14 <div class="sfr"></div>
    15 <div class="sfc"></div>
    16 </div>
    17 </div>
    18
    19

           实现的目标:

              $(div).shadow();返回一个shadow对象。

           具体实现以下:

        

    代码
    1 (function($) {
    2 Sw.Namespace("$.sw");
    3 $.fn.extend({
    4 shadow: function(options) {
    5 returnnew $.sw.shadow(this, options);
    6 }
    7 });
    8 $.sw.shadow = Class({
    9 container: null,
    10 shadow: null,
    11 template: $.browser.msie ?
    12 '<div class="sw-ieshadow"></div>' :
    13 '<div class="sw-shadow"><div class="sh"><divclass="shl"></div><div class="shr"></div><div class="shc"></div></div><div class="sc"><div class="scl"></div><div class="scr"></div><div class="scc"></div></div><div class="sf"><div class="sfl"></div><div class="sfr"></div><div class="sfc"></div></div></div>',
    14 isRendered: $(".sw-ie-shadow").length >0|| $(".sw-shadow").length >0,
    15 initialize: function(container, options) {
    16 this.container = $(container);
    17 if (!this.isRendered) { $(document.body).append(this.template); }
    18 this.initComponent();
    19 },
    20 setPosition: function(element, val) {
    21 var size = Sw.Size.fromElement(this.container, 2).add(val.width, val.height);
    22 $(element).css({
    23 top: parseInt($(this.container)[0].style.top) - val.top,
    24 left: parseInt($(this.container)[0].style.left) - val.left,
    25 height: size.height,
    26 size.width,
    27 zIndex: parseInt(this.container.css("zIndex")) - val.zIndex
    28 });
    29 },
    30 show: function() { this.shadow.show(); },
    31 hide: function() { this.shadow.hide(); },
    32 initComponent: function() {
    33 var me =this;
    34 if ($.browser.msie) {
    35 this.shadow = $("div.sw-ie-shadow").css("filter", "progid:DXImageTransform.Microsoft.alpha(opacity=30) progid:DXImageTransform.Microsoft.Blur(pixelradius=4)").hide();
    36 this.setPosition(this.shadow, { top: 2, left: 4, height: -1, -1, zIndex: 1 });
    37 }
    38 else {
    39 this.shadow = $("div.sw-shadow").hide();
    40 this.setPosition(this.shadow, { top: 2, left: 3, height:6, 6, zIndex: 1 });
    41 $(".sc", this.shadow).children().andSelf().each(function() {
    42 $(this).css("height", me.container.outerHeight() -4);
    43 });
    44 };
    45 },
    46 refresh: function() {
    47
    48 this.initComponent();
    49 this.show();
    50 }
    51 });
    52 })(jQuery);
    53

        下面先接着说说combox控件的实现吧

            <div class="wrap">

              <input>文本框</input><input>隐藏域</input><div>picker</div>

            <div>

         自然而然,我们的目标是:

            $(input).combox(options)

          其中的option { store: 数据源, selectedChange: 选中触发事件, selectedItem:默认选中项

          具体用法,我示例有详细说明。

          实现过程:

        

    代码
    (function($) {
    Sw.Namespace(
    "$.sw");
    $.fn.extend({
    combox:
    function(options) {
    returnnew $.sw.combox(this, options);
    }
    });
    $.sw.combox
    = Class({
    input:
    null,
    hidField:
    false,
    picker:
    null,
    wrapper:
    null,
    options:
    null,
    store:
    null,
    container:
    null,
    shadow:
    null,
    selectedItem:
    false,
    textAlias:
    null,
    valueAlias:
    false,
    query:
    null,
    initialize:
    function(input, options) {
    this.input = $(input);
    this.options = $.extend({}, $.sw.combox.defaults, options);
    this.store =this.options.store;
    this.initComponent(input);
    },
    initComponent:
    function() {
    this.input.css("width", this.options.width).val(this.options.emptyText).focus(function() { $(this).val(""); });
    this.wrapper = $(this.input).wrap("<div/>").parent().addClass(this.options.comboxCss);
    if (this.options.hidField) {
    this.hidField = $("<input/>").attr({ "id": "h"+this.input.attr("id"), "type": "hidden" }).appendTo(this.wrapper);
    }
    this.picker = $("<div />").hoverClass("picker-hover").appendTo(this.wrapper).addClass(this.options.pickerCss).css("left", this.input.width());
    this.render();
    this.addEvents();
    },
    render:
    function() {
    if (this.store) {
    var me =this;
    this.textAlias = me.store.fields.text;
    var maxWidth = [];
    this.valueAlias = me.store.fields.value == undefined ?"" : me.store.fields.value;
    this.container = $("<div/>").click(function(e) { Sw.stop(e); })
    .width(Sw.Size.fromElement(
    this.input, 2).width +7).appendTo($(document.body));
    this.options.autoHeight ?this.container.css("max-height", this.options.height) : this.container.css("height", this.options.height);
    var listItems = $("<ul/>").appendTo(this.container);
    $(
    this.store.data).each(function(index, item) {
    maxWidth.push($(
    "<li/>").hoverClass("hover").appendTo(listItems).html("<span>"+ item[me.textAlias] +"</span>").attr({ "stext": item[me.textAlias], "svalue": me.valueAlias ==""?"" : item[me.valueAlias] }).click(function(e) {
    me.selectedChange(item); Sw.stop(e);
    }).find(
    "span").outerWidth());
    });
    maxWidth
    = maxWidth.sort(function(a, b) {
    return a - b;
    });
    if (maxWidth[maxWidth.length -1] >=this.container.width()) {
    $(
    "li", this.container).width(maxWidth[maxWidth.length -1] +3);
    }
    this.container.addClass(this.options.containerCss);
    if (this.options.selectedItem) {
    this.selectedItem =this.getDefaultSeletecd(this.options.selectedItem);
    this.renderSeletecd();
    }
    var size = Sw.Size.fromElement(this.input, 2);
    var offset = Sw.Offset.fromElement(this.input).add(0, size.height).applyTo(this.container);
    this.shadow =new $.sw.shadow(this.container);
    //或者这样写也行this.shadow = $(this.container).shadow();
    maxWidth = listItems = size = offset =null;
    }

    },
    removeClass:
    function() {
    $(
    "li", this.container).removeClass("selected");
    },
    getDefaultSeletecd:
    function(defaultValue) {
    if (this.valueAlias !="") {

    return $(this.store.data).jget(defaultValue[this.valueAlias], this.valueAlias);
    }
    else {
    return defaultValue;
    }
    },
    renderSeletecd:
    function() {
    if (this.selectedItem) {
    this.setValue(this.selectedItem);
    this.removeClass();
    if (this.valueAlias !="") {

    $(
    "li[svalue='"+this.getValue() +"']", this.container).first().addClass("selected");
    }
    else {
    $(
    "li[stext='"+this.getText() +"']", this.container).first().addClass("selected");
    }
    }

    },
    hide:
    function() {
    this.container.hide();
    this.shadow.hide();
    this.input.removeClass("focus");
    this.picker.removeClass("picker-focus");

    },
    show:
    function() {
    this.container.show();
    $(
    "ul li", this.container).show();
    this.input.addClass("focus");
    this.picker.addClass("picker-focus");
    this.shadow.refresh();
    this.shadow.show();
    },
    addEvents:
    function() {
    var me =this;
    this.wrapper.click(function() {
    me.input.focus();
    me.show();
    $(document).one(
    "click", function(event) {
    me.hide();
    });
    returnfalse;
    });
    //key
    this.input.keyup(function(e) {

    me.onKeyup(e);
    });

    },
    getSeletedItem:
    function() {
    var currenSelected =this.container.children('ul').children('li.selected');
    return currenSelected.length >0? currenSelected.first() : false;
    },
    prevResult:
    function() {

    $currenSelected
    =this.getSeletedItem();
    if ($currenSelected)
    $currenSelected.removeClass(
    "selected").prev("li:visible").addClass("selected");
    else
    $(
    "ul li:visible", this.container).last().addClass("selected");

    },
    nextResult:
    function() {

    $currenSelected
    =this.getSeletedItem();
    if ($currenSelected)
    $currenSelected.removeClass(
    "selected").next("li:visible").addClass("selected");
    else
    $(
    "ul li:visible", this.container).first().addClass("selected");

    },
    onKeyup:
    function(e) {

    if ((/27$|38$|40$/.test(e.keyCode)) || (/^13$|^9$/.test(e.keyCode) &&this.getSeletedItem())) {
    Sw.stop(e);
    switch (e.keyCode) {
    case Sw.keyCode.Up:
    this.prevResult();
    break;
    case Sw.keyCode.Down:
    this.nextResult();
    break;
    case13:
    this.selectedResult();
    break;
    case Sw.keyCode.Esc:
    this.hide();
    break;
    }
    }
    elseif (this.input.val() !=this.query) {
    this.query =this.input.val();
    this.filter();
    }
    },
    filter:
    function() { //是否异步调用
    if (this.options.async) { //do something()
    }
    else {
    var reg =new RegExp('^'+this.query +'.*$', 'im');
    $(
    "ul li", this.container).each(function() {
    if (reg.test($(this).attr("stext")))
    $(
    this).show();
    else
    $(
    this).hide();

    });
    this.shadow.refresh();
    }

    },
    setValue:
    function(item) {
    this.input.val(item[this.textAlias]);
    if (this.hidField &&this.valueAlias && item[this.valueAlias]) {
    this.hidField.val(item[this.valueAlias]);
    }
    },
    selectedResult:
    function() {
    var text =this.textAlias;
    var selectedResult =this.getSeletedItem();
    var selectedItem ='{"'+this.textAlias +'":"'+ selectedResult.attr("stext") +'","'+this.valueAlias +'":"'+ selectedResult.attr("svalue") +'"}';
    this.selectedChange($.parseJSON(selectedItem));
    },
    selectedChange:
    function(item) {
    this.selectedItem = item;
    this.renderSeletecd();
    var evt =this.options.selectedChange;
    if (evt && $.isFunction(evt)) {
    evt.call(
    this, this.getText(), this.getValue());
    }
    evt
    =null;
    this.hide();
    },
    getText:
    function() { returnthis.input.val(); },
    getValue:
    function() { returnthis.hidField ?this.hidField.val() : ""; }
    })
    $.extend($.sw.combox, {
    defaults: {
    hidField:
    true,
    comboxCss:
    "sw-combox",
    pickerCss:
    "picker",
    containerCss:
    "sw-combox-container",
    emptyText:
    "select a value",
    100,
    height:
    200,
    autoHeight:
    true,
    filter:
    true,
    async:
    false,
    selectedChange:
    false,
    store:
    false,
    selectedItem:
    false

    }
    });
    })(jQuery);

      唉,终于写完啦,松了一口气。这也许是这个系列最后一篇啦。原因以下:

           1.自定义表单的实现还要花很多精力

           2.之前一年来没有参加代码的工作,对互联网技术的发展真的一头雾水,就像园友说的那样,哥竟不知jquery

             已经有那么多的UI库啦,呵呵,自己还一个人在蛮搞。简直是闭门造车。

           3.虽然只完成几个小控件,但我真的有身心疲惫的感觉,没有一点激情,动力

     当然,有这方面兴趣的朋友,特别是有自定义表单设计的朋友,请多多交流。      

    最后附代码下载

       

                    

  • 相关阅读:
    Linux搭建ElasticSearch环境
    从DDD开始说起
    TFS看板晨会
    TFS看板的迭代规划
    TFS看板规则
    TFS看板的设计
    Api容器在应用架构演化中的用途
    基于Abp的WebApi容器
    线程队列
    动态类型序列化
  • 原文地址:https://www.cnblogs.com/doublecc/p/1936484.html
Copyright © 2011-2022 走看看