2010-01-23 31 views
1

我正在使用reCAPTCHA通過其AJAX API在模式對話框中顯示驗證碼。我使用jqModal來顯示這些框,並且我使用的是reCAPTCHA的AJAX版本,因爲PHP版本已經是jqModal的bug了(一個已知的bug:http://markmail.org/message/bvip5vyb3czm7ngu)。reCAPTCHA AJAX API在Safari中的模式對話框中工作不穩定

現在,reCAPTCHA在Firefox中正常工作。但在Safari中,它並不總是顯示。有時,它工作正常,但大約20%的時間,沒有顯示reCAPTCHA框。

的jqModal聲明如下所示:

$().ready(function() { 
    $('#modalBox_register').jqm({ 
    ajax: '/modals/register.php', 
    trigger: 'a#registerButtonLink', 
    onShow: function(h) { 
    h.w.css('opacity', 1.00).fadeIn(300); 
    }, 
    onHide: function(h) { 
    h.w.fadeOut(300, function() { if (h.o) h.o.remove(); }); 
    } 
}); 
}); 

和模態對話框內的HTML/PHP看起來是這樣的:

<div id="registerModal"> 
<p class="caption">Registration form:</p> 
<form name="registerForm" id="modalRegisterForm" class="modalForm" action="/register/" method="post"> 

    <table cellspacing="15" border="0"> 
    <tr> 
    <td class="left"><label for="firstName">First Name:</label></td> 
    <td class="right"><input type="text" name="firstName" id="firstName" value="" class="registerModalTextField" /></td> 
    </tr> 
    <tr> 
    <td class="left"><label for="lastName">Last Name:</label></td> 
    <td class="right"><input type="text" name="lastName" id="lastName" value="" class="registerModalTextField" /></td> 
    </tr> 
    <tr> 
    <td class="left"><label for="email">Email Address:</label></td> 
    <td class="right"><input type="text" name="email" id="email" value="" class="registerModalTextField" /></td> 
    </tr> 
    <tr> 
    <td class="left"><label for="password">Password:</label></td> 
    <td class="right"><input type="password" name="password" id="password" value="" class="registerModalTextField" /></td> 
    </tr> 
    <tr> 
    <td class="left"><label for="passwordConfirm">Confirm Your Password:</label></td> 
    <td class="right"><input type="password" name="passwordConfirm" id="passwordConfirm" value="" class="registerModalTextField" /></td> 
    </tr> 

    <tr> 
    <td class="left">&nbsp;</td> 
    <td class="right"><div id="termswrap"> 
     <input id="terms" type="checkbox" name="terms" /> 
       <label id="lterms" for="terms">&nbsp;I have read and accept the <a href="/backmatter/termsofuse/">Terms of Use.</a><br /></label> 
       </div><!-- /#termswrap --></td> 
    </tr> 


    <!-- reCAPTCHA --> 
    <tr> 
    <td class="left"><label for="captcha">Are you human?</label></td> 
    <td class="right"><!-- Using the reCAPTCHA AJAX API, because the non-AJAX API is buggy with jqModal --> 
    <div id="recaptcha_div"></div> 
    <script type="text/javascript" 
     src="http://api.recaptcha.net/js/recaptcha_ajax.js"></script> <script 
     type="text/javascript"> 
      Recaptcha.create("123456789...", 
      "recaptcha_div", { 
      theme: "white" 
      }); 
     </script> 

    </td> 
    </tr> 


    <tr> 
    <td class="left">&nbsp;</td> 
    <td class="right"><input type="image" id="submitButton" src="/images/modals/button_register.png" value="Submit" alt="Submit" name="submit" /></td> 
    </tr> 
    </table> 


</form> 
</div><!--/#registerModal--> 

是否有人有線索,爲什麼驗證碼AJAX調用ISN」在Safari中正常工作?

+0

你在safari中得到了什麼結果?代碼在託管,所以我可以檢查它?我不知道這是否與此相關,但safari和其他基於webkit的瀏覽器無法顯示AJAX加載文件中定義的樣式,因此樣式必須加載到通過AJAX加載輔助頁面的主頁面中。 –

回答

1

我認爲Safari在重新呈現標記時會重新執行JavaScript。當對話框打開時,模態對話框中的任何內容都會重新渲染。此外,我懷疑在重新渲染後,recaptcha使用的document.write會對它的位置感到困惑,並且會混淆。在任何情況下,這裏就是我的固定問題:

$('#captcha-form script').remove();

「的captcha形式」是包含驗證碼形式的ID。刪除腳本標籤,以便在jQuery移動它們時Safari重新渲染它們時,腳本不會再次執行。腳本創建的事件處理程序不在腳本標記中,因此它們可以存活。