Skip to main content

Search and Top Navigation

#8784 closed bug (wontfix)

Opened November 07, 2012 09:22AM UTC

Closed November 07, 2012 04:26PM UTC

trigger search from select within jquery ui autocomplete not working

Reported by: bugtester Owned by: bugtester
Priority: minor Milestone: 1.10.0
Component: ui.autocomplete Version: 1.9.1
Keywords: Cc:
Blocked by: Blocking:
Description

Hi,

I want (in this simplify case) search a text and if I select it, its should search the search text again.

I found this: http://api.jqueryui.com/autocomplete/#method-search

But thats working only outside of autocomplete: http://jsfiddle.net/uSbLC/5/

Is it possible in select method of 1.9.1?

Steps:

  • go to text field and insert "a"
  • now you get a popup with 2 results
  • select one result, now its should appear the popup again, but nothing happen here

BUT look into firebug. After click on item you get a new response in console.

If I click on button, the popup show up. What is here my mistake? I need it in select handler. After select a entry, a new search should immediately start and show a popup.

Because its working in older versions of jquery-ui for me two year long with every update fine, I report this as an urgend bug for me.

Attachments (0)
Change History (5)

Changed November 07, 2012 01:37PM UTC by scottgonzalez comment:1

owner: → bugtester
status: newpending

I don't really understand what you're trying to accomplish. I'm inclined to close as wontfix because I can't imagine any use cases for this.

What's happening is selecting an item always closes the menu. Closing the menu tells the autocomplete to ignore any pending searches. This includes the search that you're manually triggering immediately before the menu closes. It's also worth noting that you're running a duplicative search, since you're triggering the search before the value updates.

Changed November 07, 2012 02:26PM UTC by bugtester comment:2

_comment0: First, this working from beginning since I use jQueryUI.. so long almost 2 years, I think. My last version was 1.8.20 before I updated to 1.9.x. Hera a jsfiddle with 1.8.20: http://jsfiddle.net/Khj79/ Here its working, but have mess with the popup. In my versions I dont had problems with popup. \ \ Why I need it: I have a search for names. The result of this search are 10 names and a last (11.) entry for "search the next results". With click on this last entry I get the next 10 results and so on. In last popup I have "start from beginning". \ \ Example popup1: \ \ * Name 1 \ * Name 2 \ * Name 3 \ ... \ * search the next results \ \ now coming popup2: \ \ * Name 11 \ * Name 12 \ * Name 13 \ ... \ * search the next results \ \ now coming popup3: \ \ * Name 21 \ * Name 22 \ * Name 23 \ ... \ * search the next results \ \ \ Here my simplify code for it thats working now 2 years. In $('#search').data('p') I save the "popup counter" and send it with ajax and get the next number with ajax-response. \ \ \ {{{ \ $('#search').autocomplete( \ { \ source: function(request, response) \ { \ if ($('#search').data('p')=='undefined') \ { \ $('#search').data('p', 0); \ } \ $.postJSON('ajax/search', \ { \ t: request.term, \ p: $('#search').data('p') \ }, function(data) \ { \ if (data && data.s==$('#search').val()) \ { \ $('#search').data('p', data.p); \ response($.map(data.r, function(item) \ { \ // more code.... \ })); \ } \ }) \ }, \ open: function(event, ui) \ { \ // Delete stupid help text \ $(this).autocomplete('widget').removeClass('ui-widget-content').addClass('searchbar-popup').position( \ { \ of: $('#search'), \ my: 'left top', \ at: 'left bottom', \ offset:'0 3' \ }); \ }, \ focus: function() \ { \ return false; \ }, \ select: function(event, ui) \ { \ if (ui.item.url=='') \ { \ $(this).autocomplete('search', $(this).val()); \ } \ else \ { \ $('#search').data('p', 'x'); \ window.location.href = ui.item.url; \ } \ return false; \ }, \ minLength: 1, \ html: true \ }).keydown(function() \ { \ if ($('#search').data('p')!='x') \ { \ $('#search').data('p', 0); \ } \ }).keyup(function(event) \ { \ if (event.keyCode=='13' && $('#ui-active-menuitem').length==0 && $('#search').data('p')!='x') \ { \ // more code.... \ } \ }).click(function() \ { \ $('#search').data('p', 0); \ $(this).autocomplete('search', $(this).val()); \ }); \ }}} \ \ \ The next example (without code) is to make a multi choice system: \ * Search a word \ * now you get all results for this word \ * click on the word and can now are the final step or there is a sub category with sub searches and you see new another results for your searching. \ \ Search "manager" \ Ajax-Result: chief manager, production manager, sales manager, .... \ click on "sales manager" .. go to sale manager site \ click on "product manager" .. he found that have children and open it (expand popup or exchange popup) \ click on sub request .. go to child entry from "product manager" \ \ there are more options for use autocomplete. for me the first with "page counter" is the main problem. \ I hope this is not again a 2 years old bug like my last bugreport that now is "fixed". :( \ \ I understand your explain, but why working this now so long. Is there a way to fix this for my self? What must be change in jquery-ui? I hope anybody can help here.1352298514623423
_comment1: First, this working from beginning since I use jQueryUI.. so long almost 2 years, I think. My last version was 1.8.20 before I updated to 1.9.x. Hera a jsfiddle with 1.8.20: http://jsfiddle.net/Khj79/ Here its working, but have mess with the popup. In my versions I dont had problems with popup. \ \ Why I need it: I have a search for names. The result of this search are 10 names and a last (11.) entry for "search the next results". With click on this '''last entry''' I get the next 10 results and so on. In last popup I have "start from beginning". All other entry close the popup (click on names). \ \ Example popup1: \ \ * Name 1 \ * Name 2 \ * Name 3 \ ... \ * search the next results \ \ now coming popup2: \ \ * Name 11 \ * Name 12 \ * Name 13 \ ... \ * search the next results \ \ now coming popup3: \ \ * Name 21 \ * Name 22 \ * Name 23 \ ... \ * search the next results \ \ \ Here my simplify code for it thats working now 2 years. In $('#search').data('p') I save the "popup counter" and send it with ajax and get the next number with ajax-response. \ \ \ {{{ \ $('#search').autocomplete( \ { \ source: function(request, response) \ { \ if ($('#search').data('p')=='undefined') \ { \ $('#search').data('p', 0); \ } \ $.postJSON('ajax/search', \ { \ t: request.term, \ p: $('#search').data('p') \ }, function(data) \ { \ if (data && data.s==$('#search').val()) \ { \ $('#search').data('p', data.p); \ response($.map(data.r, function(item) \ { \ // more code.... \ })); \ } \ }) \ }, \ open: function(event, ui) \ { \ // Delete stupid help text \ $(this).autocomplete('widget').removeClass('ui-widget-content').addClass('searchbar-popup').position( \ { \ of: $('#search'), \ my: 'left top', \ at: 'left bottom', \ offset:'0 3' \ }); \ }, \ focus: function() \ { \ return false; \ }, \ select: function(event, ui) \ { \ if (ui.item.url=='') \ { \ $(this).autocomplete('search', $(this).val()); \ } \ else \ { \ $('#search').data('p', 'x'); \ window.location.href = ui.item.url; \ } \ return false; \ }, \ minLength: 1, \ html: true \ }).keydown(function() \ { \ if ($('#search').data('p')!='x') \ { \ $('#search').data('p', 0); \ } \ }).keyup(function(event) \ { \ if (event.keyCode=='13' && $('#ui-active-menuitem').length==0 && $('#search').data('p')!='x') \ { \ // more code.... \ } \ }).click(function() \ { \ $('#search').data('p', 0); \ $(this).autocomplete('search', $(this).val()); \ }); \ }}} \ \ \ The next example (without code) is to make a multi choice system: \ * Search a word \ * now you get all results for this word \ * click on the word and can now are the final step or there is a sub category with sub searches and you see new another results for your searching. \ \ Search "manager" \ Ajax-Result: chief manager, production manager, sales manager, .... \ click on "sales manager" .. go to sale manager site \ click on "product manager" .. he found that have children and open it (expand popup or exchange popup) \ click on sub request .. go to child entry from "product manager" \ \ there are more options for use autocomplete. for me the first with "page counter" is the main problem. \ I hope this is not again a 2 years old bug like my last bugreport that now is "fixed". :( \ \ I understand your explain, but why working this now so long. Is there a way to fix this for my self? What must be change in jquery-ui? I hope anybody can help here.1352298658764394
_comment2: First, this working from beginning since I use jQueryUI.. so long almost 2 years, I think. My last version was 1.8.20 before I updated to 1.9.x. Hera a jsfiddle with 1.8.20: http://jsfiddle.net/Khj79/ Here its working, but have mess with the popup. In my versions I dont had problems with popup. \ \ Why I need it: I have a search for names. The result of this search are 10 names and a last (11.) entry for "search the next results". With click on this '''last entry''' I get the next 10 results and so on. In last popup I have "start from beginning". All other entry close the popup (click on names). \ \ Example popup1: \ \ * Name 1 \ * Name 2 \ * Name 3 \ ... \ * search the next results \ \ now coming popup2: \ \ * Name 11 \ * Name 12 \ * Name 13 \ ... \ * search the next results \ \ now coming popup3: \ \ * Name 21 \ * Name 22 \ * Name 23 \ ... \ * search the next results \ \ \ Here my simplify code for it thats working now 2 years. In $('#search').data('p') I save the "popup counter" and send it with ajax and get the next number with ajax-response. \ \ \ {{{ \ $('#search').autocomplete( \ { \ source: function(request, response) \ { \ if ($('#search').data('p')=='undefined') \ { \ $('#search').data('p', 0); \ } \ $.postJSON('ajax/search', \ { \ t: request.term, \ p: $('#search').data('p') \ }, function(data) \ { \ if (data && data.s==$('#search').val()) \ { \ $('#search').data('p', data.p); \ response($.map(data.r, function(item) \ { \ // more code.... \ })); \ } \ }) \ }, \ open: function(event, ui) \ { \ // Delete stupid help text \ $(this).autocomplete('widget').removeClass('ui-widget-content').addClass('searchbar-popup').position( \ { \ of: $('#search'), \ my: 'left top', \ at: 'left bottom', \ offset:'0 3' \ }); \ }, \ focus: function() \ { \ return false; \ }, \ select: function(event, ui) \ { \ if (ui.item.url=='') \ { \ $(this).autocomplete('search', $(this).val()); \ } \ else \ { \ $('#search').data('p', 'x'); \ window.location.href = ui.item.url; \ } \ return false; \ }, \ minLength: 1, \ html: true \ }).keydown(function() \ { \ if ($('#search').data('p')!='x') \ { \ $('#search').data('p', 0); \ } \ }).keyup(function(event) \ { \ if (event.keyCode=='13' && $('#ui-active-menuitem').length==0 && $('#search').data('p')!='x') \ { \ // more code.... \ } \ }).click(function() \ { \ $('#search').data('p', 0); \ $(this).autocomplete('search', $(this).val()); \ }); \ }}} \ \ \ The next example (without code) is to make a multi choice system: \ * Search a word \ * now you get all results for this word \ * click on the word and can now are the final step or there is a sub category with sub searches and you see new another results for your searching. \ \ Search "manager" \ Ajax-Result: chief manager, production manager, sales manager, .... \ click on "sales manager" .. go to sale manager site \ click on "product manager" .. he found that have children and open it (expand popup or exchange popup) \ click on sub request .. go to child entry from "product manager" \ \ there are more options for use autocomplete. for me the first with "page counter" is the main problem. I have a live example, but not for public view. I hope this is not again a 2 years old bug like my last bugreport that now is "fixed". :( \ \ I understand your explain, but why working this now so long. Is there a way to fix this for my self? What must be change in jquery-ui? I hope anybody can help here.1352298986511579
status: pendingnew

First, this working from beginning since I use jQueryUI.. so long almost 2 years, I think. My last version was 1.8.20 before I updated to 1.9.x. Hera a jsfiddle with 1.8.20: http://jsfiddle.net/Khj79/ Here its working, but have mess with the popup. In my versions I dont had problems with popup.

Why I need it: I have a search for names. The result of this search are 10 names and a last (11.) entry for "search the next results". With click on this last entry I get the next 10 results and so on. In last popup I have "start from beginning". All other entry close the popup (click on names).

Example popup1:

  • Name 1
  • Name 2
  • Name 3

...

  • search the next results

click on "search the next results" now coming popup2:

  • Name 11
  • Name 12
  • Name 13

...

  • search the next results

click again on "search the next results" now coming popup3:

  • Name 21
  • Name 22
  • Name 23

...

  • search the next results

Here my simplify code for it thats working now 2 years. In $('#search').data('p') I save the "popup counter" and send it with ajax and get the next number with ajax-response.

$('#search').autocomplete(
{
	source: function(request, response)
	{
	    if ($('#search').data('p')=='undefined')
	    {
	        $('#search').data('p', 0);
	    }
		$.postJSON('ajax/search',
		{
			t: request.term,
			p: $('#search').data('p')
		}, function(data)
		{
			if (data && data.s==$('#search').val())
			{
				$('#search').data('p', data.p);
				response($.map(data.r, function(item)
				{
				    // more code....
				}));
			}
		})
	},
	open: function(event, ui)
	{
		// Delete stupid help text
	    $(this).autocomplete('widget').removeClass('ui-widget-content').addClass('searchbar-popup').position(
		{
			of: $('#search'),
       		my: 'left top',
        	at: 'left bottom',
			offset:'0 3'
		});
	},
	focus: function()
	{
		return false;
	},
	select: function(event, ui)
	{
        if (ui.item.url=='')
        {
			$(this).autocomplete('search', $(this).val());
		}
		else
		{
		    $('#search').data('p', 'x');
			window.location.href = ui.item.url;
		}
		return false;
	},
	minLength: 1,
	html: true
}).keydown(function()
{
	if ($('#search').data('p')!='x')
	{
		$('#search').data('p', 0);
	}
}).keyup(function(event)
{
    if (event.keyCode=='13' && $('#ui-active-menuitem').length==0 && $('#search').data('p')!='x')
	{
	    // more code....
	}
}).click(function()
{
    $('#search').data('p', 0);
    $(this).autocomplete('search', $(this).val());
});

The next example (without code) is to make a multi choice system:

  • Search a word
  • now you get all results for this word
  • click on the word and can now are the final step or there is a sub category with sub searches and you see new another results for your searching.

Search "manager"

Ajax-Result: chief manager, production manager, sales manager, ....

click on "sales manager" .. go to sale manager site

click on "product manager" .. he found that have children and open it (expand popup or exchange popup)

click on sub request .. go to child entry from "product manager"

there are more options for use autocomplete. for me the first with "page counter" is the main problem. I have a live example, but not for public view. I hope this is not again a 2 years old bug like my last bugreport that now is "fixed". :(

I understand your explain, but why working this now so long. Is there a way to fix this for my self? What must be change in jquery-ui? I hope anybody can help here.

Changed November 07, 2012 03:01PM UTC by scottgonzalez comment:3

status: newpending

There were some pretty big changes to autocomplete between 1.8 and 1.9, specifically selection is now synchronous where before it was asynchronous. Is there a reason you can't just use a timeout inside the select? This is certainly an edge case.

Changed November 07, 2012 04:09PM UTC by bugtester comment:4

_comment0: Thanks for your fast answer. \ \ Replying to [comment:3 scott.gonzalez]: \ > Is there a reason you can't just use a timeout inside the select? \ \ I can add a timeout, that is not a problem: http://jsfiddle.net/uSbLC/10/ and its working fine. \ But I have no idea which value for duration is the "best". Is it right that settimeout only starts when the function is completed. So I can always set duration to "1" for start immediately?1352304590722958
status: pendingnew

Thanks for your fast answer.

Replying to [comment:3 scott.gonzalez]:

Is there a reason you can't just use a timeout inside the select?

I can add a timeout, that is not a problem: http://jsfiddle.net/uSbLC/10/ and its working fine.

But I have no idea which value for duration is the "best". Is it right that settimeout only starts when the function is completed. So I can always set duration to "1" for start immediately?

Changed November 07, 2012 04:26PM UTC by scottgonzalez comment:5

resolution: → wontfix
status: newclosed

As I said, autocomplete selection is always synchronous, so any value inside setTimeout() will work. Digging through the 1.8.x code, this only worked as a side effect of a work around for IE's asynchronous focus handling.