0

私はreCAPTCHAを私のカプチーノアプリケーションに統合しています。私はreCAPTCHA入力テキストフィールドでこの奇妙な入力機能の他にすべての機能を持っています: "qwrszcv他のほとんどの文字は正常に動作しますが、他のほとんどのキーは機能しません。カプチーノ:キーボードイベントがreCAPTCHA入力フィールドで押しつぶされました

私はreCAPTCHAスクリプトファイルを先頭に挿入するためにmapkitコードを借用しました。次に、私が作成したカスタムCPViewクラスにreCAPTCHA divを挿入しました。

ここに私のコンストラクタコードです:私は、私はそれがカプチーノは、イベントを伝播する方法とは何かを持って理解

- (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(); 
    } 
} 

が、私の人生のために:

- (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; 

} 

そして、私の初期化コードこの入力を機能させる方法を見つけることができません。

答えて

1

修正が見つかりました。

- (void)keyDown:(CPEvent)anEvent 
{ 
    [[[self window] platformWindow] _propagateCurrentDOMEvent:YES]; 
    [self interpretKeyEvents:[anEvent]]; 
    [[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode]; 
} 
1

カプチーノは、キーボードショートカットを処理するために、ドキュメントレベルでキーイベントリスナーをアタッチします。私はなぜいくつかの文字が通っているのか、他の人はそうではないのか分からないが、もしかするとカプチーノのキーボードショートカットに対応していれば驚かないだろう。この詳細については、CPPlatformWindow+DOM.jをチェックしてください。

実際の問題を簡単に解決できるのは、recaptchaウィジェット全体をiframeにドロップすることです(CPWebViewを使用するか、自分で作ることができます)。 iframe内のイベントハンドラでは、実行ループ外のコードから変更を加えた後にCappuccinoを再表示させるには、[[CPRunLoop currentRunLoop] limitDateForMode:CPDefaultRunLoopMode];でイベントキューを手動でポンプする必要があるかもしれません。

+0

私はCPWebViewを使用して考えていたいやが、ちょうどIFRAMEがかもしれないと思った:私はreCAPTCHAのを保持している私のカスタムビューにはKeyDown方法にブラウザ・ウィンドウにイベントを伝播しCPTextFieldではKeyDownメソッドからコードをコピー不要な複雑さを加える。実際には、カプチーノのiframeを使用せずにカスタム入力フィールドを持つ方法はありますか? –

+0

これを行う方法は非常にうまくいく可能性があります。努力する価値があるかどうかは分かりません。iframeはそれほど高価ではありません。しかし、実際に追加したい場合は、Javascriptデバッガでいくつかのデバッグポイントを設定し、 'index-debug.html'を使ってデバッグバージョンのアプリケーションをロードする必要があります。次に、CPPlatformWindow + DOM.jからイベント処理を追跡します。 –

関連する問題