/** * infoWindow的template * @author Liuyl * @date 2015/11/9 */ define([ "base/BaseControl", "base/AppEvent", "dojo", "dojo/_base/declare", "dojo/_base/array", "dojo/text!controls/searchbox/SearchBox.html", "dojo/_base/lang", "dojo/_base/connect", "dojo/query", "dojo/dom-construct", "dojo/dom-style", "dojo/dom-attr", "dojo/dom-geometry", "dojo/on", "dojo/dom-class", "dojo/domReady!" ], function( BaseControl, AppEvent, dojo, declare, arrayUtil, template, lang, connect, query, domConstruct, domStyle, domAttr, domGeometry, on, domClass ) { var Widget = declare("SearchBox", [BaseControl], { templateString: template, baseClass: "searchbox", constructor: function(options, srcRefNode) { this.currentKeyword = null; if (!this.suggestCount) this.suggestCount = 10; this.currentStart = 0; this.currentCount = 0; this.mouseOverSuggest = false; }, getInputValue: function() { return this.inputTextDom.value.trim(); }, startup: function() { on(this.inputButton, "click", lang.hitch(this, function(evt) { var value = this.getInputValue(); if (value) { AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, { hockId: this.id, type: "search", args: { keyword: value, } }); } this.hideSuggest(); })); on(this.inputClearDom, "click", lang.hitch(this, function(evt) { this.clear(); AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, { hockId: this.id, type: "clear" }); })); on(this.inputTextDom, "input", lang.hitch(this, function(evt) { var value = this.getInputValue(); domStyle.set(this.inputClearDom, "display", "block"); if (!value) { domStyle.set(this.inputClearDom, "display", "none"); this.hideSuggest(); } else if (this._checkChanged(value, 0)) { this.querySuggest(value, 0); } this.currentKeyword = value; AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, { hockId: this.id, type: "input", args: { keyword: value, } }); })); on(this.inputTextDom, "keypress", lang.hitch(this, function(evt) { if (evt.keyCode == 13) { var value = this.getInputValue(); if (value) { AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, { hockId: this.id, type: "search", args: { keyword: value, } }); } this.hideSuggest(); } })); on(this.inputTextDom, "focus", lang.hitch(this, function(evt) { //点击菜单项有可能导致触发该事件,未知原因,relatedTarget为空时为正常触发 if (evt.relatedTarget) { return; } var value = this.getInputValue(); if (!value) { this.hideSuggest(); } else if (this._checkChanged(value, 0)) { this.querySuggest(value, 0); } else if (this.currentCount) { this.showSuggest(); } this.currentKeyword = value; })); on(this.inputTextDom, "blur", lang.hitch(this, function(evt) { if (!this.mouseOverSuggest) this.hideSuggest(); })); this.suggestDom = domConstruct.create("div", { className: "searchbox-suggest-container", "data-searchbox": this.id, innerHTML: "
" }, document.body); this.suggestUlDom = query("ul", this.suggestDom)[0]; on(this.suggestDom, "mouseover", lang.hitch(this, function(evt) { this.mouseOverSuggest = true; })); on(this.suggestDom, "mouseleave", lang.hitch(this, function(evt) { this.mouseOverSuggest = false; })); AppEvent.addAppEventListener(AppEvent.QUERY_SUCCESS, lang.hitch(this, function(evt) { if (evt.hockId == this.id) { this.updateSuggest(evt); } })); AppEvent.addAppEventListener(AppEvent.QUERY_ERROR, lang.hitch(this, function(evt) { if (evt.hockId == this.id) { this.updateSuggest(evt); } })); AppEvent.addAppEventListener(AppEvent.CHANGE_SEARCHBOX_STATE, lang.hitch(this, this.onChangeStateHandler)); if (this.placeholder) { domAttr.set(this.inputTextDom, "placeholder", this.placeholder); } if (this.disableButton) { domStyle.set(this.inputButton, "display", "none"); } this.inherited(arguments); }, onChangeStateHandler: function(evt) { if (evt.hockId == this.id) { if (evt.type == "clear") { this.clear(); } else if (evt.type == "update") { if (evt.data && evt.data.hasOwnProperty("keyword")) { domAttr.set(this.inputTextDom, "value", evt.data.keyword.trim()); if (evt.data.keyword.trim()) { domStyle.set(this.inputClearDom, "display", "block"); } } } } }, postCreate: function() { this.inherited(arguments); }, _checkChanged: function(keyword, start) { return !(this.currentKeyword == keyword && this.currentStart == start); }, querySuggest: function(keyword, start) { if (!this.disableSuggest) { AppEvent.dispatchAppEvent(AppEvent.RUN_SMART_QUERY, { hockId: this.id, args: { keyword: keyword,//encodeURIComponent(keyword), start: start, count: this.suggestCount } }); } }, updateSuggest: function(evt) { if (evt.error) { console.log(evt.error); } if (evt.result) { domConstruct.empty(this.suggestUlDom); if (evt.result.data.count) this.currentCount = parseInt(evt.result.data.count); else { this.currentCount = 0; } if (this.currentCount == 0) { this.hideSuggest(); } else if (this.currentCount == 1) { this._buildSuggestItem(evt.result.data.items[0]||evt.result.data.items); this.showSuggest(); } else { arrayUtil.forEach(evt.result.data.items, lang.hitch(this, function(item, index) { this._buildSuggestItem(item); })); this.showSuggest(); } return; } this.hideSuggest(); }, _buildSuggestItem: function(item) { var li = domConstruct.create("li", { innerHTML: "" + item.name + "" + item.adress + "", className: "searchbox-suggest-item", "data-poi-id": item.id, "data-poi-type": item.poitype, "data-pac": item.pac }, this.suggestUlDom) on(li, "click", lang.hitch(this, function(evt) { var value = query("i", evt.currentTarget)[0].innerHTML; domAttr.set(this.inputTextDom, "value", value); var value = this.inputTextDom.value.trim(); // AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, { // hockId: this.id, // type: "suggest", // args: { // keyword: value, // poiId: domAttr.get(evt.currentTarget, "data-poi-id"), // poiName: domAttr.get(evt.currentTarget, "data-poi-type"), // pac: domAttr.get(evt.currentTarget, "data-pac") // } // }); AppEvent.dispatchAppEvent(AppEvent.SEARCHBOX_QUERY, { hockId: this.id, type: "search", args: { keyword: value, poiType: null, poiName: "全部" } }); this.hideSuggest(); })); }, showSuggest: function() { if (!this.disableSuggest && $(this.inputDom).is(":visible")) { var pos = domGeometry.position(this.inputDom, true); domStyle.set(this.suggestDom, "left", pos.x + "px"); domStyle.set(this.suggestDom, "top", pos.y + pos.h + "px"); domStyle.set(this.suggestDom, "width", (pos.w - 14) + "px"); domStyle.set(this.suggestDom, "display", "block"); } }, hideSuggest: function() { if (!this.disableSuggest) { domStyle.set(this.suggestDom, "display", "none"); } }, clear: function() { this.currentKeyword = null; this.currentStart = 0; this.currentCount = 0; this.mouseOverSuggest = false; domConstruct.empty(this.suggestUlDom); this.hideSuggest(); domAttr.set(this.inputTextDom, "value", ""); domStyle.set(this.inputClearDom, "display", "none"); }, show: function() { domStyle.set(this.domNode, "display", "block"); }, hide: function() { domStyle.set(this.domNode, "display", "none"); } }); return Widget; });