(function ($) { var hasResult = false; var currentSelect = ""; var selectedCity = ""; String.prototype.trim = function () { //自定义的trim方法 防止浏览器兼容性造成的问题 2012-10-9 Lzz return this.replace(/^\s+|\s+$/g, ''); } $.suggest = function (input, options) { //var $input = $(input).attr("autocomplete", "off"); var $input = $(input); var $results; var timeout = false; // hold timeout ID for suggestion results to appear var prevLength = 0; // last recorded length of $input.val() var cache = []; // cache MRU list var cacheSize = 0; // size of cache in chars (bytes?) if ($.trim($input.val()) == '' || $.trim($input.val()) == '中文/英文') $input.val('').css('color', '#aaa'); if (!options.attachObject) options.attachObject = $(document.createElement("ul")).appendTo('body'); $results = $(options.attachObject); $results.addClass(options.resultsClass); //resetPosition(); //$(window) //.load(resetPosition) // just in case user is changing size of page while loading //.resize(resetPosition); $input.blur(function () { /*********update at 2011-12-23 ,默认第一个**********/ /*if ($(this).val().length == 0) { hasResult = false; } if (hasResult) { $(input).val(currentSelect).css('color', '#000'); hasResult = false; currentSelect = ""; } else { $(this).val("中文/拼音").css('color', '#aaa'); }*/ /****************************************************/ var $value = $input.val(); if( $value=="" || $value.length == 0){ $('input[name='+$input[0].id+']').val(''); }else{ var $val = $('input[name='+$input[0].id+']').val(); if(($value.length > 0 && !hasResult) || $val.length == 0){ $input.val(''); } } setTimeout(function () { $results.hide(); }, 200); }); $input.focus(function () { if ($.trim($(this).val()) == '中文/英文') { $(this).val('').css('color', '#000'); } if ($.trim($(this).val()) == '') { displayItems('',options.listSize,options.parentVal); //显示热门城市列表 } }); $input.click(function () { var q = $.trim($(this).val()); displayItems(q,options.listSize,options.parentVal); $(this).select(); }); // help IE users if possible try { $results.bgiframe(); } catch (e) { } $input.keyup(processKey); // // function resetPosition() { // // requires jquery.dimension plugin // var offset = $input.offset(); // $results.css({ // top: (offset.top + input.offsetHeight) + 'px', // left: offset.left + 'px' // }); // } function processKey(e) { // handling up/down/escape requires results to be visible // handling enter/tab requires that AND a result to be selected if ((/27$|38$|40$/.test(e.keyCode) && $results.is(':visible')) || (/^13$|^9$/.test(e.keyCode) && getCurrentResult())) { if (e.preventDefault) e.preventDefault(); if (e.stopPropagation) e.stopPropagation(); e.cancelBubble = true; e.returnValue = false; switch (e.keyCode) { case 38: // up prevResult(); break; case 40: // down nextResult(); break; case 13: // return selectCurrentResult(); break; case 27: // escape $results.hide(); break; } } else if ($input.val().length != prevLength) { if (timeout) clearTimeout(timeout); timeout = setTimeout(suggest, options.delay); prevLength = $input.val().length; } } function suggest() { var q = $.trim($input.val()); displayItems(q,options.listSize,options.parentVal); } function displayItems(items,size,parentname) { var parentVal = null; if(parentname){ //用于联动 var pp_val = $('#'+parentname).val(); if(pp_val.length > 0){ parentVal = pp_val; }else{ pp_val = $('input[name='+parentname+']').val(); if(pp_val.length > 0){ parentVal = pp_val; } } } var html = ''; var listsize = size||10; var iframe_attach = ""; var current_broswer = navigator.userAgent.toLowerCase(); if (current_broswer.match(/msie ([6.]+)/)) {//如果是ie6 //231px对应10个提示选项和一个tip头(提示项和tip头都是21px) iframe_attach = ""; } if (items == '') {//热门城市遍历 var count = 0; for (h in options.hot_list) { if (null != options.hot_list[h][0]&& (parentVal==null || parentVal== options.hot_list[h][0] )) { html += '
  • ' + options.hot_list[h][1] + '' + options.hot_list[h][2] + '' + options.hot_list[h][3] + '
  • '; count++; if (count == size) { break; } } } html = iframe_attach + '
    请输入中文/英文或者↑↓选择
    '; } else { /*if (!items) return; if (!items.length) { $results.hide(); return; }*/ var jSum = 0; for (var i = 0; i < options.source.length; i++) {//国内城市匹配 var reg = new RegExp('^.*' + items + '.*$', 'im'); if (reg.test(options.source[i][0]) || reg.test(options.source[i][1]) || reg.test(options.source[i][2]) || reg.test(options.source[i][3])) { if(parentVal==null || parentVal == options.source[i][0] ) { html += '
  • ' + options.source[i][1] + '' + options.source[i][2] + '' + options.source[i][3] + '
  • '; } jSum++; } if (jSum == listsize) { break; } } if (html == '') { hasResult = false; suggest_tip = '
    对不起,找不到:' + items + '
    '; } else { hasResult = true; suggest_tip = iframe_attach + '
    ' + items + ',按字母排序
    '; } /***取出当前第一个城市的英文 add at 2011-12-23****/ var pos = html.indexOf("") + 7; //currentSelect = html.substr(pos, html.indexOf("", pos + 1) - pos); currentSelect = html.substr(pos, html.indexOf("", pos) - pos); /*************************************************/ html = suggest_tip + ''; } $results.html(html).show(); $results.children('ul').children('li:first-child').addClass(options.selectClass); $results.children('ul') .children('li') .mouseover(function () { $results.children('ul').children('li').removeClass(options.selectClass); $(this).addClass(options.selectClass); }) .click(function (e) { e.preventDefault(); e.stopPropagation(); selectCurrentResult(); }); } function getCurrentResult() { if (!$results.is(':visible')) return false; var $currentResult = $results.children('ul').children('li.' + options.selectClass); if (!$currentResult.length) $currentResult = false; return $currentResult; } function selectCurrentResult() { $currentResult = getCurrentResult(); if ($currentResult) { $(options.selectCity).val($currentResult.children('a').children("span").eq(1).children('font').html()); $input.val($currentResult.children('a').html().replace(/.+?<\/span>|.+?<\/SPAN>/g, '')).css('color', '#000'); /**绑定ID**/ $('input[name='+$input[0].id+']').val($currentResult.children('a').find('FONT').html()); $('input[name='+$input[0].id+']').change(); /***/ $results.hide(); if ($(options.dataContainer)) { $(options.dataContainer).val($currentResult.attr('rel')); } if (options.onSelect) { options.onSelect.apply($input[0]); } } } function nextResult() { $currentResult = getCurrentResult(); if ($currentResult) $currentResult .removeClass(options.selectClass) .next() .addClass(options.selectClass); else $results.children('ul').children('li:first-child').addClass(options.selectClass); } function prevResult() { $currentResult = getCurrentResult(); if ($currentResult) $currentResult .removeClass(options.selectClass) .prev() .addClass(options.selectClass); else $results.children('ul').children('li:last-child').addClass(options.selectClass); } } $.fn.suggest = function (source, options) { if (!source) return; options = options || {}; options.source = source; options.parentVal = options.parentVal || null; options.listSize = options.listSize || 10; options.hot_list = options.hot_list || []; options.delay = options.delay || 0; options.resultsClass = options.resultsClass || 'ac_results'; options.selectClass = options.selectClass || 'ac_over'; options.matchClass = options.matchClass || 'ac_match'; options.minchars = options.minchars || 1; options.delimiter = options.delimiter || '\n'; options.onSelect = options.onSelect || false; options.dataDelimiter = options.dataDelimiter || '\t'; options.dataContainer = options.dataContainer || '#SuggestResult'; options.attachObject = options.attachObject || null; options.selectCity = options.selectCity || ""; //控件的id,存在选择的city //options.tips = options.tips || "中文/拼音"; this.each(function () { new $.suggest(this, options); }); return this; }; })(jQuery);