三个JS小控件

好久没来简书发文了,惭愧惭愧。主要是因为我自7月份左右将自建的博客弄到了网上,所以一直在自己的博客上写。至于为什么不同时发到简书,主要是因为我懒……不过,自己的博客建的对SEO很不友好,没人到我博客上,所以我又回到简书了,哈哈。

废话不多说,今天写的东西是我在做毕设的时候弄出来的,是三个JS插件,分别是 自定义单选框自定义下拉列表自定义日历卡片 。先放出预览图:

自定义日历联动菜单
自定义下拉列表
自定义单选框-暗色背景
自定义单选框-亮色背景

不要吐槽我的审美……作品链接就放到最底下了,大家可以下下来看看,我做了部分兼容(火狐,chrome,Edge)。另外不准备详细说明做法,更多的是说说想法。

单选框

这个最简单,我的想法是

  • 通过传递的dom元素(其中包含input#radio)来找寻其中的input#radio节点
  • 生成一个元素(如i),用它来替换原radio元素(隐藏原radio)
  • 将原radio中的属性复制到新radio中
  • 添加事件,保证新生成的radio是单选

最后生成的dom,如下面dom节点:

radio生成

代码如下:

function selfRadio(dom) {
    // 该dom元素不存在
    if(typeof dom == 'undefined' || dom.length == 0) return false;
    // 获取该dom下面的input#radio元素
    var oInput = dom.getElementsByTagName('input');     
    var aRadio = [];    
    for (var i = 0,j=0; i < oInput.length; i++) {
        if(oInput[i].getAttribute('type') == 'radio') {             
            // 获取上一级节点
            var oParNode = oInput[i].parentNode; 
            // 采用i作为新的input#radio
            var oRadio   = document.createElement('i');
            oRadio.setAttribute('name' , oInput[i].getAttribute('name'));
            oRadio.setAttribute('value' , oInput[i].getAttribute('value'));
            oRadio.setAttribute('class' , 'selfradio');
            // 隐藏原来的input#radio
            oInput[i].style.display = 'none';
            // 插入到web中
            oParNode.insertBefore(oRadio , oInput[i]);
            // 将节点存储 便于建立事件
            aRadio[j++] = oRadio;
        }
    }   
    for(var i = 0; i < aRadio.length; i++) {
        aRadio[i].index = i;
        // 建立点击事件
        aRadio[i].addEventListener('click' , function() {
            for (var i = 0; i < aRadio.length; i++) {
                if(i != this.index) {
                    aRadio[i].setAttribute('class' , 'selfradio');
                }
            }
            aRadio[this.index].setAttribute('class' , 'selfradio change');
        });
    }
}

下拉列表

通过传递的dom元素,找出该dom下所有的select元素

// 获取select节点
var oSelect  = dom.getElementsByTagName('select');

然后,循环的去重建select元素。在创建中第一部分,我称为标题,结构如下:

<div class="title" value="">
    <em>请选择</em>
    <i class="iconfont icon-xiala"></i>
</div>

第二部分就是原来的option,结构如下

<div class="option">
    <ul class="option_ul">
        <li value="1">游戏1</li>
        <!-- 更多的li -->
    </ul>
</div>

而新建的option展现内容的获取与自定义的单选框类似,都是将原来dom中的属性复制过来。

最后,重要的是将事件添加上去,保证点击标题展开option,点击option该option被选中

// 下拉图标切换
oSelfTitle.addEventListener('click' , function() {
    oSelfSelect.setAttribute('class' , 'selfselect auto');
    oSelfIcon.setAttribute('class' , 'iconfont icon-xiala-copy');
});
// 下拉列表选择
var oLi = oSelfUl.getElementsByTagName('li');
for (var i = 0; i < oLi.length; i++) {
    oLi[i].index = i;
    oLi[i].addEventListener('click' , function() {
            oSelfSelect.setAttribute('value' , oLi[this.index].getAttribute('value'));
            oSelfText.innerHTML = oLi[this.index].innerHTML;
            oSelfSelect.setAttribute('class' , 'selfselect');
            oSelfIcon.setAttribute('class' , 'iconfont icon-xiala');
    });
}

日历

自定义日历控件一开始是采用过程式来写的,后来换成了面向对象的方式。还是简单的说说我的想法,毕竟不是很复杂的东西。

日历的生成主要分成三个部分,年,月,日。年和月的创建比较简单,利用for循环就可以了,然后添加个点击事件,用于获取你选择的年和月。

稍微麻烦的是具体日期的生成,你需要注意本月开始的星期数。

这里对JS的时间对象的应用很重要,否则不仅本月开始的星期数以计算,你还要注意闰平年的问题,而有了时间对象都不是问题。

通过时间对象中的getDay函数可以获取一周是哪一天(0为周末),如果希望知道 2016年11月 从星期几开始,只要传递 2016年11月1日 给时间对象,并利用getDay来获取即可

// 注意JS时间对象月计算是从0开始
var sNowWeek = new Date(2016,10,1).getDay();
console.log(sNowWeek);          // 2

同样的获取每月的具体有多少天,就利用getDate,它返回一个月中某一天:

// 想要返回一月天数,时间对象中天数参数以0代替
var sNowDays = new Date(2016,10,0).getDate();   
console.log(sNowDays);          // 30

获取了一月的天数就可以利用for循环创建了,当然不要忘了添加事件(当时做的时候我是利用for循环一个个添加事件的,现在想来比较蠢,可以用事件委托来完成,以后修改吧……)

附录

自定义下拉列表
自定义日历控件
我的博客,欢迎访问

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,265评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,274评论 1 288
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,087评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,479评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,782评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,218评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,594评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,316评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,955评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,274评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,803评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,177评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,732评论 3 229
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,953评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,687评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,263评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,189评论 2 258

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,537评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,592评论 4 59
  • 正独自就着啤酒大快朵颐鸡翅的时候,女儿打电话过来,告诉我刚刚看了《战狼2》,然后说这是第一部让她从头到尾哭了几次的...
    我是老k阅读 367评论 0 0
  • 原创 2017-09-30 赵淇 M极简主义者 现在的商家都在相互竞争,那他们都在竞争什么呢?答案是都在竞争你的时...
    青鸟舞碧霄阅读 187评论 0 1
  • 高温天气,书本也是清凉剂。 前晚,女儿邀我去喂一只流浪小狗。我正看周耗主席的去少林寺的路有多远,这本书就看到最后的...
    天使小鱼儿阅读 475评论 3 6