autocomplete.js
来自「原名JSPackager」· JavaScript 代码 · 共 1,960 行 · 第 1/5 页
JS
1,960 行
oAnim.onComplete.subscribe(onAnimComplete);
oAnim.animate();
this._bContainerOpen = bShow;
}
// Else don't animate, just show or hide
else {
if(bShow) {
oContainer._oContent.style.display = "block";
this.containerExpandEvent.fire(this);
}
else {
oContainer._oContent.style.display = "none";
this.containerCollapseEvent.fire(this);
}
this._toggleContainerHelpers(bShow);
this._bContainerOpen = bShow;
}
};
/**
* Toggles the highlight on or off for an item in the container, and also cleans
* up highlighting of any previous item.
*
* @param {object} oNewItem New The <li> element item to receive highlight
* behavior
* @param {string} sType "mouseover" will toggle highlight on, and "mouseout"
* will toggle highlight off.
* @private
*/
YAHOO.widget.AutoComplete.prototype._toggleHighlight = function(oNewItem, sType) {
var sHighlight = this.highlightClassName;
if(this._oCurItem) {
// Remove highlight from old item
YAHOO.util.Dom.removeClass(this._oCurItem, sHighlight);
}
if((sType == "to") && sHighlight) {
// Apply highlight to new item
YAHOO.util.Dom.addClass(oNewItem, sHighlight);
this._oCurItem = oNewItem;
}
};
/**
* Toggles the pre-highlight on or off for an item in the container.
*
* @param {object} oNewItem New The <li> element item to receive highlight
* behavior
* @param {string} sType "mouseover" will toggle highlight on, and "mouseout"
* will toggle highlight off.
* @private
*/
YAHOO.widget.AutoComplete.prototype._togglePrehighlight = function(oNewItem, sType) {
if(oNewItem == this._oCurItem) {
return;
}
var sPrehighlight = this.prehighlightClassName;
if((sType == "mouseover") && sPrehighlight) {
// Apply prehighlight to new item
YAHOO.util.Dom.addClass(oNewItem, sPrehighlight);
}
else {
// Remove prehighlight from old item
YAHOO.util.Dom.removeClass(oNewItem, sPrehighlight);
}
};
/**
* Updates the text input box value with selected query result. If a delimiter
* has been defined, then the value gets appended with the delimiter.
*
* @param {object} oItem The <li> element item with which to update the value
* @private
*/
YAHOO.widget.AutoComplete.prototype._updateValue = function(oItem) {
var oTextbox = this._oTextbox;
var sDelimChar = (this.delimChar) ? this.delimChar[0] : null;
var sSavedQuery = this._sSavedQuery;
var sResultKey = oItem._sResultKey;
oTextbox.focus();
// First clear text field
oTextbox.value = "";
// Grab data to put into text field
if(sDelimChar) {
if(sSavedQuery) {
oTextbox.value = sSavedQuery;
}
oTextbox.value += sResultKey + sDelimChar;
if(sDelimChar != " ") {
oTextbox.value += " ";
}
}
else { oTextbox.value = sResultKey; }
// scroll to bottom of textarea if necessary
if(oTextbox.type == "textarea") {
oTextbox.scrollTop = oTextbox.scrollHeight;
}
// move cursor to end
var end = oTextbox.value.length;
this._selectText(oTextbox,end,end);
this._oCurItem = oItem;
};
/**
* Selects a result item from the container
*
* @param {object} oItem The selected <li> element item
* @private
*/
YAHOO.widget.AutoComplete.prototype._selectItem = function(oItem) {
this._bItemSelected = true;
this._updateValue(oItem);
this.itemSelectEvent.fire(this, oItem, oItem._oResultData);
this._clearList();
};
/**
* For values updated by type-ahead, the right arrow key jumps to the end
* of the textbox, otherwise the container is closed.
*
* @private
*/
YAHOO.widget.AutoComplete.prototype._jumpSelection = function() {
if(!this.typeAhead) {
return;
}
else {
this._clearList();
}
};
/**
* Triggered by up and down arrow keys, changes the current highlighted
* <li> element item. Scrolls container if necessary.
*
* @param {number} nKeyCode Code of key pressed
* @private
*/
YAHOO.widget.AutoComplete.prototype._moveSelection = function(nKeyCode) {
if(this._bContainerOpen) {
// Determine current item's id number
var oCurItem = this._oCurItem;
var nCurItemIndex = -1;
if (oCurItem) {
nCurItemIndex = oCurItem._nItemIndex;
}
var nNewItemIndex = (nKeyCode == 40) ?
(nCurItemIndex + 1) : (nCurItemIndex - 1);
// Out of bounds
if (nNewItemIndex < -2 || nNewItemIndex >= this._nDisplayedItems) {
return;
}
if (oCurItem) {
// Unhighlight current item
this._toggleHighlight(oCurItem, "from");
this.itemArrowFromEvent.fire(this, oCurItem);
}
if (nNewItemIndex == -1) {
// Go back to query (remove type-ahead string)
if(this.delimChar && this._sSavedQuery) {
if (!this._textMatchesOption()) {
this._oTextbox.value = this._sSavedQuery;
}
else {
this._oTextbox.value = this._sSavedQuery + this._sCurQuery;
}
}
else {
this._oTextbox.value = this._sCurQuery;
}
this._oCurItem = null;
return;
}
if (nNewItemIndex == -2) {
// Close container
this._clearList();
return;
}
var oNewItem = this._aListItems[nNewItemIndex];
// Scroll the container if necessary
if((YAHOO.util.Dom.getStyle(this._oContainer._oContent,"overflow") == "auto") &&
(nNewItemIndex > -1) && (nNewItemIndex < this._nDisplayedItems)) {
// User is keying down
if(nKeyCode == 40) {
// Bottom of selected item is below scroll area...
if((oNewItem.offsetTop+oNewItem.offsetHeight) > (this._oContainer._oContent.scrollTop + this._oContainer._oContent.offsetHeight)) {
// Set bottom of scroll area to bottom of selected item
this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - this._oContainer._oContent.offsetHeight;
}
// Bottom of selected item is above scroll area...
else if((oNewItem.offsetTop+oNewItem.offsetHeight) < this._oContainer._oContent.scrollTop) {
// Set top of selected item to top of scroll area
this._oContainer._oContent.scrollTop = oNewItem.offsetTop;
}
}
// User is keying up
else {
// Top of selected item is above scroll area
if(oNewItem.offsetTop < this._oContainer._oContent.scrollTop) {
// Set top of scroll area to top of selected item
this._oContainer._oContent.scrollTop = oNewItem.offsetTop;
}
// Top of selected item is below scroll area
else if(oNewItem.offsetTop > (this._oContainer._oContent.scrollTop + this._oContainer._oContent.offsetHeight)) {
// Set bottom of selected item to bottom of scroll area
this._oContainer._oContent.scrollTop = (oNewItem.offsetTop+oNewItem.offsetHeight) - this._oContainer._oContent.offsetHeight;
}
}
}
this._toggleHighlight(oNewItem, "to");
this.itemArrowToEvent.fire(this, oNewItem);
if(this.typeAhead) {
this._updateValue(oNewItem);
}
}
};
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/**
* Class providing encapsulation of a data source.
*
* @constructor
*
*/
YAHOO.widget.DataSource = function() {
/* abstract class */
};
/***************************************************************************
* Public constants
***************************************************************************/
/**
* Error message for null data responses.
*
* @type constant
* @final
*/
YAHOO.widget.DataSource.prototype.ERROR_DATANULL = "Response data was null";
/**
* Error message for data responses with parsing errors.
*
* @type constant
* @final
*/
YAHOO.widget.DataSource.prototype.ERROR_DATAPARSE = "Response data could not be parsed";
/***************************************************************************
* Public member variables
***************************************************************************/
/**
* Max size of the local cache. Set to 0 to turn off caching. Caching is
* useful to reduce the number of server connections. Recommended only for data
* sources that return comprehensive results for queries or when stale data is
* not an issue. Default: 15.
*
* @type number
*/
YAHOO.widget.DataSource.prototype.maxCacheEntries = 15;
/**
* Use this to equate cache matching with the type of matching done by your live
* data source. If caching is on and queryMatchContains is true, the cache
* returns results that "contain" the query string. By default,
* queryMatchContains is set to false, meaning the cache only returns results
* that "start with" the query string. Default: false.
*
* @type boolean
*/
YAHOO.widget.DataSource.prototype.queryMatchContains = false;
/**
* Data source query subset matching. If caching is on and queryMatchSubset is
* true, substrings of queries will return matching cached results. For
* instance, if the first query is for "abc" susequent queries that start with
* "abc", like "abcd", will be queried against the cache, and not the live data
* source. Recommended only for data sources that return comprehensive results
* for queries with very few characters. Default: false.
*
* @type boolean
*/
YAHOO.widget.DataSource.prototype.queryMatchSubset = false;
/**
* Data source query case-sensitivity matching. If caching is on and
* queryMatchCase is true, queries will only return results for case-sensitive
* matches. Default: false.
*
* @type boolean
*/
YAHOO.widget.DataSource.prototype.queryMatchCase = false;
/***************************************************************************
* Public methods
***************************************************************************/
/**
* Public accessor to the unique name of the data source instance.
*
* @return {string} Unique name of the data source instance
*/
YAHOO.widget.DataSource.prototype.getName = function() {
return this._sName;
};
/**
* Public accessor to the unique name of the data source instance.
*
* @return {string} Unique name of the data source instance
*/
YAHOO.widget.DataSource.prototype.toString = function() {
return "DataSource " + this._sName;
};
/**
* Retrieves query results, first checking the local cache, then making the
* query request to the live data source as defined by the function doQuery.
*
* @param {object} oCallbackFn Callback function defined by oParent object to
* which to return results
* @param {string} sQuery Query string
* @param {object} oParent The object instance that has requested data
*/
YAHOO.widget.DataSource.prototype.getResults = function(oCallbackFn, sQuery, oParent) {
// First look in cache
var aResults = this._doQueryCache(oCallbackFn,sQuery,oParent);
// Not in cache, so get results from server
if(aResults.length === 0) {
this.queryEvent.fire(this, oParent, sQuery);
this.doQuery(oCallbackFn, sQuery, oParent);
}
};
/**
* Abstract method implemented by subclasses to make a query to the live data
* source. Must call the callback function with the response returned from the
* query. Populates cache (if enabled).
*
* @param {object} oCallbackFn Callback function implemented by oParent to
* which to return results
* @param {string} sQuery Query string
* @param {object} oParent The object instance that has requested data
*/
YAHOO.widget.DataSource.prototype.doQuery = function(oCallbackFn, sQuery, oParent) {
/* override this */
};
/**
* Flushes cache.
*/
YAHOO.widget.DataSource.prototype.flushCache = function() {
if(this._aCache) {
this._aCache = [];
}
if(this._aCacheHelper) {
this._aCacheHelper = [];
}
this.cacheFlushEvent.fire(this);
};
/***************************************************************************
* Events
***************************************************************************/
/**
* Fired when a query is made to the live data source. Subscribers receive the
* following array:<br>
* - args[0] The data source instance
* - args[1] The requesting object
* - args[2] The query string
*/
YAHOO.widget.DataSource.prototype.queryEvent = null;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?