Thanks for the help Jeremy! Your approach is a lot more refined and helped
me to grasp closures which I have been struggling to comprehend for a while.
However I tried to implement your code and started getting this this error :

Error: d[Pa] is not a function
Source File:
http://www.google.com/uds/api/search/1.0/40bd152e58b372172f7ad3373353ddf4/default+en.I.js
Line: 105

It stems from the google api script and I am unsure what is triggering it.
Search results turns up nothing on the issue either.


On Tue, Sep 15, 2009 at 6:23 AM, Jeremy Geerdes <[email protected]> wrote:

>
> You need to use what's called a method closure. In layman's terms
> (that's what I prefer), it's a function that returns a function.
> Here's how I would do what you're trying to do:
>
> google.load('search','1');
> function checkImages(){
>
>  // Here is the closure!
>  var myClosure = function(img){return function(){
>   if(this.results&&this.results.length>0){
>    var result = this.results[0];
>    img.src = result.tbUrl;
>    img.alt = result.titleNoFormatting;
>   }
>  }};
>
>  var imgs = document.getElementsByTagName('img');
>  for(var i=0;i<imgs.length;i++){
>   var img=imgs[i];
>   if(img.src.match(/no_image.{4}/)){
>    var is = new google.search.ImageSearch;
>    is.setSearchCompleteCallback(is, img);
>    is.execute(img.alt);
>   }
>  }
> }
> google.setOnLoadCallback(checkImages);
>
> You'll notice the method closure in there. Essentially, it's a
> function that accepts an img element as an argument. That img element
> is then global to everything inside that function, including the
> function that is returned. It's kind of like taking a snapshot of what
> you're up to at the moment you create the callback.
>
> You'll also notice that I don't rely on one ImageSearch object, but
> actually create one ImageSearch for each image. This has the effect of
> running a bunch of searches concurrently, rather than in serial (i.e.,
> one after the other). Thus, the performance of the site is improved
> because we don't have to wait for one search to get done before we can
> run the next one.
>
> Jeremy R. Geerdes
> Effective website design & development
> Des Moines, IA
>
> For more information or a project quote:
> http://jgeerdes.home.mchsi.com
> http://jgeerdes.blogspot.com
> http://jgeerdes.wordpress.com
> [email protected]
>
> Unless otherwise noted, any price quotes contained within this
> communication are given in US dollars.
>
> If you're in the Des Moines, IA, area, check out Debra Heights
> Wesleyan Church!
>
> And check out my blog, Adventures in Web Development, at
> http://jgeerdes.blogspot.com
>  !
>
>
> On Sep 15, 2009, at 12:36 AM, KevIsAZombie wrote:
>
> >
> > Hi all I am not sure how to approach this problem. I have a function
> > that is passed an array of HTML img elements. It loops through these
> > images checking the SRC attribute for images using a blank "no image"
> > thumb nail. It then executes an image search using the img tags ALT
> > attribute as the query. The callback function on the search then
> > replaces the Img SRC with the first image result.
> >
> > I am having problems matching up the correct image with the
> > corresponding search callback. Right now I am just creating arrays and
> > matching the returned search with an index for the images. Since the
> > multiple searches run concurrently, depending on the size of the image
> > or network latency they can fire the call back out of order and mix up
> > the images.
> >
> > I need an approach that lets me pair individual searches with html
> > elements. Would this be possible using a searchController and multiple
> > imageSearch objects?
> >
> > Below is an example of the function I am using
> >
> > google.load('search', '1');
> >
> > function googleFillBlanks(jqueryImages){
> >
> >  //namePairs holds the images matching alt text and attachedCount is
> > used for matching up once the call back is fired
> >  var attachedCount = 0;
> >  var namePairs = [];
> >
> >  function searchComplete(searcher){
> >    if (searcher.results && searcher.results.length > 0) {
> >       var results = searcher.results;
> >       var result = results[0];
> >       $("img[alt='"+namePairs[attachedCount]+"'] ").attr('src',
> > result.tbUrl);
> >       //jqueryImages.get(0).attr('src', result.tbUrl);
> >       attachedCount++;
> >    }
> >  }
> >
> >   var imageSearch = new google.search.ImageSearch();
> >
> >    //restrict image size
> >    imageSearch.setRestriction
> > (google.search.ImageSearch.RESTRICT_IMAGESIZE,
> >
> > google.search.ImageSearch.IMAGESIZE_SMALL);
> >
> >    imageSearch.setSearchCompleteCallback(this, searchComplete,
> > [imageSearch]);
> >
> >  jqueryImages.each(function(){
> >    if($(this).attr('src').substr(-12,8) == 'no_image')
> >    {
> >      namePairs.push($(this).attr('alt'));
> >      imageSearch.execute($(this).attr('alt'));
> >    }
> >  });
> > }
> >
> > >
>
>
> >
>


-- 
Kev Zettler
www.callmekev.com
920-904-2474

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google AJAX APIs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/google-ajax-search-api?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to