【发布时间】:2011-08-09 12:49:51
【问题描述】:
我有一个使用 reCAPTCHA 的表单。由于某种原因,当用户提交此表单时使用了错误的 recapture 值,当页面重新渲染时,recapture 无法渲染。
看起来正在发生的事情是重新捕获尝试注入“脚本”标签,并且偶尔(并且仅在某些浏览器、某些环境和某些场景中),它未能将该“脚本”标签添加到DOM。
事情是这样发生的:
1) 表单中嵌入了一些内联 javascript,如下所示:
https://www.google.com/recaptcha/api/challenge?k=<our public key>
2) 该脚本正确执行并返回以下内容:
var RecaptchaState = {
site : <some value>,
challenge : <challenge key>,
is_incorrect : false,
programming_error : '',
error_message : '',
server : 'https://www.google.com/recaptcha/api/',
timeout : 18000
};
document.write('<scr'+'ipt type="text/javascript" s'+'rc="' + RecaptchaState.server + 'js/recaptcha.js"></scr'+'ipt>');
3) 之后通常发生的情况是,脚本标签被注入页面,recaptcha.js 被加载,它会读取 RecaptchaState 以调用 recaptcha 以获取要呈现的图像。
但是,在某些情况下,由于某种原因,应该在 2) 中添加的脚本标记似乎从未添加到 DOM,因此从不加载 recaptcha.js,因此从不渲染 recaptcha!呈现页面后,我可以在控制台中看到“RecaptchaState”存在并且具有正确的值,只是没有脚本标签可以使用。
所以这就是正在发生的事情,我真的很困惑为什么。我只能在 Firefox 中重现这一点,奇怪的是,它只在某些条件下发生。例如,如果我通过提琴手路由请求,它每次都会工作,永远不会失败。如果我在提交请求之前清除缓存,它每次都会起作用。有时,当我预计它会失败时,它会起作用,反之亦然。所以很零星。
所以我的想法是,这可能与干扰“document.write”语句的 js 加载时间有关。也许其他一些javascript正在干扰它或类似的东西。只是寻找一些关于我如何尝试解决这个问题的一般想法,我可以运行的测试,我可以寻找的东西,或者任何真正的想法。
提前致谢
更新
仍然没有运气弄清楚这一点。我有一个想法......我们在萤火虫控制台中没有看到任何错误消息,这表明任何事情都出了差错,尽管显然有些事情。我们可以使用任何实用程序来仔细查看 Firefox 中到底发生了什么?我正在考虑类似 Chrome 的“Speed-Tracer”之类的东西,它可以为您提供非常详细的事件时间表。这里唯一的问题是我们无法重现 它在 Chrome 中。
【问题讨论】:
-
你试过用
document.createElement替换document.write和相关函数吗? -
不,该代码是从 recaptcha 发送给我们的,所以我们无法控制它。
标签: javascript dom recaptcha script-tag