Hi Jörn,

exactly, the function gets iterated too and is considered as the last
element of the array. When passed on to autocomplete, it will break as
s.toLowerCase() is invalid when s isn't a string. Therefore; my patch
over at http://dev.jquery.com/attachment/ticket/3080/jquery.autocomplete.diff
(2 little additions to make autocomplete even more idiotproof than it
already is ;))

On a sidenote: The strangest part of it all is that the letsBreakStuff
function doesn't get applied on "normal" arrays (see the correct array
in the example mentioned earlier) but only to arrays created as an
element of an Object (or so it seems in the wrong array mentioned
earlier).

Regards,
Bram.

On Jul 1, 3:47 pm, "Jörn Zaefferer" <[EMAIL PROTECTED]>
wrote:
> Okay, so the issue is that letsBreakStuff gets iterated together with
> the rest of the array, while it should be ignored, as it doesn't have
> a numerical index, right?
>
> How does that relate to your patch?
>
> Jörn
>
> On Tue, Jul 1, 2008 at 11:36 AM, Bramus! <[EMAIL PROTECTED]> wrote:
>
> > Hi Jörn,
>
> > The problem in fact is Ext Related, yet can be reproduced without Ext:
> > any library that expands the Array prototype with a function can be
> > the wrongdoer.
>
> > Create a new blank document (nothing needs to be in it), open up
> > firebug and paste in the code below:
>
> > Array.prototype.letsBreakStuff = function(){return this};
> > correct = [
> >    "baa",
> >    "bah!",
> >    "bar",
> >    "bar!",
> >    "beblog",
> >    "bezar",
> >    "blog",
> >    "blub",
> >    "blub!",
> >    "boo",
> >    "bramus"
> > ];
>
> > As you can see this in fact does work correct.
>
> > However, I'm a great JSON-addict, and my autocompletion data - just as
> > any other call - is returned in the Object Literal Notation (and then
> > run through a custom parse function to get an autocomplete compatible
> > array).
>
> > Now, open up Firebug again and paste in this code:
>
> > Array.prototype.letsBreakStuff = function(){return this};
> > wrong = { "data":[
> >        "baa",
> >        "bah!",
> >        "bar",
> >        "bar!",
> >        "beblog",
> >        "bezar",
> >        "blog",
> >        "blub",
> >        "blub!",
> >        "boo",
> >        "bramus"
> >    ]
> > }
>
> > Check wrong.data, you'll see that the last item is the letsBreakStuff
> > function.
>
> > To make it all complete: the reason I named Ext is that I got the
> > remove function as last item on wrong.data ... which is added by Ext:
> > Ext.applyIf(Array.prototype,{indexOf:function(C){for(var
> > B=0,A=this.length;B<A;B++){if(this[B]==C){return B}}return
> > -1},remove:function(B){var A=this.indexOf(B);if(A!=-1){this.splice(A,
> > 1)}return this}});
>
> > Hope you now see why exactly I suggested that little patch ;)
>
> > Regards,
> > Bramus!
>
> > On Jun 24, 3:57 pm, "Jörn Zaefferer" <[EMAIL PROTECTED]>
> > wrote:
> >> I don't quite the how the issue is related to ExtJS. It sounds like
> >> you pass functions instead of strings to the autocomplete plugin,
> >> which is the actual issue here. Could you upload a testpage and post
> >> the URL here?
>
> >> Jörn
>
> >> On Tue, Jun 24, 2008 at 1:03 PM, Bramus! <[EMAIL PROTECTED]> wrote:
>
> >> > Filed a ticket on dev.jquery including a .diff 
> >> > file:http://dev.jquery.com/ticket/3080
> >> > ;-)
>
> >> > Regards,
> >> > B!
>
> >> > PS: [autocomplete] prefix seems to be cut off subject?
>
> >> > On Jun 24, 11:15 am, "Bramus!" <[EMAIL PROTECTED]> wrote:
> >> >> Hi Jörn et all here at the list,
>
> >> >> I'm using the autocomplete plugin in a project I'm working on and I
> >> >> must say: it works great!. However: one part of the project uses ExtJS
> >> >> (their tree component is great) and that's where things go wrong.
> >> >> Problem is that somewhere in ExtJS they extend Object with a remove()
> >> >> function, breaking jQuery.autocomplete.
>
> >> >> After a little quest I found that - quite obviously - autocomplete
> >> >> breaks on string manipulations (Function.toLowerCase() doesn't really
> >> >> exist ;)) and has a minor issue when displaying the items whenever
> >> >> some library has extended Object.
>
> >> >> Here below are the 2 minor changes I implemented in order to make
> >> >> things work "just fine" again. Could you tuck 'm into the release as I
> >> >> can't commit any changes to the trunk.
>
> >> >> Change #1: Display issue: $.Autocompleter.Select, function fillList():
> >> >> replace:
> >> >> if (!data[i])
> >> >> with:
> >> >> if (!data[i] || (data[i].value.constructor === Function))
>
> >> >> Change #2: Selection issue: $.Autocompleter.Cache, function
> >> >> matchSubset()
> >> >> at line#1 of this function (directly after the opening { ) add:
> >> >> if (s.constructor === Function) return false;
>
> >> >> Regards,
> >> >> Bramus!

Reply via email to