autocomplete.js

来自「this the oscommerce 3.0 aplha 4」· JavaScript 代码 · 共 242 行

JS
242
字号
/*  $Id: $  osCommerce, Open Source E-Commerce Solutions  http://www.oscommerce.com  Copyright (c) 2005 osCommerce  This program is free software; you can redistribute it and/or modify  it under the terms of the GNU General Public License v2 (1991)  as published by the Free Software Foundation.*/var returnUsed = false;function autoComplete(autoCompleteField, divBlock) {  var my = this;  this.autoCompleteField = autoCompleteField;  this.autoCompleteListing = new Array();  this.autoCompleteDivBlock = document.getElementById(divBlock);  this.inputText = null;  this.selected = -1;  var KEY_TAB = 9;  var KEY_RETURN = 13;  var KEY_ESC = 27;  var KEY_UP = 38;  var KEY_DOWN = 40;  autoCompleteField.setAttribute("autocomplete", "off");  autoCompleteField.onkeydown = function(evt) {    var keyPressed = getKeyCode(evt);    switch (keyPressed) {      case KEY_TAB:      case KEY_RETURN:        if (isDivVisible(my.autoCompleteDivBlock) && (my.selected > -1)) {          my.useSelection();          if (keyPressed == KEY_RETURN) {            returnUsed = true;          }        }        break;      case KEY_ESC:        my.hideDiv();        break;      case KEY_UP:        if (my.selected > 0) {          my.selected--;          my.changeHighlight();        }        break;      case KEY_DOWN:        if (my.selected < (my.autoCompleteListing.length - 1)) {          my.selected++;          my.changeHighlight();        }        break;    }  };  autoCompleteField.onkeyup = function(evt) {    var keyPressed = getKeyCode(evt);    switch (keyPressed) {      case KEY_TAB:      case KEY_RETURN:      case KEY_ESC:      case KEY_UP:      case KEY_DOWN:        break;      default:        if ( (this.value != my.inputText) && (this.value.length > 0) ) {          my.inputText = this.value;          my.getListing();        } else {          my.hideDiv();        }    }  };  autoCompleteField.onblur = function() {    if (isDivVisible(my.autoCompleteDivBlock)) {      setTimeout("hideDiv(document.getElementById('" + my.autoCompleteDivBlock.id + "'))", 500);    }  };  this.useSelection = function() {    if (this.selected > -1) {      this.autoCompleteField.value = this.autoCompleteListing[this.selected];      my.hideDiv();	    setTimeout("document.getElementById('" + this.autoCompleteField.id + "').focus()", 0);    }  };  this.changeHighlight = function() {    var list = this.autoCompleteDivBlock.getElementsByTagName('LI');    for (i in list) {      var entry = list[i];      if (this.selected == i) {        entry.className = "selected";      } else {        entry.className = "";      }    }  };  this.positionDiv = function() {    var tmpElement = this.autoCompleteField;    var x = 0;    var y = tmpElement.offsetHeight;    while (tmpElement.offsetParent && (tmpElement.tagName.toUpperCase() != 'BODY')) {      x += tmpElement.offsetLeft;      y += tmpElement.offsetTop;      tmpElement = tmpElement.offsetParent;    }    x += tmpElement.offsetLeft;    y += tmpElement.offsetTop;    this.autoCompleteDivBlock.style.left = x + 'px';    this.autoCompleteDivBlock.style.top = y + 'px';    this.autoCompleteDivBlock.style.minWidth = this.autoCompleteField.offsetWidth + "px";  };  this.createDiv = function() {    this.autoCompleteDivBlock.innerHTML = "<ul></ul>";    var ul = document.createElement('ul');    for (i in this.autoCompleteListing) {      var word = this.autoCompleteListing[i];      var li = document.createElement('li');      var a = document.createElement('a');      a.href = "javascript:return false;";      a.innerHTML = word;      li.appendChild(a);      if (my.selected == i) {        li.className = "selected";      }      ul.appendChild(li);    }    this.autoCompleteDivBlock.replaceChild(ul, this.autoCompleteDivBlock.childNodes[0]);    ul.onmouseover = function(evt) {      var target = getEventSource(evt);      while (target.parentNode && (target.tagName.toUpperCase() != 'LI')) {        target = target.parentNode;      }      var list = my.autoCompleteDivBlock.getElementsByTagName('LI');      for (i in list) {        var entry = list[i];        if (entry == target) {          my.selected = i;          break;        }      }      my.changeHighlight();    };    ul.onclick = function(evt) {      my.useSelection();      cancelEvent(evt);      return false;    };    showDiv(my.autoCompleteDivBlock);  };  this.hideDiv = function() {    hideDiv(my.autoCompleteDivBlock);    this.selected = -1;  }  this.getListing = function() {    if (document.getElementById(my.autoCompleteField.id + "_icon")) {      document.getElementById(my.autoCompleteField.id + "_icon").src = "images/progress.gif";    }    loadXMLDoc("rpc.php?action=getDirectoryPath&dir=" + urlEncode(my.inputText), this.handleHttpResponse_getListing)  };  this.handleHttpResponse_getListing = function() {    if (http.readyState == 4) {      if (http.status == 200) {        my.autoCompleteListing = new Array();        var response = http.responseText.split(/\[{2}([^|]*?)(?:\|([^|]*?)){0,1}\]{2}/);        if (response[1] == '0') {          my.autoCompleteListing = response[2].split(';');          my.createDiv();          my.positionDiv();          showDiv(my.autoCompleteDivBlock);          if (document.getElementById(my.autoCompleteField.id + "_icon")) {            document.getElementById(my.autoCompleteField.id + "_icon").src = "images/progress_pending.gif";          }        } else if (response[1] == '1') {          if (document.getElementById(my.autoCompleteField.id + "_icon")) {            document.getElementById(my.autoCompleteField.id + "_icon").src = "images/progress_pending.gif";          }          if (isDivVisible(my.autoCompleteDivBlock)) {            my.hideDiv();          }        } else if (response[1] == '-1') {          if (document.getElementById(my.autoCompleteField.id + "_icon")) {            document.getElementById(my.autoCompleteField.id + "_icon").src = "images/failed.gif";          }        }      }    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?