2009-09-15 4 views
1

Salut à tous je ne sais pas comment aborder ce problème. J'ai une fonction qui est passé un tableau d'éléments HTML img. Il passe à travers ces images en vérifiant l'attribut SRC pour les images en utilisant un clou de pouce vide "sans image". Il exécute ensuite une recherche d'image en utilisant l'attribut ALT des balises img comme requête. La fonction de rappel sur la recherche remplace alors Img SRC avec le premier résultat d'image.Comment commander des recherches d'images google simultanées dans l'ordre d'exécution?

J'ai des problèmes pour faire correspondre l'image correcte avec le rappel de recherche correspondant. En ce moment, je ne fais que créer des tableaux et faire correspondre la recherche retournée avec un index pour les images. Comme les recherches multiples s'exécutent simultanément, en fonction de la taille de l'image ou de la latence du réseau, elles peuvent renvoyer l'appel hors service et mélanger les images.

J'ai besoin d'une approche qui me permet d'associer des recherches individuelles avec des éléments html. Serait-ce possible en utilisant un searchController et plusieurs objets imageSearch?

Voici un exemple de la fonction que je utilise

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')); 
    } 
    }); 
} 

Répondre

1

ce que je fini par faire encase quelqu'un est intéressé et pour l'auto rappel

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, myClosure(img)); 
    is.execute(img.alt); 
    } 
} 
} 
google.setOnLoadCallback(checkImages); 
Questions connexes