0

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

我借用了一些 mapkit 代码将 reCAPTCHA 脚本文件注入到头部,然后我将 reCAPTCHA div 注入到我制作的自定义 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();
    }
}

我认为这与卡布奇诺传播事件的方式有关,但在我的一生中,我想不出一种方法来让这种输入发挥作用。

4

2 回答 2

1

Cappuccino 在文档级别附加键事件侦听器以处理键盘快捷键。我不确定为什么有些角色会通过而其他角色不会,但如果它以某种方式对应于潜在的卡布奇诺键盘快捷键,我不会感到惊讶。您可能需要检查CPPlatformWindow+DOM.j有关此的更多详细信息。

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

于 2012-02-14T23:21:11.020 回答
1

我找到了解决办法。我从 CPTextField 中的 keyDown 方法复制了代码,该方法将事件传播到浏览器窗口到我的自定义视图中包含 recaptcha 的 keyDown 方法:

- (void)keyDown:(CPEvent)anEvent
{
    [[[self window] platformWindow] _propagateCurrentDOMEvent:YES];
    [self interpretKeyEvents:[anEvent]];
    [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
于 2012-02-15T22:16:10.617 回答