2012-01-11 128 views
6

我有一个函数在其下面被调用来重新载入一个recaptcha图像。它起作用,重新加载图像,但在此之后不会做任何事情。基本上这个形状是小的,它有这个rec​​aptcha它,所以我已经缩小它,并允许点击放大和所有。如果该人员按下“获取另一个验证码”调用reloadCAP(),它会检查它是否具有较大图像的类。如果是这样,我需要它添加该类和CSS回新的图像加载后的元素,但我似乎无法让它的工作。有任何想法吗?执行代码AFTER Recaptcha.reload()完成后

function reloadCAP() { 
    if($("#recaptcha_widget img").hasClass('largecap')) { 
     Recaptcha.reload(); 
     $("#recaptcha_widget img").addClass('largecap'); 
     $('#recaptcha_image').css('height', '62px'); 
    } else { 
     Recaptcha.reload(); 
    } 
} 

这里的HTML此:

<div id="recaptcha_widget" class="formRow" style="display:none;"> 
    <span class="f_label">Enter Words Below:</span> 
    <input type="text" class="setWidth" id="recaptcha_response_field" name="recaptcha_response_field" /> 

    <div class="cantread"> 
     <strong>Can't read this?</strong><br /> 
     <a href="javascript:reloadCAP()">Get another CAPTCHA</a> 
    </div> 

    <div id="recaptcha_image"></div> <!-- image loaded into this div --> 
     <div class="clear"></div> 
     <span class="smalltext">(click to enlarge)</span> 

     <br clear="all" /> 
    </div> 
<script type="text/javascript" src="http://api.recaptcha.net/challenge?k=6LfzMMwSAAAAADV6D04jDE6fKwrJ57dXwOEW-vY3&lang=en"></script> 

回答

3
$("#recaptcha_widget img").one('load',function(){ 
    $("#recaptcha_widget img").addClass('largecap'); 
    $('#recaptcha_image').css('height', '62px'); 
}); 

这会在您重新加载的图像的加载事件中放置一次只监听器,然后执行下面的代码。

我用.one()代替​​这里,因为你不希望每次都附加了新的听众打电话reloadCAP()

编辑

好了,这里就是我相信这个问题是。当您拨打Recaptcha.reload()时,它将删除<img />并将其替换为新的。所以当我们试图附加事件时,它会在图像被移除时被删除。

你需要做的是地方类largecaprecaptcha_image股利和修改你的CSS样式看起来像

.largecap img { 
    height: whatever; 
    width: whatever; 
} 
+0

嗯......试过.one然后.load并且都没有得到它为了我。我把它放在Recaptcha.reload()之前和之后;也没有任何工作 – 2012-01-11 17:06:45

+0

如果调试器中没有错误,可能只是您的一个选择器无法正常工作。你可以添加一些HTML到你的quesion? – 2012-01-11 17:18:59

+0

添加了html刚才 – 2012-01-11 17:27:16

0

不是一个理想的解决方案,但你可以把addClass以上代码Recaptcha.reload()和只是一两秒钟延迟它。

希望有所帮助。

+0

我试过了几个不同的变化,似乎没有为我工作:/但感谢您的帮助 – 2012-01-11 17:04:19

0

这听起来像你真正需要的是定制的主题化,这样你可以样式验证码/ image/etc完全按照需要:https://developers.google.com/recaptcha/docs/customization

如果您确实想要坚持您当前的实现,您可以在调用Recaptcha.create()之前挂接到Recaptcha的内置(和未记录的)回调函数中。

//Called after Recaptcha.reload() is finished loading 
Recaptcha._alias_finish_reload = Recaptcha.finish_reload; 
Recaptcha.finish_reload = function (challenge, b, c) { 
    //Call original function that creates the new img 
    Recaptcha._alias_finish_reload(challenge, b, c); 

    $("#recaptcha_widget img").toggleClass('largecap', true); 
} 

//Called when the initial challenge is received on page load 
Recaptcha._alias_challenge_callback = Recaptcha.challenge_callback; 
Recaptcha.challenge_callback= function() { 
    //Call original function that creates the new img 
    Recaptcha._alias_challenge_callback(); 

    $("#recaptcha_widget img").toggleClass('largecap', true); 
} 

你甚至遇到这个问题的原因是因为破坏的Recaptcha并创建重新加载一个新的IMG每次,让您手动添加的造型都将丢失。