PageSourceSearch

https://ls1.koikeya.co.jp/js/search_suggest.js

js koikeya.co.jp collected 2026-09-24 20:24:57 UTC 7,347 bytes, 223 lines download raw bytes

1var searchSuggestFormSelector = ".withSuggestSearch_";
2var searchSuggestAreaSelector = "#search_suggest_area_";
3var searchSuggestPendingTime  = 200;
4var searchSuggestMinLength    = 1;
5var searchSuggestURL          = '';
6var searchSuggestAreaTmpl     = '<div id="search_suggest_area_"></div>';
7var searchSuggestTimer        = null;
8var searchSuggestCurrentForm  = null;
9
10// ‰Šú‰»ˆ—
11jQuery(document).ready(function() {
12	
13	// ƒTƒWƒFƒXƒgAjax‚ÌURL¶¬
14	searchSuggestURL = EC_WWW_ROOT + "/shop/search/searchsuggest.aspx";
15	
16	// ƒL[ƒ[ƒh‚ð“ü—Í‚µ‚½A‚Ü‚½‚́AƒL[ƒ[ƒh‚ɃtƒH[ƒJƒX‚µ‚½ê‡‚̃Cƒxƒ“ƒg
17	jQuery(searchSuggestFormSelector).on(
18		"keyup focus input" , function(e) { triggerSearchSuggest( e, jQuery(this) ); }
19	);
20	
21	jQuery(searchSuggestFormSelector).on(
22		"keydown" , function(e) {
23						if( e.which == 40 ) {
24							jQuery(searchSuggestAreaSelector).find('a:first').focus();
25							e.preventDefault();
26							e.stopPropagation();
27						}
28	});
29
30	jQuery(document).on(
31		"keydown", searchSuggestAreaSelector,  function(e) {
32						if( e.which == 38 ) {
33							var prevObj          = jQuery(document.activeElement).parent().prev();
34							var prevObjParent    = jQuery(document.activeElement).parent().parent().prev();
35
36							if(!prevObj[0] && !prevObjParent[0]) {
37								jQuery(searchSuggestAreaSelector).find('a:last').focus();
38							} else if(prevObj[0]) {
39								prevObj.find('a:last').focus();
40							} else if(prevObjParent[0]) {
41								prevObjParent.children(':last').find('a:last').focus();
42							}
43							e.preventDefault();
44							e.stopPropagation();
45
46						}
47						if( e.which == 40 ) {	
48							var nextObj = jQuery(document.activeElement).parent().next();
49							var nextObjParent    = jQuery(document.activeElement).parent().parent().next();
50
51							if(!nextObj[0] && !nextObjParent[0]) {
52								jQuery(searchSuggestAreaSelector).find('a:first').focus();
53							} else if(nextObj[0]) {
54								nextObj.find('a:first').focus();
55							} else if(nextObjParent[0]) {
56								nextObjParent.children(':first').find('a:first').focus();
57							}
58							e.preventDefault();
59							e.stopPropagation();
60						}
61						if (e.which == 13) {
62							return jQuery(document.activeElement).click();
63						}
64	});
65
66	jQuery(document).on(
67		"focus", searchSuggestAreaSelector,  function(e) {
68									jQuery(searchSuggestAreaSelector).find('#suggest_keyword_list_').children('div.suggest_keyword_').css({'background-color':''});
69									jQuery(searchSuggestAreaSelector).find('#suggest_goods_list_').children().css({'background-color':''});
70									jQuery(e.target).parent().css({'background-color':'#dedede'});
71	});
72
73	// ƒTƒWƒFƒXƒgƒL[ƒ[ƒh‚ðƒNƒŠƒbƒN‚³‚ꂽê‡‚̃Cƒxƒ“ƒg
74	jQuery(document).on(
75		"click", ".suggest_keyword_entry_", function() { selectSearchSuggestKeyword(jQuery(this)); return false; }
76	);
77	
78	// ƒTƒWƒFƒXƒg¤•i‚ðƒNƒŠƒbƒN‚³‚ꂽê‡‚̃Cƒxƒ“ƒg
79	jQuery(document).on(
80		"click", ".suggest_goods_", function() { selectSearchSuggestGoods(jQuery(this)); }
81	);
82	
83	// ƒTƒWƒFƒXƒgƒGƒŠƒAŠO‚ðƒNƒŠƒbƒN‚³‚ꂽê‡‚̃Cƒxƒ“ƒg
84    jQuery("body").on(
85    	"click", function(e){ hideSearchSuggest(e); }
86    );
87	
88});
89
90// ƒTƒWƒFƒXƒgƒL[ƒ[ƒh‘I‘ðŽž‚Ìˆ—
91function selectSearchSuggestKeyword(entry) {
92	jQuery(searchSuggestCurrentForm).val(entry.text());
93	if (jQuery(searchSuggestCurrentForm).data("suggest-submit") == "on") {
94		// suggest-submit‚ªon‚ÌŽž‚Íform‚ðsubmit
95		jQuery(searchSuggestCurrentForm).closest("form").submit();
96	}else{
97		// suggest-submit‚ªoff‚ÌŽž‚̓TƒWƒFƒXƒgƒGƒŠƒA‚ð•‚¶‚é
98		removeSearchSuggest();
99	}
100}
101
102// ƒTƒWƒFƒXƒg¤•i‘I‘ðŽž‚Ìˆ—
103function selectSearchSuggestGoods(entry) {
104	location.href = entry.find("a").attr("href");
105}
106
107// ƒL[ƒ[ƒh“ü—ÍŒãƒTƒWƒFƒXƒg•\ަƒ^ƒCƒ}[ŠJŽnˆ—
108function triggerSearchSuggest(e, inputForm) {
109	
110	var inputKeyword = inputForm.val();
111	
112	// ƒGƒ“ƒ^[‚̏ꍇ‚Í’†’f
113    if (e.keyCode == 13) {
114        return false;
115    }
116	
117	// Šù‚É•\ަƒ^ƒCƒ}[‚ªŠJŽn‚³‚ê‚Ä‚¢‚éê‡‚ÍŽæ‚èÁ‚µ
118	if (searchSuggestTimer) {
119		clearTimeout(searchSuggestTimer);
120		searchSuggestTimer = null;
121	}
122	
123	// “ü—Í‚ª‹ó‚©Å’á“ü—Í•¶Žš”‚É–ž‚½‚È‚¢ê‡‚Í’†’f
124	if (inputKeyword == '' || inputKeyword.length < searchSuggestMinLength){
125		removeSearchSuggest();
126		return false;
127	}
128	
129	// •\ަƒ^ƒCƒ}[‚ðƒZƒbƒg
130    searchSuggestTimer = setTimeout(function() {
131    		    searchSuggestTimer = null;
132                requestSearchSuggest(inputForm, inputKeyword);
133	          }, searchSuggestPendingTime);
134	
135}
136
137// ƒTƒWƒFƒXƒg•\ަƒ^ƒCƒ}[‚ªƒ^ƒCƒ€ƒAƒEƒgŒã‚̏ˆ—
138function requestSearchSuggest(inputForm, inputKeyword) {
139	
140    jQuery.ajax({
141        url: searchSuggestURL,
142        type: "POST",
143        dataType: "html",
144        cache: false,
145        data: {input_keyword : inputKeyword},
146        success: function(responseHtml) {
147			// ƒTƒWƒFƒXƒgƒGƒŠƒAÁ‹Ž
148			removeSearchSuggest();
149			
150			// ƒTƒWƒFƒXƒgƒf[ƒ^‚ðŽóM‚µ‚½‚ªƒL[ƒ[ƒh‚ªƒNƒŠƒA‚³‚ê‚Ä‚¢‚½ê‡‚Í’†’f
151			if (inputForm.val() == '') { return; }
152			
153			// ƒTƒWƒFƒXƒgƒf[ƒ^‚ª‹ói‰üs‚݂̂̏ꍇ‚ðŠÜ‚ށj‚̏ꍇ‚Í’†’f
154			if (responseHtml.replace(/\s+$/, "") == '') { return; }
155			
156			// ƒTƒWƒFƒXƒgƒf[ƒ^‚ªƒZƒbƒVƒ‡ƒ“Ø‚êHTML“™‚É’u‚«Š·‚í‚Á‚Ä‚¢‚éê‡‚Í’†’f
157			if (responseHtml.indexOf("suggest_keyword_list") == -1 && responseHtml.indexOf("suggest_goods_list") == -1) { return; }
158			
159			// ƒTƒWƒFƒXƒgƒGƒŠƒA•\ަ
160            showSearchSuggest(inputForm, responseHtml);
161        }
162    });
163	
164}
165
166// ƒTƒWƒFƒXƒgƒGƒŠƒA•\ަˆ—
167function showSearchSuggest(inputForm, responseHtml) {
168
169	// ƒTƒWƒFƒXƒgƒGƒŠƒA‚̃eƒ“ƒvƒŒ[ƒg‚ð’ljÁ
170	jQuery("body").append(searchSuggestAreaTmpl);
171	
172	// ƒTƒWƒFƒXƒgƒGƒŠƒA‚ÌHTML‚ðƒZƒbƒg
173	var suggestArea = jQuery(searchSuggestAreaSelector);
174    suggestArea.html(responseHtml);
175
176	// •\ަˆÊ’u‚Ì’²®
177	var ctrl = inputForm;
178	var ctrlOffset = ctrl.offset();
179	var ctrlLeft = ctrlOffset.left;
180	var ctrlTop = ctrlOffset.top + jQuery(ctrl).outerHeight(false);
181	suggestArea.offset({ top : ctrlTop, left : ctrlLeft });
182
183	var paddingWidth = parseInt(suggestArea.css('margin-left')) 
184	                 + parseInt(suggestArea.css('margin-right'))
185	                 + parseInt(suggestArea.css('padding-left'))
186	                 + parseInt(suggestArea.css('padding-right'));
187	var width = jQuery(ctrl).outerWidth(true) - paddingWidth;
188	suggestArea.css("min-width",width);
189	
190	// ƒTƒWƒFƒXƒg‚ð•\ަ‚µ‚½ƒtƒH[ƒ€‚ð•ÛŽ
191	searchSuggestCurrentForm = inputForm;
192	
193	// ƒTƒWƒFƒXƒgƒGƒŠƒA•\ަ
194    suggestArea.show();
195	
196}
197
198// ƒTƒWƒFƒXƒgƒGƒŠƒA”ñ•\ަ”»’è‚Æ”ñ•\ަˆ—ŒÄ‚яo‚µ
199function hideSearchSuggest(e) {
200	
201	var suggestArea = jQuery(searchSuggestAreaSelector);
202	if (suggestArea.size()) {
203		 var x = e.clientX + jQuery(window).scrollLeft();
204         var y = e.clientY + jQuery(window).scrollTop();
205         var ctrlOffset = suggestArea.offset();
206         var startX = ctrlOffset.left;
207         var endX = startX + suggestArea.outerWidth(true);
208         var startY = ctrlOffset.top;
209         var endY = startY + suggestArea.outerHeight(true);
210         
211         if (x < startX || x > endX || y < startY || y > endY) {
212         	removeSearchSuggest();
213         }
214	}
215}
216
217
218// ƒTƒWƒFƒXƒgƒGƒŠƒA”ñ•\ަˆ—
219function removeSearchSuggest() {
220	jQuery(searchSuggestAreaSelector).remove();
221	searchSuggestCurrentForm = null;
222}
223

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.