Cappuccino: события клавиатуры сбрасываются в поле ввода reCAPTCHA - PullRequest
0 голосов
/ 13 февраля 2012

Я интегрирую reCAPTCHA в свое приложение Cappuccino, и у меня все это работает, кроме этой нечетной функциональности ввода в текстовом поле ввода reCAPTCHA: только некоторые клавиши работают, «qwrszcv» и несколько других букв работают нормально, но большинство других клавиш не работают.

Я позаимствовал часть кода mapkit для внедрения файла сценария reCAPTCHA в заголовок, а затем внедрил div reCAPTCHA в пользовательский класс 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 распространял события, но, по жизни, я не могу найти способ заставить этот ввод работать.

Ответы [ 2 ]

1 голос
/ 16 февраля 2012

Я нашел исправление. Я скопировал код из метода keyDown в CPTextField, который передает события в окно браузера, в метод keyDown в моем настраиваемом представлении, которое содержит recaptcha:

- (void)keyDown:(CPEvent)anEvent
{
    [[[self window] platformWindow] _propagateCurrentDOMEvent:YES];
    [self interpretKeyEvents:[anEvent]];
    [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];
}
1 голос
/ 15 февраля 2012

Cappuccino подключает слушателей ключевых событий на уровне документа для обработки сочетаний клавиш. Я не уверен, почему некоторые персонажи проходят, а другие нет, но я не удивлюсь, если это каким-то образом соответствует потенциальным сочетаниям капучино. Возможно, вы захотите проверить CPPlatformWindow+DOM.j для более подробной информации об этом.

В то же время, простое решение вашей реальной проблемы состоит в том, чтобы просто перетащить весь виджет recaptcha в iframe (вы можете использовать CPWebView или создать свой собственный). Просто помните, что в ваших обработчиках событий внутри iframes вам, возможно, придется вручную накачивать очередь событий с помощью [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];, чтобы позволить Cappuccino снова отображаться после того, как вы внесли изменения в код вне цикла выполнения.

...