Wow I'm chatty aren't I...

I just wanted to add I changed my code to this

             $(function() {
                                $.ajax({
                                        type: "GET",
                                        url: "xml/location.xml",
                                        dataType: "xml",
                                        success: function(xml) {
                                                towncity = [];
                                                $(xml).find("[EMAIL 
PROTECTED]'"+ currprov +"'] >
TOWN_CITY_NAME").map(function(){
                                                        towncity.push( 
$(this).text() );
                                                });
                                        $("#city").autocomplete(towncity);
                                }

and that improved speed greatly. It appeared I was binding the
autocomplete script and data source to the #city field with every
iteration of my XML file query and this of course was causing a huge
speed bump. Once I moved the autocomplete binding statement outside of
my XML file query function the wheels turned much faster.

Mat :)

On Dec 6, 12:26 pm, Mat <[EMAIL PROTECTED]> wrote:
> One thing I do notice with my code is that it is slow. If I change
> provinces and type in the city field and change provinces again things
> slow right down. I know this must be due to the way I have coded this.
> I am wondering if you have any suggestion to improve the speed of
> things? The form will primarily used by those in Alberta so I though
> if I loaded the array with Alberta city names by default when the
> script loads it might speed things up. DO you think the JSON approach
> you mentioned would be quicker?
>
> Thanks,
> Mat
>
> On Dec 6, 12:15 pm, Mat <[EMAIL PROTECTED]> wrote:
>
> > Hi Micheal,
>
> > Thank you so much for that. I knew I was getting close to a solution
> > but I was well and truly stuck. It is now working and I am delighted.
>
> > This is the code that worked for me
>
> > success: function(xml) {
> >         towncity = [];
> >         $(xml).find("[EMAIL PROTECTED]'"+ currprov +"'] > 
> > TOWN_CITY_NAME").map
> > (function(){
> >                 towncity.push( $(this).text() );
> >                 $("#city").autocomplete(towncity);
> >         });
>
> > }
>
> > The XML file I am querying      is a file I constructed myself (so I have
> > full access to it) for a few different reasons. I am not good enough
> > at mySQL to create a database with the information, I am too cheap to
> > pay for a ready made database ;), the autocomplete script gives an
> > option of storing the data in a local.js file but I did not like this
> > idea as it may not transfer to future projects and I don't really know
> > much about JSON.
>
> > Once again thank you so much, I expected to have to spend hours trying
> > to get this to work today!
>
> > Mat
>
> > On Dec 5, 11:55 am, "Michael Geary" <[EMAIL PROTECTED]> wrote:
>
> > > Hi Mat,
>
> > > 1) You're defining towncity like this:
>
> > >     var towncity = window.towncity = new Array();
>
> > > That creates both a local variable named towncity and a window property
> > > (global variable) of the same name. Is that what you want? Do you need to
> > > use towncity outside this code? If not, I would change it to:
>
> > >     var towncity = [];
>
> > > 2) In the .each() inside your ajax callback you have this code:
>
> > >     towncity = $(this).text();
>
> > > That *replaces* the towncity variable with the text of the single XML
> > > element for the current iteration of .each() - so it's no longer an array
> > > but is now a simple text string. It doesn't sound like that's what you 
> > > want,
> > > is it?
>
> > > To append the item text to the towncity array, you could change it to:
>
> > >     towncity.push( $(this).text() );
>
> > > But you probably also want to clear this array before running the loop (is
> > > that right?), so just before the $(xml).find(...) you should add:
>
> > >     towncity = [];  // note: no "var" here
>
> > > which gives you this code:
>
> > >     success: function(xml) {
> > >         towncity = [];
> > >         $(xml).find(...).map(function(){
> > >             towncity.push( $(this).text() );
> > >         });
> > >     }
>
> > > Given that, you could simplify the code to:
>
> > >     success: function(xml) {
> > >         towncity = $(xml).find(...).map(function(){
> > >             return $(this).text();
> > >         });
> > >     }
>
> > > BTW, do you have control over the XML file that the server generates? If 
> > > you
> > > do, you could use JSON instead of XML to make the code simpler. If you're
> > > stuck with XML, this code should do the trick.
>
> > > -Mike
>
> > > > From: Mat
>
> > > > Hi there,
>
> > > > I'm sorry this is a pretty newbie question....
>
> > > > I am using JQuery with an xml file and autocomplete. What I am trying
> > > > to achieve is to use an xml file as my data source to autocomplete
> > > > cities in a form once a user selects their province. When a user
> > > > selects a particular province then only the cities in that province
> > > > will be listed by the autocomplete script as the user starts to type
> > > > in the 'city' form field.
>
> > > > My problem here is that I am trying to use the array 'towncity' as my
> > > > data source for autocomplete and change the contents of the array when
> > > > the province select box #province is changed. However, I can not get
> > > > my $('#province').change(function().... to affect the array 'towncity'
> > > > that I have declared outside of the function....
>
> > > >    <script type="text/javascript">
> > > >    $(document).ready(function() {
> > > >            var towncity = window.towncity = new Array();
> > > >            $("#city").autocomplete(towncity);
> > > >            $.preloadCssImages();
> > > >            $('div.jshide').show();
> > > >            $("#tenantForm").validate({
> > > >              rules: {
> > > >                    name: {
> > > >                      required: true,
> > > >                      minlength: 2
> > > >                    },
> > > >                    province:"required",
> > > >                    ccom:"required",
> > > >                    occupied: "required",
> > > >                    rented:"required",
> > > >                    condo:"required",
> > > >                    payment:"required"
>
> > > >              }
> > > >            });
>
> > > >            $("#renewdate").datepicker({
> > > >                    dateFormat: "d M, yy",
> > > >                    showOn: "both",
> > > >                    buttonImage: "images/calendar.gif",
> > > >                    buttonImageOnly: true
> > > >            });
>
> > > >            $('#province').change(function() {
> > > >                    var currprov = $('option:selected',
> > > > this).text();
>
> > > >                    $(function() {
> > > >                            $.ajax({
> > > >                                    type: "GET",
> > > >                                    url: "xml/location.xml",
> > > >                                    dataType: "xml",
> > > >                                    success: function(xml) {
>
> > > > $(xml).find("[EMAIL PROTECTED]'"+ currprov +"'] >
> > > > TOWN_CITY_NAME").each(function(){
>
> > > > towncity = $(this).text();
> > > >                                            });
> > > >                                    }
> > > >                            });
> > > >                    });
> > > >            });
> > > >    });
> > > >     </script>
>
> > > > Anyone have any ideas?
>
> > > > Thanks,
> > > > Mat

Reply via email to