2011-07-31 36 views
15

Tôi đã nhúng Chromium thành công vào các dự án Delphi 6 của tôi với sự trợ giúp của Delphi Chromium Embedded. Bây giờ tôi muốn để có thể thực thi mã Javascript và có kết quả trả lại cho ứng dụng Delphi máy chủ của tôi. Phương thức hiện tại của tôi là gọi ExecuteJavascript() và sử dụng một phần tử DOM mà cuộc gọi Javascript ghi kết quả của nó vào và thăm dò phần tử đó trong một phương thức TTimer từ Delphi để lấy kết quả. Tuy nhiên, tôi đọc về việc sử dụng các chức năng có nguồn gốc và phần mở rộng V8 có Javascript gọi là "gọi lại" vào mã Delphi của tôi như là một cách để nhận được kết quả thay vì:Cách hiển thị "hàm gốc" cho Javascript trong trang web bằng Chromium và Delphi 6?

http://magpcss.org/ceforum/viewtopic.php?f=7&t=180

Tôi muốn thử điều này và tôi cũng muốn biết cách đính kèm trình nghe sự kiện dựa trên Delphi vào các phần tử DOM trong trang web (onblur, onmousedown, v.v.). Tôi đang tìm một số mẫu có thể chỉ cho tôi cách làm hai điều này nếu có ai biết tìm chúng ở đâu.

+2

Wow, Delphi-6 nơi bạn phải thực hiện tất cả Unicode bằng tay và Chromium với hỗ trợ Unicode đầy đủ.Bây giờ mà âm thanh như một trở kháng không phù hợp với tôi :) –

+0

"Impedance không phù hợp". Có một kỹ sư điện tử trong phòng folks. :) Bạn nói đúng, nhưng Delphi 6 vẫn là IDE yêu thích của tôi. Ít nhất là bây giờ. –

+0

Tôi ước mình là kỹ sư điện tử; Tôi chưa bao giờ có cơ hội nghiên cứu nó, nhưng vẫn có cảm giác rằng biết về kỹ thuật điện tử và có cảm giác về những gì có thể đi sai có ích rất lớn trong CNTT. Tôi hiểu bạn thích Delphi 6, nhưng mong bạn xem xét các phiên bản hiện tại hơn. Gần đây tôi phải quay trở lại, và có rất nhiều điều tôi đã bỏ lỡ ... –

Trả lời

14

Gắn thính giả là khá dễ dàng (chỉ có ở phiên bản cũ của CEF):

procedure MouseDownCallback(const Event: ICefDomEvent); 
begin 
    ShowMessage('Mouse down on '+Event.Target.Name); 
end; 

procedure AttachMouseDownListenerProc(const Doc: ICefDomDocument); 
begin 
    Doc.Body.AddEventListenerProc('mousedown', True, MouseDownCallback); 
end; 

procedure TMainForm.Button1Click(Sender: TObject); 
begin 
    ChromiumComponent.Browser.MainFrame.VisitDomProc(AttachMouseDownListenerProc); 
end; 

Về chức năng mở rộng để có được kết quả JavaScript trực tiếp: (? Chưa) thân cây không chứa chúng. Có vẻ là công việc đang tiến hành.

Sửa:

Bắt thoát khỏi bỏ phiếu thông qua mở rộng:

Nó thực sự là có thể cho mã JavaScript của bạn gọi lại vào mã Delphi của bạn sử dụng phần mở rộng. Hơn nữa, bạn có thể gửi các giá trị từ JavaScript đến Delphi - điều này có thể được sử dụng để chuyển các kết quả mà không cần phải thăm dò ý kiến.

đầu tiên trong phần initialization bạn đăng ký phần mở rộng, mà tạo ra một đối tượng JavaScript sau để được sử dụng khi gọi lại:

procedure RegisterExtension; 
var 
    Code:string; 
begin 

    Code := 
    'var cef;'+ 
    'if (!cef)'+ 
    ' cef = {};'+ 
    'if (!cef.test)'+ 
    ' cef.test = {};'+ 
    '(function() {'+ 
    ' cef.test.__defineGetter__(''test_param'', function() {'+ 
    ' native function GetTestParam();'+ 
    ' return GetTestParam();'+ 
    ' });'+ 
    ' cef.test.__defineSetter__(''test_param'', function(b) {'+ 
    ' native function SetTestParam();'+ 
    ' if(b) SetTestParam(b);'+ 
    ' });'+ 
    ' cef.test.test_object = function() {'+ 
    ' native function GetTestObject();'+ 
    ' return GetTestObject();'+ 
    ' };'+ 
    '})();'; 

    CefRegisterExtension('example/v8', Code, TMyHandler.Create as ICefv8Handler); 
end; 

initialization 
    RegisterExtension; 

TMyHandler 's Execute sẽ được gọi sau. TMyHandler được định nghĩa là

TMyHandler = class(TCefv8HandlerOwn) 
protected 
    function Execute(const name: ustring; const obj: ICefv8Value; 
    const arguments: TCefv8ValueArray; var retval: ICefv8Value; 
    var exception: ustring): Boolean; override; 
end; 

Việc thực hiện cho các mục đích trình diễn rất đơn giản cho bây giờ:

function TMyHandler.Execute(const name: ustring; const obj: ICefv8Value; const arguments: TCefv8ValueArray; var retval: ICefv8Value; var exception: ustring): Boolean; 
begin 
    ShowMessage('Execute!'); 
end; 

Bây giờ để kiểm tra gọi vào Delphi từ JavaScript đơn giản làm:

ChromiumComponent.Browser.MainFrame.ExecuteJavaScript('cef.test.test_object().GetMessage();', 'about:blank', 0); 

này sẽ hiển thị hộp thông báo nói "Thực thi!".

Tôi kéo kịch bản demo từ một mẫu tên cefclient mà bạn có thể tìm thấy trong \ demo \ cefclient thư mục trong thư mục gốc thành phần. Mã mẫu mở rộng được ẩn một chút và trộn lẫn với mã demo khác. Nhưng sự quan tâm đặc biệt đối với chúng tôi là việc thực hiện TExtension.Execute (tương đương với TMyHandler.Execute) của tôi. Ở đó bạn có thể tìm cách xác định hàm nào đang được gọi và cách truyền tham số. (Link to the code.)

+0

Cảm ơn Heinrich. Đó là những gì tôi cần. "Về các chức năng mở rộng để nhận kết quả JavaScript ...". Một trong những chủ đề tôi đọc chỉ ra rằng có một số mối quan tâm về điều này bởi vì nó sẽ liên quan đến việc chặn các thread gọi điện thoại trong khi kết quả đã được trả lại. Tôi hiểu rằng mối quan tâm nhưng cá nhân tôi muốn nhìn thấy nó với những lời khuyên thông thường về ngăn chặn chủ đề. Nhưng đó là ý kiến ​​của tôi. –

+0

Rất vui được giúp đỡ. Tôi hoàn toàn đồng ý rằng các chức năng mở rộng có thể hữu ích, đặc biệt là các âm thanh 'executeScriptAndReturnValue' có ích. –

Các vấn đề liên quan