Как заказать параллельный поиск картинок Google в порядке их исполнения? - PullRequest
1 голос
/ 15 сентября 2009

Привет всем, я не уверен, как подойти к этой проблеме. У меня есть функция, которая передается массив элементов HTML img. Он просматривает эти изображения, проверяя атрибут SRC для изображений, используя пустой палец «без изображения». Затем он выполняет поиск изображения, используя в качестве запроса атрибут ALT тегов img. Затем функция обратного вызова в поиске заменяет Img SRC первым результатом изображения.

У меня проблемы с сопоставлением правильного изображения с соответствующим поисковым обратным вызовом. Прямо сейчас я просто создаю массивы и сопоставляю возвращенный поиск с индексом для изображений. Поскольку множественный поиск выполняется одновременно, в зависимости от размера изображения или задержки в сети, они могут выполнить обратный вызов не по порядку и смешать изображения.

Мне нужен подход, который позволил бы мне связать индивидуальный поиск с элементами HTML. Возможно ли это с помощью searchController и нескольких объектов imageSearch?

Ниже приведен пример функции, которую я использую

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

1 Ответ

1 голос
/ 16 сентября 2009

это то, что я закончил делать, если кто-то заинтересован, и для напоминания о себе

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);
...