通过AJAX加载的页面上的reCAPTCHA字段无法加载。 建议?
实例:
- 没有AJAX
- 使用AJAX(单击“发送电子邮件”链接)
当我查看源页面时,一切正常,但是当我通过AJAX请求加载时,在reCAPTCHA所在的位置,我看到……
显然,除非我的用户已禁用JS,否则这不起作用。 在此过程中不会抛出任何错误。
以非AJAX请求的速度查看代码,我看到……
请注意脚本顶部的附加行,用于解决启用了JS的用户的问题。
所以我想问题是双重的。 WTF正在发生,我该如何解决?
我发现这个问题含糊其辞,但没有得到满满的答案。 我发现使用document.write
提到了reCAPTCHA API,但我不知道它是否有效。 如果我忽略了一些明显的东西,请随时指出。
根据请求,AJAX调用是……
$(document).ready(function() { $.get('/inc/email.php', function(data){ console.log('Get success!'); $('#email-form').html(data); console.log('Get added to #email-form!'); $('#email-form form').submit( function(){ $.ajax({ type: "POST", url: "/inc/email.php", data: $('#email-form form').serialize(), success: function() { console.log('Submit success!'); $('#email-form').html(data); } }); return false; }); } ); });
到目前为止我尝试了什么:
- 重写代码以获取远程JS文件,将document.write()子句替换为我设置为特定ID的元素的附加,然后在页面上内联运行修改后的代码
- 显示没有插件的reCAPTCHA而不是PHP reCAPTCHA库
说明:
使用AJAX进行此操作时中断的原因是因为jQuery在将其附加到DOM之前从HTML中删除任何script
标记,并在全局上下文中对其进行评估 。 它不会与HTML的其余部分一起插入DOM。
在你的代码中:
您的代码中的罪魁祸首就是这一行:
$('#email-form').html(data);
您将从服务器获取原始HTML字符串,并将其附加到DOM。 但是,jQuery 首先从data
变量中删除script
标记 ,然后在全局上下文中对其进行评估。
由于recaptcha.js
脚本使用document.write
将其内容添加到DOM中,因此它会中断; document.write
必须准确运行您希望它输出HTML的位置。
解决方案:
有两种可能的解决方案。
解决方案#1:
您可以使用vanilla JavaScript自行插入script
标记,而不是完全依赖jQuery,这将导致document.write
在您想要的地方运行 – 就在DOM中:
success: function() { var form = $('#email-form')[0], script = $('')[0]; form.appendChild(script); }
注意这些行末尾的[0]
。 它们用于访问底层的本机DOM对象,因此我们可以使用DOM的本机appendChild
。
解决方案#2:
不要通过AJAX加载数据,而是考虑将其放在自己的页面中,然后只需在页面中插入iframe
:
success: function() { $('#email-form').html(''); }
你可以回复/inc/email.php文件中的所有内容! 您必须提前包含所有必要的文件。