Я использую сервис bit.ly для сокращения URL , чтобы сократить отправку определенных URL-адресов в функцию "поделиться в Twitter". Я бы хотел загружать URL-адрес bit.ly только тогда, когда пользователь действительно нажимает кнопку «Поделиться» (из-за ограничения в 5 параллельных запросов bit.ly). REST API Bit.ly возвращает обратный вызов JSON с сокращенным URL, что делает весь сценарий асинхронным.
Я попробовал следующее, чтобы остановить событие click и дождаться, пока вызов JSON вернет значение, прежде чем запускать click.
У меня есть следующий упрощенный код в jQuery (документ) .ready ():
Обновленный код (упрощенно)!
jQuery("#idofaelement").click(function(event) {
event.preventDefault(); //stop the click action
var link = jQuery(this);
bitlyJSON(function(shortUrl) {
link.attr("href", function() {
//process shortUrl
//return finalized url;
}).unbind().click();
});
});
И следующий код для обработки кратковременного сокращения (работает просто отлично):
function bitlyJSON(func) {
//
// build apiUrl here
//
jQuery.getJSON(apiUrl, function(data) {
jQuery.each(data, function(i, entry) {
if (i == "errorCode") {
if (entry != "0") {
func(longUrl);}
} else if (i == "results") {
func(entry[longUrl].shortUrl);}
});
});
} (jQuery)
Значение href изменяется, но заключительное событие .click () никогда не запускается. Это прекрасно работает при определении статического значения для href, но не при использовании асинхронного метода JSON.