【回忆1314】回忆之目的地搜索

直接看效果点这里

HTML

<!DOCTYPE html>
<html>
<head lang="zh-CN">
    <meta charset="utf-8">
    <title> 目的地搜索 </title>
    <link rel="stylesheet" href="ui-destination.css">
    <style>
        .city, .type { overflow: hidden; }
        .city li, .type li { float: left; padding: 0 10px; margin: 0 5px; display: inline; background-color: #f60; cursor: pointer; color: #fff; }
    </style>
</head>
<body>

<input class="test" type="text"/>
<input class="test" type="text"/>

<h2>选择类型</h2>
<ul class="type">
    <li data-type="">空:全国</li>
    <li data-type="1">1:机位</li>
    <li data-type="2">2:出发地参团</li>
    <li data-type="3">3:目的地参团</li>
    <li data-type="4">4:自由行</li>
</ul>

<h2>选择城市</h2>
<ul class="city">
    <li data-city="">空:全国</li>
    <li data-city="北京">北京</li>
    <li data-city="上海">上海</li>
    <li data-city="广州">广州</li>
    <li data-city="重庆">重庆</li>
    <li data-city="四川">四川</li>
</ul>

<h2>选择的值</h2>
<input class="selected" type="text" value=""/>
<script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script>
<script src="jquery.ui-destination.js"></script>
<script>
    // data
var DESTINATION_DATA = [{"keyType":2,"name":"西欧","quantity":555,"pinyin":"xiou","productType":"2","associate":"北京,上海,沈阳,西安,天津,乌鲁木齐,广州,武汉,青岛"},{"keyType":2,"name":"法国","quantity":417,"pinyin":"faguo","productType":"2","associate":"北京,沈阳,上海,西安,天津,乌鲁木齐,广州,武汉,青岛"},{"keyType":2,"name":"瑞士","quantity":407,"pinyin":"ruishi","productType":"2","associate":"北京,沈阳,上海,西安,天津,乌鲁木齐,广州,武汉,青岛"},{"keyType":2,"name":"意大利","quantity":375,"pinyin":"yidali","productType":"2","associate":"北京,沈阳,上海,西安,天津,乌鲁木齐,广州,武汉,青岛"},{"keyType":2,"name":"德国","quantity":330,"pinyin":"deguo","productType":"2","associate":"北京,上海,沈阳,西安,天津,乌鲁木齐,广州,武汉,青岛"},{"keyType":2,"name":"泰国","quantity":295,"pinyin":"taiguo","productType":"2,4","associate":"北京,昆明,天津,上海"},{"keyType":2,"name":"东欧","quantity":234,"pinyin":"dongou","productType":"2","associate":"北京,西安,上海,沈阳,乌鲁木齐,天津,广州,武汉"},{"keyType":3,"name":"海岛","quantity":227,"pinyin":"haidao","productType":"2,3,4","associate":"北京,上海,天津,西安,青岛"},{"keyType":2,"name":"普吉岛","quantity":209,"pinyin":"pujidao","productType":"2","associate":"北京,上海"},{"keyType":2,"name":"日本","quantity":207,"pinyin":"riben","productType":"2","associate":"上海,北京,武汉,长沙,天津,乌鲁木齐,西安"},{"keyType":1,"name":"曼谷","quantity":201,"pinyin":"mangu","productType":"2","associate":"北京,合肥,南京,天津,昆明"},{"keyType":2,"name":"洛杉矶","quantity":187,"pinyin":"luoshanji","productType":"2","associate":"北京,武汉,天津,西安,青岛"},{"keyType":2,"name":"东京","quantity":183,"pinyin":"dongjing","productType":"2","associate":"北京,武汉,长沙,天津,乌鲁木齐,西安"},{"keyType":1,"name":"华东","quantity":180,"pinyin":"huadong","productType":"2","associate":"北京"},{"keyType":2,"name":"拉斯维加斯","quantity":176,"pinyin":"lasiweijiasi","productType":"2","associate":"北京,天津,西安,武汉,青岛"}];

    $(‘.test‘).Destination({
        "ID": "J_Destination",
        "city_data": DESTINATION_DATA,
        "search_limit": 10
    });

    // 切换城市
    $(‘.city li‘).click(function(){
        $(‘.test‘).Destination.options.associate = $(this).data(‘city‘);
        $(‘.selected‘).val(‘城市:‘+$(‘.test‘).Destination.options.associate+‘,类型:‘+$(‘.test‘).Destination.options.type);
    });

    // 切换类型
    $(‘.type li‘).click(function(){
        $(‘.test‘).Destination.options.type = $(this).data(‘type‘);
        $(‘.selected‘).val(‘城市:‘+$(‘.test‘).Destination.options.associate+‘,类型:‘+$(‘.test‘).Destination.options.type);
    });

</script>
</body>
</html>

CSS

/**
 * @description: 热门搜索+检索
 * @author: [email protected]
 * @update: 2014/11/28
 */

/*reset*/
h3, dl, dt, dd, ul, li, p { margin: 0; padding: 0; }
li { list-style: none; }
a { text-decoration: none; color: #333; cursor: pointer; }
a:hover,.ul-destination-keys { color: #f60; }

/*ul-destination*/
.ul-destination { position: absolute; z-index: 9999; width: 420px; border: 1px #999 solid; background-color: #fff; color: #333; font: 12px/1.5 ‘simsun‘, arial, ‘sans-serif‘; }
.ul-destination-title { position: relative; height: 20px; line-height: 20px; color: #f60; padding: 5px 5px 5px 10px; font-size: 12px; border-bottom: 1px #eee solid;  }
.ul-destination-close { position: absolute; top: 5px; right: 5px; padding: 0 2px 0 3px; font-size: 14px; color: #bbb; }
.ul-destination-item { padding: 10px 10px 0; line-height: 24px; overflow: hidden; }
.ul-destination-item dt { line-height: 18px; font-weight: bold; }
.ul-destination-item dd { margin-bottom: 10px; overflow: hidden; }
.ul-destination-item a { float: left; margin-right: 12px; white-space: nowrap; word-break: break-all; }
.ul-destination-list { line-height: 26px; }
.ul-destination-list a { position: relative; display: block; overflow: hidden; height: 26px; padding: 0 10px; }
.ul-destination-list a:hover,.ul-destination-list .active a { background-color: #7ba5de; color: #fff; }
.ul-destination-count { position: absolute; top: 0; right: 10px; }
.ul-destination-tips { text-align: center; color: #999; margin: 15px 0; }

JS

/**
 * @description: 目的地
 * @author: [email protected]
 * @update: 2014/11/30
 *
 * @param   {string}      ID              给这个控件一个ID,默认自动生成,重绘避免重复生成,如果本页出现多次该控件最好填写不同的ID
 * @param   {json}        city_data       城市列表数据
 * @param   {id/number}   type            获取这个ID的val,产品类型,1机位、2出发地参团、3目的地参团、4自由行
 * @param   {id/string}   associate       获取这个ID的val,关联词,默认空
 * @param   {number}      limit_city      全部城市显示长度控制,默认128
 * @param   {json}        city_callback   点击城市的回调函数,参数返回当前对象
 * @param   {json}        search_callback 点击搜索结果的回调函数,参数返回当前对象
 */

;(function($){

    var methods = {
        init: function(options){
            methods.bindEvent(options, this);
        },
        createDestination: function(options){
            var box = $(‘<div id="‘+options.ID+‘" class="ul-destination"></div>‘);
            return box;
        },
        createDestinationTitle: function(){
            return ‘<h3 class="ul-destination-title">推荐<a class="ul-destination-close">×</a></h3>‘;
        },
        createCityItems: function(options){
            var city_data = options.city_data,
                oCity_type = $(‘#‘+options.type),
                city_type = oCity_type.length ? oCity_type.val() : options.type,
                oCity_associate = $(‘#‘+options.associate),
                city_associate = oCity_associate.length ? oCity_associate.val() : options.associate,
                res = [‘<dl class="ul-destination-item">‘],
                city_group = {},
                keyTypeText = ["", "国内", "国际", "主题"];

            for (var i = 0, len = city_data.length; i < len; i++){
                if((city_data[i].productType.indexOf(city_type) != -1 || city_type == ‘‘)
                    && (city_data[i].associate.indexOf(city_associate) != -1 || city_associate == ‘‘)) {

                    if(typeof city_group[city_data[i].keyType] == ‘undefined‘){
                        city_group[city_data[i].keyType] = [];
                    }
                    city_group[city_data[i].keyType].push(city_data[i]);

                }
            }

            for (var n in city_group){
                res.push(‘<dt>‘+keyTypeText[n]+‘</dt><dd>‘);
                for (var m = 0, limit = 0, lenM = city_group[n].length; m < lenM; m++){
                    limit += this.getStrLen(city_group[n][m].name) + 2;
                    if(limit > options.limit_city) {
                        break;
                    }
                    res.push(‘<a>‘ + city_group[n][m].name + ‘</a>‘);
                }
                res.push(‘</dd>‘);
            }

            return res;
        },
        getStrLen: function (target){
            var s = target.replace(/[^\x00-\xff]/g, "**");
            return s.length;
        },
        searchCity: function(options, This){
            var city_data = options.city_data,
                oCity_type = $(‘#‘+options.type),
                city_type = oCity_type.length ? oCity_type.val() : options.type,
                oCity_associate = $(‘#‘+options.associate),
                city_associate = oCity_associate.length ? oCity_associate.val() : options.associate,
                box = $(‘#‘+options.ID),
                res = [‘<ul class="ul-destination-list">‘],
                res_item = [],
                res_keys = This.val();
            for(var i = 0, len = city_data.length; i < len; i++){
                if((city_data[i].associate.indexOf(city_associate) != -1 || city_associate == ‘‘)
                    && (city_data[i].productType.indexOf(city_type) != -1 || city_type == ‘‘)){

                    if (city_data[i].pinyin.indexOf(res_keys) == 0) {
                        if(res_item.length >= options.search_limit){ break; }
                        res_item.push(‘<li data-name="‘+city_data[i].name+‘"><a>‘+city_data[i].name+‘(‘+city_data[i].pinyin.replace(new RegExp("^"+res_keys, "g"), function($1){
                            return ‘<span class="ul-destination-keys">‘+ $1 +‘</span>‘;
                        })+‘)</a></li>‘);
                        //<span class="ul-destination-count">约‘+city_data[i].quantity+‘条线路</span>
                    } else if (city_data[i].name.indexOf(res_keys) == 0) {
                        if(res_item.length >= options.search_limit){ break; }
                        res_item.push(‘<li data-name="‘+city_data[i].name+‘"><a>‘+city_data[i].name.replace(new RegExp("^"+res_keys, "g"), function($1){
                            return ‘<span class="ul-destination-keys">‘+ $1 +‘</span>‘;
                        })+‘(‘+city_data[i].pinyin+‘)</a></li>‘);
                        //<span class="ul-destination-count">约‘+city_data[i].quantity+‘条线路</span>
                    }

                }
            }
            res.push(res_item.join(‘‘));
            res.push(‘</ul>‘);

            if(res_item.length){
                if(res_keys != ‘‘){
                    box.html(res.join(‘‘)).find(‘.ul-destination-list‘).find(‘a‘).click(function(){
                        options.search_callback($(this));
                        box.hide();
                    });
                }else{
                    this.bindClick(options, box);
                }
            } else {
                box.html(‘<p class="ul-destination-tips">亲,暂时无搜索结果</p>‘);
            }
        },
        bindClick: function(options){
            var aCityItems = methods.createCityItems(options),
                box = $(‘#‘+options.ID);
            if(aCityItems.length > 1){
                box.html(‘<div class="ul-destination-hot">‘+methods.createDestinationTitle(options) + aCityItems.join(‘‘) + ‘</div>‘)
                    // close
                    .find(".ul-destination-close").click(function(){
                        box.hide();
                    }).end()
                    // city callback
                    .find(".ul-destination-item a").click(function(){
                        options.city_callback($(this));
                        box.hide();
                    });
            }else{
                box.html(‘<p class="ul-destination-tips">亲,暂时无搜索结果</p>‘);
            }
        },
        bindEvent: function(options, This){
            var That = this;
            This.click(function(){
                var box = $(‘#‘+options.ID);
                if(!box.length){
                    box = methods.createDestination(options);
                    $(‘body‘).append(box);
                }else{
                    box.show();
                }
                if(This.val() == ‘‘){
                    That.bindClick(options);
                }else{
                    That.searchCity(options, This);
                }
                box.css({
                    "top": This.offset().top + This.outerHeight(),
                    "left": This.offset().left
                });
                return false;
            }).keyup(function(){
                if(This.val() == ‘‘){
                    That.bindClick(options);
                }else{
                    That.searchCity(options, This);
                }
            });

            // document close
            $(document).click(function(event){
                if($(event.target).attr(‘id‘) != options.ID && !$(event.target).parents(‘#‘+options.ID).length){
                    $(‘#‘+options.ID).hide();
                }
            });
        }
    };

    $.fn.Destination = function(options){
        options = $.extend($.fn.Destination.options, options || {});
        return this.each(function(){
            methods.init.call($(this), options);
        });
    };

    $.fn.Destination.options = {
        "ID": "J_Destination"+Math.floor(new Date().getTime()),
        "city_data": [],
        "type": ‘‘,
        "associate": "",
        "limit_city": 128,
        "city_callback": function(){},
        "search_callback": function(){}
    };

})(jQuery);
时间: 2024-11-25 21:13:47

【回忆1314】回忆之目的地搜索的相关文章

【回忆1314】回忆之城市搜索

直接看效果点这里 HTML <!DOCTYPE html> <html> <head lang="zh-CN"> <meta charset="utf-8"> <title> 城市搜索 </title> <link rel="stylesheet" href="ui-departure.css"> </head> <body&

【回忆1314】回忆之浮窗

直接看效果点这里 HTML <!DOCTYPE html> <html> <head lang="zh-CN"> <meta charset="utf-8"> <title> 浮窗 </title> <style> * { margin: 0; padding: 0; } .staff { width: 1200px; margin: 0 auto; height: 800px; l

【回忆1314】回忆之星星评分

直接看效果点这里 HTML <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title> 星星评分 </title> <link rel="stylesheet" href="star.css"/> </head> <body> <ul

【回忆1314】抽奖之大富翁

直接看效果点这里 <!doctype html> <html> <head> <meta charset="UTF-8"> <title> 大富翁 </title> <style> ul {list-style: none; } .lottery { position: relative; width: 184px; height: 184px; line-height: 58px; text-alig

【回忆1314】回忆之日历

直接看效果点这里 HTML <!DOCTYPE html> <html> <head lang="zh-CN"> <meta charset="utf-8"> <title> 简易多栏日历 </title> <link rel="stylesheet" href="calendar.css"> </head> <body>

【回忆1314】回忆之横竖滑动门

直接看效果点这里 HTML <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title> 横竖滑动门 </title> <link rel="stylesheet" href="sliding-door.css"/> </head> <body&g

【回忆1314】回忆之分页

直接看效果点这里 HTML <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>分页插件</title> <link rel="stylesheet" href="page.min.css"/> </head> <body> <

【回忆1314】鼠标离开方向检测

直接看效果点这里 <html> <head>鼠标离开方向检测</head> <body> <div id="msg">鼠标放到框上,然后移开.</div> <div id="wrap" style="width:200px; height: 100px; line-height:30px; margin: 100px auto; text-align: center; borde

【回忆1314】回忆之placeholder

直接看效果点这里 HTML <!DOCTYPE html> <html> <head lang="zh-CN"> <meta charset="utf-8"> <title> Placeholder </title> </head> <body> <input class="J_Placeholder" type="text"