autocomplete.html revision 98ad4b8502571e9914f72ff72adfba58864dfa07
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner Note: if you're viewing source to learn how to use AutoComplete, you should
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner be aware that this is a much more complex example than you'd ever be likely
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder to implement in a real-world use case, since this manual test page tries to
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner cover the majority of AutoComplete's available functionality.
d23ecf32e56cce69bc42eb5c96dddf7909c623abjelmd Please don't let this scare you off!
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner <!-- <link rel="stylesheet" href="/build/cssreset/reset-min.css">
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder <link rel="stylesheet" href="/build/cssbase/base-min.css"> -->
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner <link rel="stylesheet" href="/assets/test-console.css">
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner <!-- for design iteration -->
7d0ee72ee91ec305408688b969c43f07b9667c80Christian Maeder <!-- <link rel="stylesheet" href="/assets/autocomplete-list-core.css">
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder <link rel="stylesheet" href="/assets/skins/sam/autocomplete-list-skin.css"> -->
d23ecf32e56cce69bc42eb5c96dddf7909c623abjelmd background: #fff;
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder font-family: 'Lucida Grande', 'Lucida Sans Unicode', sans-serif;
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder font-size: 13px;
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner body { width: 60%; }
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner border: 1px solid #afafaf;
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner margin-top: 1em;
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner fieldset label { margin-right: 0.5em; }
f8597aabc9db75dcf504e3151faf220a165c90d1Eugen Kuksa margin: 5px 0 10px;
f8597aabc9db75dcf504e3151faf220a165c90d1Eugen Kuksa width: 300px;
ab4256496e72886018b78571057331f373da6883Eugen Kuksa #log { margin-top: 4em; }
f8597aabc9db75dcf504e3151faf220a165c90d1Eugen Kuksa height: 32px;
a389e88e0acb83d8489bdc5e55bc5522b152bbecEugen Kuksa overflow: hidden;
a389e88e0acb83d8489bdc5e55bc5522b152bbecEugen Kuksa padding: 2px;
f8597aabc9db75dcf504e3151faf220a165c90d1Eugen Kuksa text-decoration: none;
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner .flickr img {
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner float: left;
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner height: 32px;
60e6795dd310e10194e12bb660575aadf941328bEugen Kuksa margin: 0 4px;
60e6795dd310e10194e12bb660575aadf941328bEugen Kuksa width: 32px;
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner clear: both;
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner margin: 4px 0;
a84a8d508a0778b13a4d097a6dd34b95feae78acJens Elkner padding: 2px 0;
60e6795dd310e10194e12bb660575aadf941328bEugen Kuksa .twitter .hd {
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder .twitter .bd,
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder .twitter .ft {
c0c2380bced8159ff0297ece14eba948bd236471Christian Maeder margin-left: 52px;
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder .twitter .ft {
404166b9366552e9ec5abb87a37c76ec8a815fb7Klaus Luettich color: #cfcfcf;
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder font-size: 11px;
ce5b44277ea06257548ff625e928cb1290c6d297cmaeder .twitter .photo {
bab2d88d650448628730ed3b65c9f99c52500e8cChristian Maeder height: 48px;
fa8878c6145f652f615a04a5e9c15a1d1327bc92cmaeder margin-top: 3px;
ce5b44277ea06257548ff625e928cb1290c6d297cmaeder width: 48px;
5191fa24c532d1f67e7a642e9aece65efb8a0975Christian Maeder .twitter .user { margin-right: 6px; }
3dde4051c307b609159a097f08a05108fdd036efJonathan von Schroeder <label for="ac-input">Type things here! Try the name of a US state.</label><br>
8b767d09a78927b111f5596fdff9ca7d2c1a439fChristian Maeder <option value="local" selected>Local (Array)</option>
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder <option value="function">Local (Function)</option>
4b4a0b61b72cf8478a5d4d5002bca9f699401363Christian Maeder <option value="flickr">Remote (Flickr)</option>
4b4a0b61b72cf8478a5d4d5002bca9f699401363Christian Maeder <option value="search">Remote (Y! Search)</option>
308834907a120fd8771e18292ed2ca9cd767c12dChristian Maeder <option value="twitter">Remote (Twitter Search)</option>
f5c0884429b01e74c6e658ded921fb2e16dfb478Christian Maeder <input type="radio" class="highlighter" name="highlighter" id="highlighter_none" value="none" checked="checked">
dc679edd4ca027663212afdf00926ae2ce19b555Christian Maeder filter: 'raw',
a2d6702f18737cc5fff8e8631c08f221f8375c4bChristian Maeder 'autocomplete': 'debug',
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder 'autocomplete-base': 'debug',
fdb2d618144159395f7bf8ce3327b3c112a17dd3Till Mossakowski 'autocomplete-list': 'debug'
4017ebc0f692820736d796af3110c3b3018c108aChristian Maeder useBrowserConsole: false,
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder // For design iteration.
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder // 'skin-sam-autocomplete',
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder // 'skin-sam-autocomplete-list'
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder 'autocomplete',
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder 'autocomplete-filters',
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder 'autocomplete-highlighters',
d946c1bfdd7d58aa7c023efe864d5999eb44a61bChristian Maeder 'console-filters',
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder 'event-delegate',
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maederfunction (Y) {
ca074a78b8dcccbb8c419586787882f98d0c6163Christian MaederY.one('#ac-form').reset();
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder// -- Console setup ------------------------------------------------------------
ca074a78b8dcccbb8c419586787882f98d0c6163Christian Maeder height: '400px',
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder}).plug(Y.Plugin.ConsoleFilters, {}).render('#log');
961087225d1d2b9534152a346d1a3755ed952fcdJens Elkner// -- AutoComplete setup -------------------------------------------------------
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maedervar autoComplete = new Y.AutoComplete({inputNode: '#ac-input'});
961087225d1d2b9534152a346d1a3755ed952fcdJens Elkner// For easier debugging.
e6d5dbbc3308f05197868806e0b860f4f53875f1Christian MaederY.ac = autoComplete;
e4f4d096e5e6d60dd91c746d0e833d0ac7a29c50Christian Maeder// -- UI stuff -----------------------------------------------------------------
961087225d1d2b9534152a346d1a3755ed952fcdJens Elknervar filtersDiv = Y.one('#filters>div'),
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder highlightersDiv = Y.one('#highlighters>div');
f1541d4a151dbd08002dbd14e7eb1d5dde253689Christian Maeder// Create filter checkboxes.
961087225d1d2b9534152a346d1a3755ed952fcdJens ElknerY.Object.each(Y.AutoCompleteFilters, function (filter, name) {
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder if (name.indexOf('_') === 0) {
81f49ee02aaa3bc870401f8883bf52742eb3ea7aJonathan von Schroeder '<input type="checkbox" class="filter" id="filter_' + name + '" value="' + name + '"' + (name === 'phraseMatch' ? ' checked="checked"' : '') + '>' +
93f5b72fdb9ee734caa750b43dd79bbb590dcd73Christian Maeder '<label for="filter_' + name + '">' + name + '</label>'
06dd4e7c29f33f6122a910719e3bd9062256e397Andy Gimblett// Create highlighter radio buttons.
254df6f22d01eacf7c57b85729e0445747b630d9Christian MaederY.Object.each(Y.AutoCompleteHighlighters, function (highlighter, name) {
4ba08bfca0cc8d9da65397b8dfd2654fdb4c0e62Christian Maeder if (name.indexOf('_') === 0) {
456238178f89e5a3de2988ee6c8af924297d52d9Christian Maeder '<input type="radio" class="highlighter" name="highlighter" id="highlighter_' + name + '" value="' + name + '"' + (name === 'phraseMatch' ? ' checked="checked"' : '') + '>' +
819e29dba060687cf391e444e0f6ff88c1908cc3Christian Maeder '<label for="highlighter_' + name + '">' + name + '</label>'
c208973c890b8f993297720fd0247bc7481d4304Christian Maeder// Handle clicks on datasource radio buttons.
0d0278c34a374b29c2d6c58b39b8b56e283d48e8Christian MaederY.one('#source').on('change', function (e) {
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maeder switch (e.target.get('value')) {
63f0e65a37b95621334db9ee4ba0cd9d826f5c0fChristian Maeder case 'local':
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder case 'function':
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder useFunction();
3554301a34639efb6c9961a8571775d0061284c9Christian Maeder case 'flickr':
aded505f9b42cc38975559c2a5d175ae95de436bChristian Maeder case 'search':
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder case 'twitter':
383aa66e5142365fe9b1f88b18c1da5b27cc8c04Christian Maeder useTwitter();
54ea981a0503c396c2923a1c06421c6235baf27fChristian Maeder// Handle clicks on filters.
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian MaederY.delegate('click', setFilters, '#filters', 'input[type="checkbox"]');
697e63e30aa3c309a1ef1f9357745111f8dfc5a9Christian Maeder// Handle clicks on highlighters.
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian MaederY.delegate('click', setHighlighter, '#highlighters', 'input[type="radio"]');
f9e0b18852b238ddb649d341194e05d7200d1bbeChristian Maeder// Handle delimiter changes.
819e29dba060687cf391e444e0f6ff88c1908cc3Christian MaederY.on('change', setDelimiter, '#delimiter');
254df6f22d01eacf7c57b85729e0445747b630d9Christian MaedersetHighlighter();
254df6f22d01eacf7c57b85729e0445747b630d9Christian MaederautoComplete.get('inputNode').focus();
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder// -- UI functions -------------------------------------------------------------
254df6f22d01eacf7c57b85729e0445747b630d9Christian Maederfunction flickrFormatter(query, results) {
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder return Y.Array.map(results, function (result) {
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder var imgUrl = Y.Lang.sub('http://farm{farm}.static.flickr.com/{server}/{id}_{secret}_s.jpg', result.raw);
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder '<img src="' + imgUrl + '" alt="thumbnail">' +
ac34194a668399bb8ef238da77c3a09e93fb253bChristian Maeder '<span class="title">' + result.highlighted + '</span>' +
c208973c890b8f993297720fd0247bc7481d4304Christian Maederfunction twitterFormatter(query, results) {
c208973c890b8f993297720fd0247bc7481d4304Christian Maeder return Y.Array.map(results, function (result) {
0d0278c34a374b29c2d6c58b39b8b56e283d48e8Christian Maeder '<div class="twitter" data-tweet-id="{id}">' +
1842453990fed8a1bd7a5ac792d7982c1d2bfcd5Christian Maeder '<img src="{imgurl}" class="photo" alt="Profile photo for {user}">' +
7a3fe82695aa32657693e05712f84d7f81672f2eJonathan von Schroederfunction setDelimiter(e) {
05a206508bc898f87fe6ab6e069814df3c29d303Dominik Luecke autoComplete.set('queryDelimiter', e.target.get('value'));
81f49ee02aaa3bc870401f8883bf52742eb3ea7aJonathan von Schroederfunction setFilters() {
81f49ee02aaa3bc870401f8883bf52742eb3ea7aJonathan von Schroeder var filters = [],
81f49ee02aaa3bc870401f8883bf52742eb3ea7aJonathan von Schroeder filterNames = [];
d54cd08a4cfa26256c38d8ed12c343adbfe1a0e3Christian Maeder Y.all('#filters input.filter').each(function (input) {
d54cd08a4cfa26256c38d8ed12c343adbfe1a0e3Christian Maeder if (input.get('checked')) {
0b349288edfa50fdf38fda1a14e1562d03f92574Christian Maeder Y.Array.each(filterNames, function (name) {
1b3a2f98d1cd01fc9e0591f69507e20526727559Dominik Luecke autoComplete.set('resultFilters', filters);
f8e1a1eca871a26a535a4ee7d51902ba94b1db1eChristian Maederfunction setHighlighter() {
ea3bff3e547a1ac714d4db39c5efef95e02b2e7dChristian Maeder Y.all('#highlighters input.highlighter').some(function (input) {
abf2487c3aece95c371ea89ac64319370dcb6483Klaus Luettich if (input.get('checked')) {
23b4e542dca35852f58d1fb3f7d9078c1de5ab06Christian Maeder name = input.get('value');
23b4e542dca35852f58d1fb3f7d9078c1de5ab06Christian Maeder autoComplete.set('resultHighlighter', name === 'none' ? null : name);
878a5ecd6acf973907e25e5be6e4a792ea19a05eEwaryst Schulz// -- DataSource functions -----------------------------------------------------
c2e192ace9ef7cfb0e59563f1b24477b2b65cff3Dominik Dietrichfunction useNone() {
6b75c206b317eb30a08d88a8f27e0295ffeb1546Christian Maeder Y.log('using no source', 'info', 'autocomplete');
bff4b3f816be4c1e1d8ded76f1d5af786839e1a9Christian Maeder maxResults : 0,
bff4b3f816be4c1e1d8ded76f1d5af786839e1a9Christian Maeder resultFormatter : null,
3a9fce5398f4621558ca220c66c87cee59adc258Jonathan von Schroeder resultListLocator: null,
b5da047a9a875dec3f968b6c0df96af326f90fa9Alexis Tsogias resultTextLocator: null,
0a03acf9fa28e6ff00f4d7c9c6acbae64cf09c56Ewaryst Schulz source : null
80875f917d741946a39d0ec0b5721e46ba609823Till Mossakowskifunction useLocal() {
7834a982096d93301a4626f444dd9ea5f9fe17eaChristian Maeder Y.log('using local array source', 'info', 'autocomplete');
4b4a0b61b72cf8478a5d4d5002bca9f699401363Christian Maeder maxResults : 0,
d62661e54e2662d53b583ae48609f5037701078dcmaeder resultFormatter : null,
9f226cec9f978edaba67aee4c4e04e3d3b994b87Daniel Calegari resultListLocator: null,
7bb0a9e92bc7a6f868eaa0b9c3212c0af4f96b7fEugen Kuksa resultTextLocator: null,
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maederfunction useFunction() {
05a206508bc898f87fe6ab6e069814df3c29d303Dominik Luecke Y.log('using local function source', 'info', 'autocomplete');
5ad5dffe06818a13e1632b1119fbca7881085fc1Dominik Luecke maxResults : 0,
7a3fe82695aa32657693e05712f84d7f81672f2eJonathan von Schroeder resultFormatter : null,
7a3fe82695aa32657693e05712f84d7f81672f2eJonathan von Schroeder resultListLocator: null,
7a3fe82695aa32657693e05712f84d7f81672f2eJonathan von Schroeder resultTextLocator: null,
1535e1d8c82db5f7e2402261983c4c2ef39f4f39Mihai Codescu source : function (query) { return ExampleData.arrayStates; }
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maederfunction useFlickr() {
1c9a63e4f7c6879f51fe0f32154a9116f2c126dbChristian Maeder Y.log('using remote Flickr YQL source', 'info', 'autocomplete');
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder maxResults : 0,
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder resultFormatter : flickrFormatter,
fb328c4f646dd3dd78a9391c5cb58450a3dd0aa9Klaus Luettich resultListLocator: null,
81f49ee02aaa3bc870401f8883bf52742eb3ea7aJonathan von Schroeder resultTextLocator: 'title',
81f49ee02aaa3bc870401f8883bf52742eb3ea7aJonathan von Schroeder source : 'select * from flickr.photos.search where tags="{query}"'
81f49ee02aaa3bc870401f8883bf52742eb3ea7aJonathan von Schroederfunction useSearch() {
b5a6fff5181dad64c4d31e8e4fbb82d4f79813d8Till Mossakowski Y.log('using remote Y! Search YQL source', 'info', 'autocomplete');
3b06e23643a9f65390cb8c1caabe83fa7e87a708Till Mossakowski maxResults : 0,
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder resultFormatter : null,
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder resultListLocator: null,
61fa0ac06ede811c7aad54ec4c4202346727368eChristian Maeder resultTextLocator: null,
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder source : 'select * from search.suggest where query="{query}"',
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder yqlEnv : 'http://pieisgood.org/yql/tables.env'
8b0f493ae42bad8b94918cc0957f1af57096cda4Felix Reckersfunction useTwitter() {
d23b0cc79c0d204e6ec758dff8d0ba71c9f693f7Christian Maeder Y.log('using remote Twitter JSONP source', 'info', 'autocomplete');
abf2487c3aece95c371ea89ac64319370dcb6483Klaus Luettich maxResults : 5,
e39a1626bee36d6ad13a2c0014a80ef179a65bcbChristian Maeder resultFormatter : twitterFormatter,
7868299829c1318b888152243ec2cea4f598b568Christian Maeder resultListLocator: 'results',
e39a1626bee36d6ad13a2c0014a80ef179a65bcbChristian Maeder resultTextLocator: 'text',
f8e1a1eca871a26a535a4ee7d51902ba94b1db1eChristian Maeder source : 'http://search.twitter.com/search.json?q={query}&callback={callback}&rpp={maxResults}&result_type=recent'
ea06324815fff0b73f7524f11af3672c2389f7ecChristian Maederfunction useXHR() {
ea06324815fff0b73f7524f11af3672c2389f7ecChristian Maeder Y.log('using XHR source', 'info', 'autocomplete');
79834070d6d3c63a098e570b12fa3405c607dc70Kristina Sojakova maxResults : 5,
79834070d6d3c63a098e570b12fa3405c607dc70Kristina Sojakova resultFormatter : null,
23b4e542dca35852f58d1fb3f7d9078c1de5ab06Christian Maeder resultListLocator: null,
23b4e542dca35852f58d1fb3f7d9078c1de5ab06Christian Maeder resultTextLocator: null,
23b4e542dca35852f58d1fb3f7d9078c1de5ab06Christian Maeder source : '/assets/xhr-data.json?query={query}'