如何使用jQuery click事件基于JSON查询异步更改href值
我正在使用bit.ly url缩短服务来缩短某些url被发送到“在twitter上分享”function。 我只想在用户实际按下共享按钮时加载bit.ly url(由于bit.ly的最大5个并行reqs限制)。 Bit.ly的REST API使用缩短的url返回JSON回调,这使整个场景异步。
我已尝试以下方法来停止click事件,并等待JSON调用在启动单击之前返回一个值。
我在jQuery(document).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方法时则不行。
如您所述:
event.preventDefault(); //stop the click action
这意味着, 浏览器不会访问该URL ,如果您希望实际前往长url,只需执行以下操作:
document.location.href = longurl;
iirc,jquery不会触发A元素的“点击”。 我会在回调中尝试旧的“location.href = whatever”。
bitlyJSON(function(shortUrl) { link.attr("href", function() { //process shortUrl //return finalized url; }); location.href = link.attr("href"); });
我认为你真正想要的是return false;
来自click事件,以防止实际跟随href,对吧?
喜欢:
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(); }); return false; });
@Tzury Bar Yochay通过建议我使用location.href更新url,向我指出了正确的方向。 @Victor帮助他回答了问题。
我把各种答案结合起来,但是在firefox中遇到了历史问题。 似乎更新window.location确实重定向了用户,但也从历史记录中删除了“源页面”。 这不会发生在chrome,safari,ie8,ie8-compatibility或ie7中。
根据对另一个问题的回复,我能够创建一个解决方法,给出以下工作代码+进行了一些更改:
jQuery("#idofaelement").one("click", function(event) { bitlyJSON(function(shortUrl) { jQuery("#idofaelement").attr("href", function() { //process shortUrl //return finalized url; }); setTimeout(function() { window.location = jQuery("#idofaelement").attr("href"); }, 0); }); return false; });
感谢您的帮助!
- JQM(jQueryMobile)在changePage()上推出DOM的最后一页
- jQuery .show(’slide’,{direction:’right’})不起作用,但.show(’slide’)确实有效