我正在将reCAPTCHA集成到我的Cappuccino应用程序中,除了在reCAPTCHA输入文本字段中具有这种奇怪的输入功能之外,其他所有功能都可以正常工作:似乎只有一些键有效,“qwrszcv”和其他几个字母也可以正常工作,但其他大多数键都可以正常工作不工作。

我借用了一些mapkit代码,将reCAPTCHA脚本文件注入(inject)了头部,然后将reCAPTCHA div注入(inject)了我创建的自定义CPView类中。

这是我的构造函数代码:

- (id)initWithFrame:(CGRect)aFrame
{

    self = [super initWithFrame:aFrame];
    if (self != nil)
    {
        var DOMScriptElement = document.createElement("script");

        DOMScriptElement.src = "http://www.google.com/recaptcha/api/js/recaptcha_ajax.js";
        DOMScriptElement.type = "text/javascript";

        document.getElementsByTagName("head")[0].appendChild(DOMScriptElement);

        needsInitialization = YES;
        console.log(self);
    }
    return self;

}

而我的初始化代码:
- (id)initializeRecaptcha
{
    if (needsInitialization)
    {
        DOMRecaptchaElement = document.createElement("div");
        DOMRecaptchaElement.id = "recaptcha_div_id";


        var style = DOMRecaptchaElement.style,
            bounds = [self bounds],
            width = CGRectGetWidth(bounds),
            height = CGRectGetHeight(bounds);

        style.overflow = "hidden";
        style.position = "absolute";
        style.visibility = "visible";
        style.zIndex = 0;
        style.left = "0px";
        style.top = "0px";
        style.width = width + "px";
        style.height = height + "px";

        _DOMElement.appendChild(DOMRecaptchaElement);

        window.Recaptcha.create("my-recaptcha-key",
            "recaptcha_div_id",
            {
                theme: "clean",
                callback: window.Recaptcha.focus_response_field
            }
        );

        needsInitialization = NO;
    }
    else
    {
        window.Recaptcha.reload();
    }
}

我认为这与 Cappuccino 传播事件的方式有关,但是对于我一生来说,我一直想不出一种使此输入起作用的方法。

最佳答案

Cappuccino 在文档级别附加键事件监听器,以处理键盘快捷键。我不确定为什么有些字符通过了,而另一些字符却没有,但是如果它与潜在的 Cappuccino 键盘快捷键相对应,我也不会感到惊讶。您可能需要检查CPPlatformWindow+DOM.j以获得更多详细信息。

同时,解决您实际问题的简单方法是将整个Recaptcha小部件放到iframe中(您可以使用CPWebView或自己制作)。只需记住,在iframe内的事件处理程序中,您可能必须使用[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];手动泵送事件队列,以使在运行循环之外的代码进行更改后, Cappuccino 可以重新显示。

关于javascript - Cappuccino :在reCAPTCHA输入字段中压缩键盘事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9264600/

10-09 01:07