2012-02-08 11 views
8

Đã có ứng dụng Windows Forms bằng cách sử dụng điều khiển WebBrowser (.NET 4) để tải trang web được liên lạc với ứng dụng. Tôi đã có một cuộc gọi đến InvokeScript() để gọi một thói quen Javascript trong trang web tại một thời điểm.Cách gọi hàm jQuery từ điều khiển .NET WebBrowser bằng cách sử dụng InvokeScript()?

Bây giờ mọi thứ đã được "cập nhật" và jQuery hiện đang được sử dụng. Vì vậy, thay vì có một hàm OnVenueSelected() để gọi, bây giờ là một số $.city.venue.onVenueSelected: function(param) kỳ quặc.

Chỉ cần thay đổi cuộc gọi của tôi từ InvokeScript("OnVenueSelected", new object[] { params }) thành InvokeScript("$.city.venue.onVenueSelected", new object[] { params }) không hoạt động. Tôi không nhận được bất kỳ lỗi hoặc ngoại lệ nào có thể quan sát được, nhưng logic trong cuộc gọi không được gọi.

Một số thông tin xung quanh đã cố gắng sử dụng eval làm cuộc gọi và chuyển tên và tham số chức năng dưới dạng chuỗi đến eval. Điều đó cũng không hiệu quả.

Có cách nào để gọi một hàm được nhúng trong một vài lớp phép thuật jQuery không?

Cảm ơn.

Trả lời

7

OK - Tôi có thể trả lời câu hỏi của riêng mình. Một phần nhờ vào các câu trả lời bằng tại How to call a jQuery function from .NET WebBrowser control using InvokeScript()?, tôi đã có thể thay đổi cuộc gọi của tôi đến chức năng jQuery để

string[] codeString = { String.Format(" {0}('{1}') ", @"$.city.venue.onVenueSelected", result.ToString()) }; 
this.myBrowser.Document.InvokeScript("eval", codeString); 

Thật ngạc nhiên đủ, điều này dường như được làm việc.

Trong trường hợp của tôi, biến kết quả là loại bool (trong trường hợp quan trọng đối với bất kỳ ai).

+1

@GuysWithDogs tôi đã đưa cho bạn một phương pháp thay thế chỉ trong trường hợp này thất vọng bạn tại một số sân khấu, có lẽ gửi một lót của tôi trong ý kiến ​​của mã của bạn phía trên .InvokeScript - mặc dù nếu bạn phải chọn, tôi sẽ sử dụng InvokeScript như một kế hoạch đầu tiên, nhưng cái mà tôi đã cung cấp cũng làm việc với các phiên bản trước của .NET của điều khiển WB. Hy vọng tất cả sẽ tốt đẹp cho bạn đời, cổ vũ, Erx. –

1

Vâng, đó có lẽ là cách nhanh nhất để làm điều đó, bởi vì 'invokescript' chỉ đơn giản là cần phải được đưa ra một tên của một chức năng toàn cầu. Vì vậy, sau khi đẩy các chức năng xuống sâu hơn vào một số cấu trúc, và vẫn có thể gọi chúng thông qua InvokeScript theo cách "đẹp hơn", bạn sẽ phải, ví dụ, viết một GLOBAL wrapper đơn (một 'dispatcher' sẽ là một tên tốt hơn), tương tự như:

function callme(what, args) { 
    var actualfunction = eval(what); // or any other way to parse the 'what' and get a function 
    return actualfunction(args); 
} 

và sau đó gọi nó là:

  • từ JS:

    callme("$.city.venue.onVenueSelected", ..args..) 
    

    (nhưng tôi thực sự không biết lý do tại sao bạn có thể muốn gọi nó từ JS :))

  • và từ CS:

    browser.InvokeScript("callme", new string[]{ "$.city.venue.onVenueSelected", ..args.. }) 
    

cách này, tôi nghĩ bạn sẽ có thể để vượt qua đối tượng như các đối số chức năng trực tiếp, mà không stringifying họ

..nhưng từ kinh nghiệm của tôi, trong> 80% các trường hợp, bạn chỉ cần chuyển một số số và chuỗi đơn giản hoặc cờ thiết lập, vì vậy tất cả những rắc rối đó thường chỉ là mã bloat

2

Đối với những người có thể không biết, bạn ca n cũng sử dụng .execScript trong các phiên bản trước .NET của điều khiển WB và các phiên bản hiện hành/.NET của điều khiển WB. Bạn cũng có thể chọn ngôn ngữ của tập lệnh bạn muốn thực thi, ví dụ: "JScript" hoặc "VBScript".Đây là một trong lót:

WebBrowser1.Document.parentWindow.execScript "alert('hello world');", "JScript"