初次用prototype的形式编写JS代码

模仿写一个listbox的功能, 这里只完成部分的功能. 因为完整的应该是与服务端交互, 根据搜索的关键进行匹配. 然后可以利用键盘 或者 鼠标来选择推荐出来的内容. 这里只实现选择的功能. 只要是JS部分的代码.

第一步: CSS代码

.ac-renderer {
    width: 600px;
    top: 33px;
    left: 1px;
    position: absolute;
    top: 35px;
    left: 1px;
    z-index: 10;
    background: #fff;
    border: solid 1px #999\0;
    border: 0 none rgba(0,0,0,0);
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
    -webkit-box-shadow: 0 1px 4px rgba(0,0,0,.5);
    -moz-box-shadow: 0 1px 4px rgba(0,0,0,.5);
    box-shadow: 0 1px 4px rgba(0,0,0,.5);
}

.ac-row {
    cursor: pointer;
    padding: 8px;
    zoom: 1;
    clear: both;
}

.ac-renderer>.ac-row:first-child {
    border-radius: 5px 5px 0 0;
}

.ac-active {
    background-color: #d6e9f8;
}

.ac-row .zm-item-img-avatar {
    margin: 2px 10px 0 0;
    width: 25px;
    height: 25px;
}

.zm-item-img-avatar {
    border-radius: 2px;
}

.zg-left {
    float: left;
}

.autocomplete-row-name {
    margin: 0 0 1px 35px;
    display: block;
    line-height: 1.2;
    height: 1.2em;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.zu-autocomplete-row-description {
    color: #999;
    display: block;
    font-size: 12px;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    line-height: 14px;
    height: 14px;
    zoom: 1;
}

第二步: 页面代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
    <script src="../../../main/js/global/jquery/1.8/jquery-1.8.1.js"></script>
    <script src="../../../main/plugin/listbox/jquery.listbox.js"></script>
    <link rel="stylesheet" href="../../../main/plugin/listbox/listbox.css"/>
</head>

<body>

<center>
    <div>
        <input id="box" type="text" value="" placeholder="输入关键字"/>
    </div>
</center>

<script>
    var this$ = $(‘#box‘);
    var html = [
        ‘<div class="ac-row ac-active active" id=":3g" role="option" style="-webkit-user-select: none;">‘,
        ‘<img class="zm-item-img-avatar zg-left" src="310d85e8d_m.jpg" style="-webkit-user-select: none;">‘,
        ‘<span title="足球" style="-webkit-user-select: none;">足球1111</span>‘,
        ‘<span class="zg-gray-normal zu-autocomplete-row-description" style="-webkit-user-select: none;">‘,
        ‘又称<b style="-webkit-user-select: none;">s</b>occer,222955 人关注‘,
        ‘</span>‘,
        ‘</div>‘,

        ‘<div id=":4g" role="option" style="-webkit-user-select: none;">‘,
        ‘<img class="zm-item-img-avatar zg-left" src="310d85e8d_m.jpg" style="-webkit-user-select: none;">‘,
        ‘<span title="足球" style="-webkit-user-select: none;">足球22222</span>‘,
        ‘<span class="zg-gray-normal zu-autocomplete-row-description" style="-webkit-user-select: none;">‘,
        ‘又称<b style="-webkit-user-select: none;">s</b>occer,222955 人关注‘,
        ‘</span>‘,
        ‘</div>‘,

        ‘<div id=":5g" role="option" style="-webkit-user-select: none;">‘,
        ‘<img class="zm-item-img-avatar zg-left" src="310d85e8d_m.jpg" style="-webkit-user-select: none;">‘,
        ‘<span title="足球" style="-webkit-user-select: none;">足球33333</span>‘,
        ‘<span class="zg-gray-normal zu-autocomplete-row-description" style="-webkit-user-select: none;">‘,
        ‘又称<b style="-webkit-user-select: none;">s</b>occer,222955 人关注‘,
        ‘</span>‘,
        ‘</div>‘
    ].join(‘‘);

    var options = {
        width: 300,
        bodyHtml: html,
        target: this$,
        targetWrap: this$.parent(),
        afterSelected: function (value) {
            alert(value.html());
        }
    };
    var listBoxUtil = new ListBoxUtil(options);
    listBoxUtil.init();
</script>
</body>
</html>

第三步: 核心JS代码

(function ($) {

    ListBoxUtil = function (options) {
        this.options = options || {};
        this.target = null;
        this.targetWrap = null;
        this.width = 600;
        this.top = 0;
        this.left = 0;
        this.id = "listbox";
        this.bodyHtml = "";
        this.currentIndex = 0;
        this.callFunction = null;
        var html = [
                ‘<div class="ac-renderer" role="listbox" id="‘ + this.id + ‘" style="-webkit-user-select: none;">‘,
            ‘</div>‘
        ].join(‘‘);
        this.listbox = $(html);
    };

    ListBoxUtil.prototype.init = function () {
        var this$ = this;
        this$.setConfig();
        this$.mouseHover();
        this$.keyup();
        this$.bindClick();
        this$.target.on(‘focus‘, function () {
            this$.show();
        }).on(‘blur‘, function () {
            setTimeout(function () {
                this$.hide()
            }, 150);
        });
    };

    ListBoxUtil.prototype.setConfig = function () {
        if (this.options != null) {
            if (this.options[‘target‘]) {
                this.target = this.options[‘target‘];
            }
            if (this.options[‘targetWrap‘]) {
                this.targetWrap = this.options[‘targetWrap‘];
            }
            if (this.options[‘width‘]) {
                this.listbox.width(this.options[‘width‘]);
            }
            if (this.options[‘bodyHtml‘]) {
                this.listbox.append(this.options[‘bodyHtml‘]);
            }
            if (this.options[‘left‘]) {
                this.listbox.left(this.options[‘left‘]);
            } else {
                this.listbox.css("left", this.target.offset().left);
            }
            if (this.options[‘top‘]) {
                this.listbox.top(this.options[‘top‘]);
            } else {
                this.listbox.css("top", this.target.offset().top + this.target.height() + 10);
            }
            if (this.options[‘callFunction‘]) {
                this.callFunction = this.options[‘callFunction‘];
            }
            this.targetWrap.append(this.listbox);
        }
    };

    ListBoxUtil.prototype.mouseHover = function () {
        var this$ = this;
        this.listbox.children().hover(
            function () {
                this$.listbox.children().removeClass(‘ac-active active‘);
                $(this).addClass("ac-active active");
                //
            }
        );
    };

    ListBoxUtil.prototype.keyMove = function (e) {
        var listChild = this.listbox.children().removeClass("ac-active active");
        // 向上
        if (e.keyCode == 38) {
            if (this.currentIndex > 0) {
                this.currentIndex--;
            } else {
                this.currentIndex = listChild.length - 1;
            }
        }
        // 向下
        else if (e.keyCode == 40) {
            if (this.currentIndex == listChild.length - 1) {
                this.currentIndex = 0;
            } else {
                this.currentIndex++;
            }
        }
        listChild.eq(this.currentIndex).addClass("ac-active active");
    };

    ListBoxUtil.prototype.hide = function () {
        this.listbox.hide();
    };

    ListBoxUtil.prototype.show = function () {
        this.listbox.show();
    };

    ListBoxUtil.prototype.bindClick = function () {
        var this$ = this;
        this$.listbox.children().on(‘click‘, function () {
            if (this$.options.afterSelected) {
                this$.options.afterSelected($(this));
            }
        });
    };

    ListBoxUtil.prototype.enter = function (e) {
        var this$ = this;
        var curentChild = this$.listbox.children().eq(this$.currentIndex);
        if (this$.options.afterSelected) {
            this$.options.afterSelected(curentChild);
        }
    };

    ListBoxUtil.prototype.keyup = function () {
        var this$ = this;
        this.target.on(‘keyup‘, function (e) {
            if (e.keyCode == 38 || e.keyCode == 40) {
                this$.keyMove(e);
            } else if (e.keyCode == 13) {
                this$.enter(e);
            }
        });
    };

})(jQuery);

效果图:

虽然代码非常的简单, 但也是我第一次这么认真的写JS代码. 以后还是得前后坚固才行.

初次用prototype的形式编写JS代码

时间: 2024-10-08 22:59:42

初次用prototype的形式编写JS代码的相关文章

最新的JavaScript核心语言标准&mdash;&mdash;ES6,彻底改变你编写JS代码的方式!【转载+整理】

原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructuring 箭头函数 Arrow Functions Symbols 集合 学习Babel和Broccoli,马上就用ES6 代理 Proxies ES6 说自己的宗旨是"凡是新加入的特性,势必已在其它语言中得到强有力的实用性证明."--TRUE!如果你大概浏览下 ES6 的新特性,事实上它

yii2 页面上编写js代码,并注册到页面底部

<script> <!-- 编写script标签是为了编辑器识别js代码,可以省略 --><?php $this->beginBlock('js_end') ?> ...js code... <?php $this->endBlock(); ?> </script> <?php $this->registerJs($this->blocks['js_end'],\yii\web\View::POS_END);//将编

webstorm安装后编写js代码时候不提示

安装完webstorm的时候不提示HTML的js代码.如输入doc只提示如下代码 按住快捷键ctrl+Alt+s  将HTML部分选中即可 看..效果出来了

在模板中编写JS代码

可以在模板中直接添加JS代码,例如: 原文地址:http://blog.51cto.com/13577938/2338008

1在html中添加js代码的三种方式

1.第一种方式:在时间句柄后太假js代码: 例如浏览器弹出对话框; 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 3 <html> 4 <head> 5 <meta http-equiv="Content-Type" content=&qu

js代码中的闭包

作为一个后台开发人员了解前端非常重要,尤其是深处学校实验室做项目时前端把写好的代码直接给你,然后你在修改的时候.我经常做的就是修改前端的代码的HTML和后台交互的部分以及js的ajax部分,之后修改之后也会遇到很多问题,所以只能自己继续修改前端,学习了前端的不少知识. js的闭包是一个很重要的概念,在编写js代码中经常会被用到的,也是js的特色以及难点. 知道闭包首先得知道js的变量和作用域. 在js中变量不向C/C++/Java中那样,得先定义在使用,js中可以直接使用变量,比如: 1 n=1

JS代码存放的位置

方式一:直接在HTML网页中编写JS代码,直接使用<script></script>标签包裹起来,可以放在html里面的任何位置,推荐放在<head></head>区域中.该方式JS代码冗余,不利于程序的维护 方式二:单独编写一个js文件(.js),在使用的html/jsp中通过<script src="index.js"> </script>标签引入该技术文件,该方式实现了js代码和HTML页面的分离,有利于程序

JavaScript必备:Google发布的JS代码规范(转)

[翻译]关于Google发布的JS代码规范,你需要了解什么? 翻译 | WhiteYin 译文 | https://github.com/WhiteYin/translation/issues/10 Google为了那些还不熟悉代码规范的人发布了一个JS代码规范.其中列出了编写简洁易懂的代码所应该做的最佳实践. 代码规范并不是一种编写正确JavaScript代码的规则,而是为了保持源代码编写模式一致的一种选择.对于JavaScript语言尤其如此,因为它灵活并且约束较少,允许开发者使用许多不同的

编写高质量JS代码的68个有效方法(三)

[20141030]编写高质量JS代码的68个有效方法(三) *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table,