📄 controls.js
字号:
}, mark_next: function() { if(this.index < this.entry_count-1) this.index++ else this.index = 0; }, get_entry: function(index) { return this.update.firstChild.childNodes[index]; }, get_current_entry: function() { return this.get_entry(this.index); }, select_entry: function() { this.active = false; value = Element.collectTextNodesIgnoreClass(this.get_current_entry(), 'informal').unescapeHTML(); this.updateElement(value); this.element.focus(); }, updateElement: function(value) { var last_token_pos = this.findLastToken(); if (last_token_pos != -1) { var new_value = this.element.value.substr(0, last_token_pos + 1); var whitespace = this.element.value.substr(last_token_pos + 1).match(/^\s+/); if (whitespace) new_value += whitespace[0]; this.element.value = new_value + value; } else { this.element.value = value; } }, updateChoices: function(choices) { if(!this.changed && this.has_focus) { this.update.innerHTML = choices; Element.cleanWhitespace(this.update); Element.cleanWhitespace(this.update.firstChild); if(this.update.firstChild && this.update.firstChild.childNodes) { this.entry_count = this.update.firstChild.childNodes.length; for (var i = 0; i < this.entry_count; i++) { entry = this.get_entry(i); entry.autocompleteIndex = i; this.addObservers(entry); } } else { this.entry_count = 0; } this.stopIndicator(); this.index = 0; this.render(); } }, addObservers: function(element) { Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); Event.observe(element, "click", this.onClick.bindAsEventListener(this)); }, onObserverEvent: function() { this.changed = false; if(this.getEntry().length>=this.options.min_chars) { this.startIndicator(); this.getUpdatedChoices(); } else { this.active = false; this.hide(); } }, getEntry: function() { var token_pos = this.findLastToken(); if (token_pos != -1) var ret = this.element.value.substr(token_pos + 1).replace(/^\s+/,'').replace(/\s+$/,''); else var ret = this.element.value; return /\n/.test(ret) ? '' : ret; }, findLastToken: function() { var last_token_pos = -1; for (var i=0; i<this.options.tokens.length; i++) { var this_token_pos = this.element.value.lastIndexOf(this.options.tokens[i]); if (this_token_pos > last_token_pos) last_token_pos = this_token_pos; } return last_token_pos; }}Ajax.Autocompleter = Class.create();Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), { initialize: function(element, update, url, options) { this.base_initialize(element, update, options); this.options.asynchronous = true; this.options.onComplete = this.onComplete.bind(this) this.options.method = 'post'; this.options.defaultParams = this.options.parameters || null; this.url = url; }, getUpdatedChoices: function() { entry = encodeURIComponent(this.element.name) + '=' + encodeURIComponent(this.getEntry()); this.options.parameters = this.options.callback ? this.options.callback(this.element, entry) : entry; if(this.options.defaultParams) this.options.parameters += '&' + this.options.defaultParams; new Ajax.Request(this.url, this.options); }, onComplete: function(request) { this.updateChoices(request.responseText); }});// The local array autocompleter. Used when you'd prefer to// inject an array of autocompletion options into the page, rather// than sending out Ajax queries, which can be quite slow sometimes.//// The constructor takes four parameters. The first two are, as usual,// the id of the monitored textbox, and id of the autocompletion menu.// The third is the array you want to autocomplete from, and the fourth// is the options block.//// Extra local autocompletion options:// - choices - How many autocompletion choices to offer//// - partial_search - If false, the autocompleter will match entered// text only at the beginning of strings in the // autocomplete array. Defaults to true, which will// match text at the beginning of any *word* in the// strings in the autocomplete array. If you want to// search anywhere in the string, additionally set// the option full_search to true (default: off).//// - full_search - Search anywhere in autocomplete array strings.//// - partial_chars - How many characters to enter before triggering// a partial match (unlike min_chars, which defines// how many characters are required to do any match// at all). Defaults to 2.//// - ignore_case - Whether to ignore case when autocompleting.// Defaults to true.//// It's possible to pass in a custom function as the 'selector' // option, if you prefer to write your own autocompletion logic.// In that case, the other options above will not apply unless// you support them.Autocompleter.Local = Class.create();Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), { initialize: function(element, update, array, options) { this.base_initialize(element, update, options); this.options.array = array; }, getUpdatedChoices: function() { this.updateChoices(this.options.selector(this)); }, setOptions: function(options) { this.options = Object.extend({ choices: 10, partial_search: true, partial_chars: 2, ignore_case: true, full_search: false, selector: function(instance) { var ret = new Array(); // Beginning matches var partial = new Array(); // Inside matches var entry = instance.getEntry(); var count = 0; for (var i = 0; i < instance.options.array.length && ret.length < instance.options.choices ; i++) { var elem = instance.options.array[i]; var found_pos = instance.options.ignore_case ? elem.toLowerCase().indexOf(entry.toLowerCase()) : elem.indexOf(entry); while (found_pos != -1) { if (found_pos == 0 && elem.length != entry.length) { ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" + elem.substr(entry.length) + "</li>"); break; } else if (entry.length >= instance.options.partial_chars && instance.options.partial_search && found_pos != -1) { if (instance.options.full_search || /\s/.test(elem.substr(found_pos-1,1))) { partial.push("<li>" + elem.substr(0, found_pos) + "<strong>" + elem.substr(found_pos, entry.length) + "</strong>" + elem.substr( found_pos + entry.length) + "</li>"); break; } } found_pos = instance.options.ignore_case ? elem.toLowerCase().indexOf(entry.toLowerCase(), found_pos + 1) : elem.indexOf(entry, found_pos + 1); } } if (partial.length) ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)) return "<ul>" + ret.join('') + "</ul>"; } }, options || {}); }});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -