2013-04-30 2 views
0

Я хочу получить доступ к переменной linky ниже внутри функции для img#play. Однако он принимает только последнее известное значение linky, и я понимаю, что это связано с тем, что называется закрытием Javascript. Google google и многие другие вещи, такие как return linky в функции img # play click, похоже, не работают. Мне также сказали, что переменная song будет страдать от той же проблемы. У кого-нибудь есть идеи о том, как сделать функцию click для работы img # для каждой отдельной ссылки, а не только последней?Доступ к переменной Javascript Closure за пределами функции

function doSearch() { 

    var searchTerm = document.getElementById('search').value; 

    // Search soundcloud for artists 
    SC.get('/tracks', { q: searchTerm}, function(tracks) { 
     for(track in tracks) { 

     console.log(tracks[track]); 

     var img = document.createElement('img'); 
     img.setAttribute("src", (tracks[track]["artwork_url"])); 
     var title = tracks[track].title.replace("'", "\\\'").replace("\"", "\\\""); 

     var song = document.createElement('div'); 

     var linky = document.createElement('a'); 
     linky.setAttribute("href", (tracks[track].permalink_url)); 

     img.setAttribute("onclick", "showTrackInfo('" + title + "\\n" + "\\n" + tracks[track].label_name + "\\n\\n" + "(click to close)" + "')"); 



     if (tracks[track]["artwork_url"] == null) { 
      console.log(""); } 
     else { 

      var Catalog = document.getElementById('catalog'); 
      Catalog.appendChild(img); 

      $('div#catalog').append('<img src="http://i.imgur.com/rGdvfl7.png" id="play">'); 


      $('img#play').click(function() { 

      return this.linky; 


      $.get(
      'http://soundcloud.com/oembed?' + 
      'url=' + linky + 
      '&format=json&maxheight=296' 
      ) 

      .done(function (response) { 
      song.innerHTML = response.html; 
      document.getElementById("soundiframe").appendChild(song); 

      }); 
      }); 
     } 


     } 
    }); 
    }; 

мне нужны все переменные в коде выше ... Если у кого есть какие-либо подсказки о том, что сделать это было бы оценено.

+0

Похоже, что проблема связана скорее с асинхронным поведением. – adeneo

+0

Общепринятая проблема. 'song' внутри вашего $ .get() будет ссылаться на последний созданный, если он когда-либо доходил до $ .get(), так как вы возвращаете значение до этого. Очень странная структура кода ... –

+0

Что вы ожидаете от использования "return this.linky;" ? –

ответ

0

Вы можете создать еще закрытие:

(function(linky, song) { 
    $('img#play').click(function() { 
    ... 
}(linky, song)); 

Это сохранит значение Linky в то время создается замыкание.

+0

Hrmm. Я пробовал это: https://gist.github.com/jennojenno/5492540 и добавил ваш код в строках 2 и 10. Однако я все еще получаю только последнюю песню, а не каждую. Я здесь что-то не так? – jenno

+0

@jenno Вы поменяли строки 1 и 2 – zeroflagL

+0

А. Сначала я попробовал это так, а потом, когда это не сработало, я поменял его, как сейчас. Ни один из них не работал ... Я что-то упустил? – jenno

Смежные вопросы