2017-08-16 13 views
1

ユーザーがTChromium内で何回クリックしたかをトラッキングしたい。彼が「空白」/リンク/ボタン/画像/などでクリックするかどうかは気にしません。彼が何回クリックしたか知りたいだけです。私はTChromiumにOnclickイベントがあることを望んでいたが、誰もいなかった。ユーザーがクリックした場合、どうすればわかりますか?TChromium OnClick

+0

これは文書にもある。私はすぐに戻るよ... – Victoria

+0

私はあなたがマウスボタンをフックする必要があると思う。それ以外の場合は、何も起こりえない領域をクリックするとTChromiumが気になる理由はわかりません。 – RBA

+0

@RBA、JavaScriptのFlashなどのコンテナにクリックを聴くことはできないと思うので、あなたは正しいと思います。 – Victoria

答えて

3

イベントリスナーを追加できます。ここで問題となるのは、CEF3はCEF1のようなDOMイベントリスナーをサポートしていないため、簡単ではありません(不可能ではありません)。 V8インタラクションの例を作成しようとする前に、かなり汚い回避策があります。一意の十分な文字列を作成し、ドキュメント全体のイベントリスナーを追加します。このイベントでは、その一意の文字列でメッセージを記録します。 Delphiでは、一意のログメッセージを待つことになります。例:

const 
    MyClickMessage = '08B52B44-748F-44BB-AC6C-5179D6C1F523'; 

procedure TForm1.Chromium1LoadEnd(Sender: TObject; const browser: ICefBrowser; 
    const frame: ICefFrame; httpStatusCode: Integer); 
begin 
    if frame.IsMain then 
    frame.ExecuteJavaScript(
     'document.addEventListener("click", function(evnt){' + 
      'console.log("' + MyClickMessage + '");' + 
     '});', 
     '', 
     0); 
end; 

procedure TForm1.Chromium1ConsoleMessage(Sender: TObject; const browser: ICefBrowser; 
    const message, source: ustring; line: Integer; out Result: Boolean); 
begin 
    if message = MyClickMessage then 
    begin 
    Result := True; 
    ShowMessage('User clicked!'); 
    end; 
end; 

ハッキー、右:?私は何か良い(V8エンジンを使って)何かを思いついてみよう。

+0

ユーザーが非応答(href、ボタン、イメージなど)領域でウェブページをクリックしているときにこれは機能しますか? – RBA

+0

@RBA、should。しかし、私のコードでは、私はメインフレームにのみイベントを束縛し、バブリングを防止していません。それはまずいです。 – Victoria

+0

@RBA、もしあなたがJavaScriptを使うことができれば、あなたにV8実装を提供することができます。私は、文書全体のグローバルクリックフックを作成する方法(イベントのバブリングを止め、元の機能を維持する方法)を知りません。私はJavaScriptがうまくいきません。 – Victoria