1/* 2Infomation 3========================================================================================== 4jQuery Plugin 5 Name : jquery.ajaxSuggest 6 Version : 1.5.4 7 Update : 2012-02-10 8 Author : sutara_lumpur 9 Author-URI : http://d.hatena.ne.jp/sutara_lumpur/20100718/1279420832 10 License : MIT License (http://www.opensource.org/licenses/mit-license.php) 11 Based-on : Uses code and techniques from following libraries... 12 * jquery.suggest 1.1 13 Author : Peter Vulgaris 14 Author-URI : http://www.vulgarisoip.com/ 15========================================================================================== 16 17Contents 18========================================================================================== 19 01. 夿°ã»é¨åã®å®ç¾© 20 02. ã¤ãã³ããã³ãã© 21 03. Suggestç¨ã¡ã½ãã - æªåé¡ 22 04. Suggestç¨ã¡ã½ãã - Ajaxé¢é£ 23 05. Suggestç¨ã¡ã½ãã - åè£ãªã¹ãé¢é£ 24 06. å¦çã®å§ã¾ã 25========================================================================================== 26*/ 27(function($) { 28 $.ajaxSuggest = function(input_obj, source, options) { 29 30 //Ajaxã«ããããã£ãã·ã¥ãç¡å¹ã«ãã 31 $.ajaxSetup({cache: false}); 32 33 //================================================================================ 34 // 01. 夿°ã»é¨åã®å®ç¾© 35 //-------------------------------------------------------------------------------- 36 //********************************************** 37 //夿°ã®åæå 38 //********************************************** 39 var show_hide = false; //åè£ããã¿ã¤ãã¼å¦çã§è¡¨ç¤ºãããã©ããã®äºç´ 40 var timer_show_hide = false; //ã¿ã¤ãã¼ããã©ã¼ã«ã¹ãå¤ããå¾ãåè£ãé表示ã«ããã 41 var timer_val_change = false; //ã¿ã¤ãã¼å¤æ°(ä¸å®æéãã¨ã«å ¥åå¤ã®å¤åãç£è¦) 42 var reserve_click = false; //ãã¦ã¹ã®ãã¼ãæ¼ãç¶ããæä½ã«å¯¾å¿ããããmousedownãæ¤ç¥ 43 var $xhr = false; //XMLHttpãªãã¸ã§ã¯ããæ ¼ç´ 44 var prev_value = ''; //Suggestã®ã以åã®å¤ 45 var user_value = ''; //ã¦ã¼ã¶ãå ¥åãããã¨ãã¨ã®å¤ 46 var is_select = false; //ãã¼å ¥åã§ã¯ãªããåè£é¸æã§$input_objã®å¤ãå¤ãã£ããï¼ 47 var key_select = false; //ãã¼ã§åè£ç§»åãããï¼ï¼ 48 49 //********************************************** 50 //é¨åã®å®ç¾© 51 //********************************************** 52 $(input_obj).attr('autocomplete','off'); 53 $(input_obj).addClass('suggestEnabled'); 54 55 var $results = $('<ul></ul>') 56 .addClass(options.results_class) 57 .appendTo('body'); 58 59 //================================================================================ 60 // 02. ã¤ãã³ããã³ãã© 61 //-------------------------------------------------------------------------------- 62 //********************************************** 63 //ããã¹ãå ¥åã¨ãªã¢ 64 //********************************************** 65 //åå¦ç(ã¯ãã¹ãã©ã¦ã¶ç¨) 66 if(window.opera){ 67 //Operaç¨ 68 $(input_obj).keypress(processKey); 69 $(input_obj).keydown(processKey); 70 }else{ 71 //ãã®ä»ç¨ 72 $(input_obj).keydown(processKey); 73 } 74 75 76 //$(input_obj).focus(function() { 77 // show_hide = true; 78 // checkValChange(); 79 //}); 80 $(input_obj).blur(function(ev) { 81 //å ¥åå¤ã®ç£è¦ã䏿¢ 82 clearTimeout(timer_val_change); 83 84 //åè£æ¶å»ãäºç´ 85 show_hide = false;
86 87 //æ¶å»äºç´ã¿ã¤ãã¼ãã»ãã 88 checkShowHide(); 89 }); 90 $(input_obj).mousedown(function(ev) { 91 reserve_click = true; 92 93 //æ¶å»äºç´ã¿ã¤ãã¼ã䏿¢ 94 clearTimeout(timer_show_hide); 95 96 ev.stopPropagation(); 97 }); 98 $(input_obj).mouseup(function(ev) { 99 $(input_obj).focus(); 100 reserve_click = false; 101 ev.stopPropagation(); 102 }); 103 104 //********************************************** 105 //bodyå ¨ä½ 106 //********************************************** 107 $('body').mouseup(function() { 108 //æ¶å»äºç´ã¿ã¤ãã¼ã䏿¢ 109 clearTimeout(timer_show_hide); 110 111 //åè£ãæ¶å»ãã 112 show_hide = false; 113 hideResult(); 114 }); 115 116 //================================================================================ 117 // 03. Suggestç¨ã¡ã½ãã - æªåé¡ 118 //-------------------------------------------------------------------------------- 119 //********************************************** 120 //ã¿ã¤ãã¼ã«ããå ¥åå¤å¤åç£è¦ 121 //********************************************** 122 function checkValChange() { 123 timer_val_change = setTimeout(isChange,500); 124 125 function isChange() { 126 var now_value = $(input_obj).val(); 127 if(!now_value){ 128 hideResult(); 129 }else if(now_value != prev_value && !is_select) { 130 if ($(input_obj).hasClass("suggestEnabled") && $('.as_results').size() > 0) { 131 suggest(); 132 } 133 } 134 is_select = false; 135 prev_value = now_value; 136 137 //ã¦ã¼ã¶ããã¨ãã¨å ¥åãã¦ããå¤ãæ ¼ç´ 138 if(!getCurrentResult()) user_value = $(input_obj).val(); 139 140 //ä¸å®æéãã¨ã®ç£è¦ãåé 141 checkValChange(); 142 } 143 } 144 145 //********************************************** 146 //åè£ã®æ¶å»ãæ¬å½ã«å®è¡ããã夿 147 //********************************************** 148 function checkShowHide() { 149 timer_show_hide = setTimeout(function() { 150 if (show_hide == false && reserve_click == false){ 151 hideResult(); 152 } 153 },500); 154 } 155 156 //********************************************** 157 //ãã¼å ¥åã¸ã®å¯¾å¿ 158 //********************************************** 159 function processKey(e) { 160 if ( 161 (/27$|38$|40$|^9$/.test(e.keyCode) && $results.is(':visible')) || 162 (/^13$|^9$/.test(e.keyCode) && getCurrentResult()) 163 ) { 164 if (e.preventDefault) e.preventDefault(); 165 if (e.stopPropagation) e.stopPropagation(); 166 167 e.cancelBubble = true; 168 e.returnValue = false; 169 170 switch(e.keyCode) { 171 case 38: // up 172 key_select = true; 173 prevResult(); 174 break; 175 176 case 40: // down 177 key_select = true; 178 nextResult(); 179 break; 180 181 case 9: // tab 182 hideResult(); 183 break; 184 185 case 13: // return 186 selectCurrentResult(true); 187 break; 188 189 case 27: // escape 190 hideResult(); 191 break; 192 } 193 } else { 194 checkValChange(); 195 } 196 } 197 198 //================================================================================ 199 // 04. Suggestç¨ã¡ã½ãã - Ajaxé¢é£ 200 //-------------------------------------------------------------------------------- 201 //********************************************** 202 //Ajaxã®ä¸æ 203 //********************************************** 204 function abortAjax() { 205 if ($xhr){ 206 $xhr.abort(); 207 $xhr = false; 208 } 209 } 210 211 //********************************************** 212 //Ajaxéä¿¡ 213 //********************************************** 214 function suggest(){ 215 if($(input_obj).val().search(/^[ ã\n\r\t]*$/) > -1) return; 216 217 //Ajaxéä¿¡ããã£ã³ã»ã« 218 abortAjax(); 219 220 //ããã§Ajaxéä¿¡ãè¡ã£ã¦ãã 221 $xhr = $.getJSON( 222 options.source, 223 { 224 'q_word' : $(input_obj).val(), 225 'database' : options.database, 226 'sub_info' : options.sub_info, 227 'and_or' : options.and_or, 228 'limit' : options.limit, 229 'order_by' : options.order_by 230 }, 231 function(json_data){ 232 if(!json_data || json_data.length < 1){ 233 hideResult(); 234 }else{ 235 displayItems(json_data); 236 } 237 } 238 ); 239 } 240 241 //================================================================================ 242 // 05. Suggestç¨ã¡ã½ãã - åè£ãªã¹ãé¢é£ 243 //-------------------------------------------------------------------------------- 244 //********************************************** 245 //åè£ä¸è¦§ã®<ul>æå½¢ã表示 246 //********************************************** 247 // @params array arr_candidate DBããæ¤ç´¢ã»åå¾ããå¤ã®é å 248 // 249 //arr_candidateããããã®å¤ã<li>ã§å²ãã§è¡¨ç¤ºã 250 //åæã«ãã¤ãã³ããã³ãã©ãè¨è¿°ã 251 function displayItems(arr_candidate) { 252 253 //åè£ãªã¹ããã䏿¦ãªã»ãã 254 $results.empty(); 255 256 for (var i = 0; i < arr_candidate.length; i++) { 257 //åè£ãªã¹ã 258 if(options.sub_info !== false){ 259 //var $li = $('<li>' + arr_candidate[i][0] + '</li>'); $$$ 260 //ãµãæ å ±ãæ ¼ç´ããç¬èªã®å±æ§"sub_info"ãè¨å® 261 //$li.attr('sub_info',arr_candidate[i][1]); 262 var $li = $('<li>') 263 .text(arr_candidate[i][0]) 264 .attr('sub_info', arr_candidate[i][1]); 265 }else{ 266 var $li = $('<li>' + arr_candidate[i] + '</li>'); 267 $li.text($li.html()); 268 //ä¸è¨ã®ããã«ãä¸åº¦ã«HTMLã¨ã³ãã£ãã£åããã¨ããªããå¤
268±æããâ¦ã 269 //var $li = $('<li>').text(arr_candidate[i]); 270 } 271 $li.css("padding-left", $(input_obj).css("padding-left")); 272 $results.append($li); 273 } 274 //---------------------------------------------- 275 //åè£ãªã¹ãã®ä½ç½®ãæå® 276 //---------------------------------------------- 277 var offset = $(input_obj).offset(); 278 279 offset.top += 280 $(input_obj).height() + 281 parseInt($(input_obj).css('border-top-width'), 10) + 282 parseInt($(input_obj).css('padding-top'), 10) + 283 parseInt($(input_obj).css('padding-bottom'), 10); 284 if(typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined"){ 285 //IEã¯ç¸å¯¾åº§æ¨ã§offsetãåå¾ããã 286 //ãã®ãããç»é¢ã¹ã¯ãã¼ã«åãè¶³ãåãããå¿ è¦ãããã 287 offset.top += parseInt($results.scrollTop(), 10); 288 } 289 290 offset.left += parseInt($(input_obj).css('padding-left'), 10); 291 if((typeof window.addEventListener == "undefined" && typeof document.getElementsByClassName == "undefined") || window.opera){ 292 offset.left -= parseInt($(input_obj).css('border-left-width'), 10); 293 } 294 295 //ç»é¢ã«è¡¨ç¤º 296 $results 297 .show() 298 .css({'top':offset.top, 'left':offset.left - parseInt($(input_obj).css('padding-left'), 10)}) 299 .width( 300 $(input_obj).width() + 301 parseInt($(input_obj).css('padding-left'), 10) + 302 parseInt($(input_obj).css('padding-right'), 10) - 303 (parseInt($(input_obj).css("border-left-width"), 10) * 2) 304 ); 305 306 $results 307 .children('li') 308 .mouseover(function() { 309 310 //Firefoxã§ã¯ãåè£ä¸è¦§ã®ä¸ã«ãã¦ã¹ã«ã¼ã½ã«ãä¹ã£ã¦ãã㨠311 //ãã¾ãã¹ã¯ãã¼ã«ããªãããã®ããã®å¯¾çãã¤ãã³ã䏿ã 312 if (key_select) { 313 key_select = false; 314 return; 315 } 316 317 $results.children('li').removeClass(options.select_class); 318 $(this).addClass(options.select_class); 319 setSubInfo(this); //ãµãæ å ± 320 321 }) 322 .mousedown(function(e) { 323 reserve_click = true; 324 325 //æ¶å»äºç´ã¿ã¤ãã¼ã䏿¢ 326 clearTimeout(timer_show_hide); 327 //ev.stopPropagation(); 328 }) 329 .mouseup(function(e) { 330 reserve_click = false; 331 332 //Firefoxã§ã¯ãåè£ä¸è¦§ã®ä¸ã«ãã¦ã¹ã«ã¼ã½ã«ãä¹ã£ã¦ãã㨠333 //ãã¾ãã¹ã¯ãã¼ã«ããªãããã®ããã®å¯¾çãã¤ãã³ã䏿ã 334 if (key_select) { 335 key_select = false; 336 return; 337 } 338 e.preventDefault(); 339 e.stopPropagation(); 340 selectCurrentResult(false); 341 }); 342 } 343 344 //********************************************** 345 //ç¾å¨é¸æä¸ã®åè£ãåå¾ 346 //********************************************** 347 // @return object current_result ç¾å¨é¸æä¸ã®åè£ã®ãªãã¸ã§ã¯ã(<li>è¦ç´ ) 348 function getCurrentResult() { 349 350 if (!$results.is(':visible')) return false; 351 352 var $current_result = $results.children('li.' + options.select_class); 353 354 if (!$current_result.length) $current_result = false;
355 356 return $current_result; 357 } 358 //********************************************** 359 //ç¾å¨é¸æä¸ã®åè£ã«æ±ºå®ãã 360 //********************************************** 361 function selectCurrentResult(type) { 362 363 var $current_result = getCurrentResult(); 364 if ($current_result) { 365 $(input_obj).val($current_result.text()); 366 hideResult(); 367 368 //added 369 prev_value = $(input_obj).val(); 370 } 371 $(input_obj).focus(); //ããã¹ãããã¯ã¹ã«ãã©ã¼ã«ã¹ãç§»ã 372 //åè£é¸æãå¼ãéã«ãã¤ãã³ããçºç«ãã 373 if(options.bind_to) $(input_obj).trigger(options.bind_to, type); 374 } 375 //********************************************** 376 //鏿åè£ã次ã«ç§»ã 377 //********************************************** 378 function nextResult() { 379 var $current_result = getCurrentResult(); 380 381 if ($current_result) { 382 $current_result 383 .removeClass(options.select_class) 384 .next() 385 .addClass(options.select_class); 386 }else{ 387 $results.children('li:first-child').addClass(options.select_class); 388 } 389 //ããã¹ãããã¯ã¹ã®å¤ã夿´ 390 //åè£ãªã¹ãããããã¯ã¹ã¸æ»ããªããå ã ã®å¤ã表示 391 is_select = true; 392 if($current_result && $current_result.is('li:last-child')){ 393 $(input_obj).val(user_value); 394 if(options.sub_info !== false) $sub_info.hide(); 395 }else{ 396 var $selected = $results.children('.'+options.select_class); 397 $(input_obj).val($selected.text()); 398 setSubInfo($selected); //ãµãæ å ± 399 } 400 } 401 //********************************************** 402 //鏿åè£ãåã«ç§»ã 403 //********************************************** 404 function prevResult() { 405 var $current_result = getCurrentResult(); 406 407 if ($current_result) { 408 $current_result 409 .removeClass(options.select_class) 410 .prev() 411 .addClass(options.select_class); 412 }else{ 413 $results.children('li:last-child').addClass(options.select_class); 414 } 415 //ããã¹ãããã¯ã¹ã®å¤ã夿´ 416 //åè£ãªã¹ãããããã¯ã¹ã¸æ»ããªããå ã ã®å¤ã表示 417 is_select = true; 418 if($current_result && $current_result.is('li:first-child')){ 419 $(input_obj).val(user_value); 420 if(options.sub_info !== false) $sub_info.hide(); 421 }else{ 422 var $selected = $results.children('.'+options.select_class); 423 $(input_obj).val($selected.text()); 424 setSubInfo($selected); //ãµãæ å ± 425 } 426 } 427 //********************************************** 428 //åè£ã¨ãªã¢ãæ¶å» 429 //********************************************** 430 function hideResult() { 431 $results.hide(); 432 if(options.sub_info !== false) $sub_info.hide(); 433 434 //Ajaxéä¿¡ããã£ã³ã»ã« 435 abortAjax(); 436 } 437 438 //================================================================================ 439 // 09. ComboBoxç¨ã¡ã½ãã - ãµãæ å ±é¢é£ 440 //-------------------------------------------------------------------------------- 441 var $sub_info = $('<div class="sub_info"></div>') 442 .hide() 443 .appendTo('body'); 444 445 //********************************************** 446 //ãµãæ å ±ã®ä½ç½®è¨å® 447 //********************************************** 448 function setSubInfo(obj){ 449 if(options.sub_info === false) return; 450 var offset = $(obj).offset(); 451 $sub_info 452 .css({ 453 'top' : offset.top + 'px', 454 'left' : offset.left + $results.width() + 'px' 455 }); 456 var html = $(obj).attr('sub_info'); 457 //æçµçã«ããµãæ å ±ã空ãªã表示ããªã 458 if(html == ''){ 459 $sub_info.text(html).hide(); 460 }else{ 461 $sub_info.text(html).show(); 462 } 463 } 464 //********************************************** 465 //ãµãæ å ±ã®ã¤ãã³ããã³ãã© 466 //********************************************** 467 $sub_info.mousedown(function(ev) { 468 reserve_click = true; 469 470 //æ¶å»äºç´ã¿ã¤ãã¼ã䏿¢ 471 clearTimeout(timer_show_hide); 472 ev.stopPropagation(); 473 }); 474 $sub_info.mouseup(function(ev) { 475 reserve_click = false; 476 477 //æ¶å»äºç´ã¿ã¤ãã¼ã䏿¢ 478 clearTimeout(timer_show_hide); 479 ev.stopPropagation(); 480 }); 481 482 }; 483 484 //================================================================================
485 // 06. å¦çã®å§ã¾ã 486 //-------------------------------------------------------------------------------- 487 $.fn.ajaxSuggest = function(source, options) { 488 if (!source) return; 489 490 //************************************************************ 491 //ãªãã·ã§ã³ 492 //************************************************************ 493 options = $.extend({ 494 //åºæ¬è¨å® 495 source : source, 496 database : 0, //æ¥ç¶ããDBã®è¨å®(é åã®çªå·) 497 and_or : 'AND', //ANDæ¤ç´¢ããORæ¤ç´¢ã? 498 limit : 10, //åè£ãªã¹ãã¨ãã¦è¡¨ç¤ºããæå¤§ä»¶æ° 499 order_by : 'ASC', //ORDER BY(SQL) ã§ãä¸¦ãæ¿ããã®ã¯æé ãéé ã 500 bind_to : false, //åè£ã鏿ãããã¨ãã«çºç«ããã¤ãã³ãå 501 sub_info : false, //ãµãæ å ±ã表示ããã?ã©ã®ãã£ã¼ã«ãã? 502 results_class : 'as_results', //åè£ä¸è¦§ãå²ã<ul> 503 select_class : 'as_over' //鏿ä¸ã®<li> 504 }, options); 505 this.each(function() { 506 if (!$(this).hasClass("suggestEnabled")) { 507 new $.ajaxSuggest(this, source, options); 508 } 509 }); 510 return this; 511 }; 512})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.