📄 autocompletebehavior.js
字号:
// (c) Copyright Microsoft Corporation.
// This source is subject to the Microsoft Permissive License.
// See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
// All other rights reserved.
/// <reference name="MicrosoftAjax.debug.js" />
/// <reference name="MicrosoftAjaxTimer.debug.js" />
/// <reference name="MicrosoftAjaxWebForms.debug.js" />
/// <reference path="../ExtenderBase/BaseScripts.js" />
/// <reference path="../Common/Common.js" />
/// <reference path="../Compat/Timer/Timer.js" />
/// <reference path="../Animation/Animations.js" />
/// <reference path="../Animation/AnimationBehavior.js" />
/// <reference path="../PopupExtender/PopupBehavior.js" />
Type.registerNamespace('AjaxControlToolkit');
AjaxControlToolkit.AutoCompleteBehavior = function(element) {
/// <summary>
/// This behavior can be attached to a textbox to enable auto-complete/auto-suggest scenarios.
/// </summary>
/// <param name="element" type="Sys.UI.DomElement" DomElement="true" mayBeNull="false">
/// DOM Element the behavior is associated with
/// </param>
/// <returns />
AjaxControlToolkit.AutoCompleteBehavior.initializeBase(this, [element]);
// Path to the web service, or null if a page method
this._servicePath = null;
// Name of the web method
this._serviceMethod = null;
// User/page specific context provided to the web method
this._contextKey = null;
// Whether or not the the user/page specific context should be used
this._useContextKey = false;
this._minimumPrefixLength = 3;
this._completionSetCount = 10;
this._completionInterval = 1000;
this._completionListElementID = null;
this._completionListElement = null;
this._textColor = 'windowtext';
this._textBackground = 'window';
this._popupBehavior = null;
this._popupBehaviorHiddenHandler = null;
this._onShowJson = null;
this._onHideJson = null;
this._timer = null;
this._cache = null;
this._currentPrefix = null;
this._selectIndex = -1;
this._focusHandler = null;
this._blurHandler = null;
this._bodyClickHandler = null;
this._completionListBlurHandler = null;
this._keyDownHandler = null;
this._mouseDownHandler = null;
this._mouseUpHandler = null;
this._mouseOverHandler = null;
this._tickHandler = null;
this._enableCaching = true;
this._flyoutHasFocus = false;
this._textBoxHasFocus = false;
this._completionListCssClass = null;
this._completionListItemCssClass = null;
this._highlightedItemCssClass = null;
this._delimiterCharacters = null;
this._firstRowSelected = false;
// WebRequest object returned from WebServiceProxy.invoke
this._webRequest = null;
}
AjaxControlToolkit.AutoCompleteBehavior.prototype = {
initialize: function() {
/// <summary>
/// Initializes the autocomplete behavior.
/// </summary>
/// <returns />
AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'initialize');
$common.prepareHiddenElementForATDeviceUpdate();
this._popupBehaviorHiddenHandler = Function.createDelegate(this, this._popupHidden);
this._tickHandler = Function.createDelegate(this, this._onTimerTick);
this._focusHandler = Function.createDelegate(this, this._onGotFocus);
this._blurHandler = Function.createDelegate(this, this._onLostFocus);
this._keyDownHandler = Function.createDelegate(this, this._onKeyDown);
this._mouseDownHandler = Function.createDelegate(this, this._onListMouseDown);
this._mouseUpHandler = Function.createDelegate(this, this._onListMouseUp);
this._mouseOverHandler = Function.createDelegate(this, this._onListMouseOver);
this._completionListBlurHandler = Function.createDelegate(this, this._onCompletionListBlur);
this._bodyClickHandler = Function.createDelegate(this, this._onCompletionListBlur);
this._timer = new Sys.Timer();
this.initializeTimer(this._timer);
var element = this.get_element();
this.initializeTextBox(element);
if(this._completionListElementID !== null)
this._completionListElement = $get(this._completionListElementID);
if (this._completionListElement == null ) {
this._completionListElement = document.createElement('ul');
this._completionListElement.id = this.get_id() + '_completionListElem';
// Safari styles the element incorrectly if it's added to the desired location
if (Sys.Browser.agent === Sys.Browser.Safari) {
document.body.appendChild(this._completionListElement);
} else {
element.parentNode.insertBefore(this._completionListElement, element.nextSibling);
}
}
this.initializeCompletionList(this._completionListElement);
this._popupBehavior = $create(AjaxControlToolkit.PopupBehavior,
{ 'id':this.get_id()+'PopupBehavior', 'parentElement':element, "positioningMode": AjaxControlToolkit.PositioningMode.BottomLeft }, null, null, this._completionListElement);
this._popupBehavior.add_hidden(this._popupBehaviorHiddenHandler);
// Create the animations (if they were set before initialize was called)
if (this._onShowJson) {
this._popupBehavior.set_onShow(this._onShowJson);
}
if (this._onHideJson) {
this._popupBehavior.set_onHide(this._onHideJson);
}
},
dispose: function() {
/// <summary>
/// Disposes the autocomplete behavior
/// </summary>
/// <returns />
this._onShowJson = null;
this._onHideJson = null;
if (this._popupBehavior) {
if (this._popupBehaviorHiddenHandler) {
this._popupBehavior.remove_hidden(this._popupBehaviorHiddenHandler);
}
this._popupBehavior.dispose();
this._popupBehavior = null;
}
if (this._timer) {
this._timer.dispose();
this._timer = null;
}
var element = this.get_element();
if (element) {
$removeHandler(element, "focus", this._focusHandler);
$removeHandler(element, "blur", this._blurHandler);
$removeHandler(element, "keydown", this._keyDownHandler);
$removeHandler(this._completionListElement, 'blur', this._completionListBlurHandler);
$removeHandler(this._completionListElement, 'mousedown', this._mouseDownHandler);
$removeHandler(this._completionListElement, 'mouseup', this._mouseUpHandler);
$removeHandler(this._completionListElement, 'mouseover', this._mouseOverHandler);
}
if (this._bodyClickHandler) {
$removeHandler(document.body, 'click', this._bodyClickHandler);
this._bodyClickHandler = null;
}
this._popupBehaviorHiddenHandler = null;
this._tickHandler = null;
this._focusHandler = null;
this._blurHandler = null;
this._keyDownHandler = null;
this._completionListBlurHandler = null;
this._mouseDownHandler = null;
this._mouseUpHandler = null;
this._mouseOverHandler = null;
AjaxControlToolkit.AutoCompleteBehavior.callBaseMethod(this, 'dispose');
},
initializeTimer: function(timer) {
/// <summary>
/// Initializes the timer
/// </summary>
/// <param name="timer" type="Sys.UI.Timer" DomElement="false" mayBeNull="false" />
/// <returns />
timer.set_interval(this._completionInterval);
timer.add_tick(this._tickHandler);
},
initializeTextBox: function(element) {
/// <summary>
/// Initializes the textbox
/// </summary>
/// <param name="element" type="Sys.UI.DomElement" DomElement="true" mayBeNull="false" />
/// <returns />
element.autocomplete = "off";
$addHandler(element, "focus", this._focusHandler);
$addHandler(element, "blur", this._blurHandler);
$addHandler(element, "keydown", this._keyDownHandler);
},
initializeCompletionList: function(element) {
/// <summary>
/// Initializes the autocomplete list element
/// </summary>
/// <param name="element" type="Sys.UI.DomElement" DomElement="true" mayBeNull="false" />
/// <returns />
if(this._completionListCssClass) {
Sys.UI.DomElement.addCssClass(element, this._completionListCssClass);
} else {
var completionListStyle = element.style;
completionListStyle.textAlign = 'left';
completionListStyle.visibility = 'hidden';
completionListStyle.cursor = 'default';
completionListStyle.listStyle = 'none';
completionListStyle.padding = '0px';
completionListStyle.margin = '0px! important';
if (Sys.Browser.agent === Sys.Browser.Safari) {
completionListStyle.border = 'solid 1px gray';
completionListStyle.backgroundColor = 'white';
completionListStyle.color = 'black';
} else {
completionListStyle.border = 'solid 1px buttonshadow';
completionListStyle.backgroundColor = this._textBackground;
completionListStyle.color = this._textColor;
}
}
$addHandler(element, "mousedown", this._mouseDownHandler);
$addHandler(element, "mouseup", this._mouseUpHandler);
$addHandler(element, "mouseover", this._mouseOverHandler);
$addHandler(element, "blur", this._completionListBlurHandler);
$addHandler(document.body, 'click', this._bodyClickHandler);
},
_currentCompletionWord: function() {
var element = this.get_element();
var elementValue = element.value;
var word = elementValue;
if (this.get_isMultiWord()) {
var startIndex = this._getCurrentWordStartIndex();
var endIndex = this._getCurrentWordEndIndex(startIndex);
if (endIndex <= startIndex) {
word = elementValue.substring(startIndex);
} else {
word = elementValue.substring(startIndex, endIndex);
}
}
return word;
},
_getCursorIndex: function() {
return this.get_element().selectionStart;
},
_getCurrentWordStartIndex: function() {
var element = this.get_element();
var elementText = element.value.substring(0,this._getCursorIndex());
var index = 0;
var lastIndex = -1;
for (var i = 0; i < this._delimiterCharacters.length; ++i) {
var curIndex = elementText.lastIndexOf(this._delimiterCharacters.charAt(i));
if (curIndex > lastIndex) {
lastIndex = curIndex;
}
}
index = lastIndex;
if (index >= this._getCursorIndex()) {
index = 0;
}
return index < 0 ? 0 : index + 1;
},
_getCurrentWordEndIndex: function(wordStartIndex) {
var element = this.get_element();
var elementText = element.value.substring(wordStartIndex);
var index = 0;
for (var i = 0; i < this._delimiterCharacters.length; ++i) {
var curIndex = elementText.indexOf(this._delimiterCharacters.charAt(i));
if (curIndex > 0 && (curIndex < index || index == 0)) {
index = curIndex;
}
}
return index <= 0 ? element.value.length : index + wordStartIndex;
},
get_isMultiWord : function() {
/// <value type="Boolean" mayBeNull="false">
/// Whether the behavior is currently in multi-word mode
/// </value>
return (this._delimiterCharacters != null) && (this._delimiterCharacters != '');
},
_getTextWithInsertedWord: function(wordToInsert) {
var text = wordToInsert;
var replaceIndex = 0;
var element = this.get_element();
var originalText = element.value;
if (this.get_isMultiWord()) {
var startIndex = this._getCurrentWordStartIndex();
var endIndex = this._getCurrentWordEndIndex(startIndex);
var prefix = '';
var suffix = '';
if (startIndex > 0) {
prefix = originalText.substring(0, startIndex);
}
if (endIndex > startIndex) {
suffix = originalText.substring(endIndex);
}
text = prefix + wordToInsert + suffix;
}
return text;
},
_hideCompletionList: function() {
/// <summary>
/// Hides the autocomplete flyout list
/// </summary>
/// <returns />
var eventArgs = new Sys.CancelEventArgs();
this.raiseHiding(eventArgs);
if (eventArgs.get_cancel()) {
return;
}
// Actually hide the popup
this.hidePopup();
},
showPopup : function() {
/// <summary>
/// Show the completion list popup
/// </summary>
/// <remarks>
/// If you cancel the showing event, you should still call
/// showPopup to ensure consistency of the internal state
/// </remarks>
this._popupBehavior.show();
this.raiseShown(Sys.EventArgs.Empty);
},
hidePopup : function() {
/// <summary>
/// Hide the completion list popup
/// </summary>
/// <remarks>
/// If you cancel the hiding event, you should still
/// call hidePopup to ensure consistency of the internal
/// state
/// </remarks>
if (this._popupBehavior) {
this._popupBehavior.hide();
} else {
this._popupHidden();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -