2009-02-10 45 views
7

Tôi đang cố gắng gọi một hàm javascript (trong mã của chúng tôi) từ một điều khiển màu bạc. Tôi đang cố gắng để gọi hàm qua:Gọi chức năng Javascript từ Silverlight

HtmlPage.Window.Invoke("showPopup", new string[] { "http://www.example.com" });

và tôi nhận được lỗi "Không thể Gọi: showPopup"

tôi có thể gọi HtmlPage.Window.Invoke("alert", new string[]{"test"}); mà không vấn đề, nhưng không phải là chức năng của riêng tôi.

Tôi cũng có thể mở trang được đề cập trong các công cụ dành cho nhà phát triển IE và gọi theo cách thủ công showPopup("http://www.example.com") và hoạt động như mong đợi.

Vì vậy, chức năng js hoạt động và nhị phân Silverlight có thể tìm các hàm js khác. Tôi đang thiếu gì ở đây?

Ghi chú thêm:

  • Cuộc gọi chức năng là trong một xử lý sự kiện nhấn nút, vì vậy nó sẽ xảy ra sau khi trang (và kịch bản) đã được nạp)
+0

Bất kỳ ý tưởng nào tại sao tôi không thể làm HtmlPage.Window.Invoke ("document.getElementById (\" LogoutButton \ "). Click();")? –

Trả lời

2

Aha! Tôi đã hiểu rồi. Ứng dụng của chúng tôi sử dụng khung nội tuyến, vì vậy html được hiển thị trông như thế này

<html> 
<head></head> 
<body> 
Stuff 
<iframe> 
    <html> 
     <head></head> 
     <body>Other Stuff</body> 
    </html> 
</iframe> 
<body> 
</html> 

Và điều khiển Silverlight được đề cập nằm trong khung nội tuyến. Vấn đề là các tập tin có chứa các chức năng showPopup đã được tham chiếu trong bên ngoài <head> (lý do tại sao tôi có thể gọi chức năng với thanh công cụ IE) nhưng không phải là bên trong <head>. Việc thêm tham chiếu vào tệp trong khung nội tuyến <head> đã giải quyết được sự cố.

Sắp xếp của anticlimactic, nhưng cảm ơn tất cả sự giúp đỡ.

0

Hãy chắc chắn rằng kịch bản của bạn là được nạp đầy đủ trước khi thử gọi các hàm từ nó.

+0

Tất cả điều này xảy ra sau khi trang (và tất cả các tập lệnh) đã được tải. Đã chỉnh sửa câu hỏi để phản ánh điều này. Cảm ơn mặc dù. – Ryan

2

Chức năng javascript showPopup trên cùng một trang html hoặc aspx có phải là điều khiển Silverlight không? Bạn sẽ thường được các "Không Gọi ..." lỗi nếu chức năng javascript không tồn tại:

HtmlPage.Window.Invoke("functionThatDoesNotExist", new [] { "Testing" }); 

alt text http://www.freeimagehosting.net/uploads/3ed38e3ce8.png

trình duyệt bạn đang sử dụng khi bạn đang nhận được vấn đề này là gì?

Bạn đang sử dụng phiên bản Silverlight mới nhất?

Bạn có sử dụng thuộc tính ScriptableType ở bất kỳ đâu không?

Có thể liệt kê mã cho chương trình ngắn nhưng đầy đủ gây ra sự cố này xảy ra trên máy của bạn không ...

2

Thực tế việc tham chiếu lại tập lệnh từ khung nội tuyến không phải là cách hiệu quả nhất để tham chiếu mã có trong phần tử gốc. Nếu chức năng của bạn được gọi là "showPopup", bạn có thể chèn chức năng này vào iframe của mình:

<script type="text/javascript"> 
    var showPopup = parent.showPopup; 
</script> 

Và điều chỉnh. Lời giải thích cho điều này là tất cả các hàm và đối tượng "toàn cầu" là một phần của "không gian tên chung" này ... là đối tượng "cửa sổ".Vì vậy, nếu bạn đang cố gắng truy cập các chức năng "toàn cầu" từ một đứa trẻ, bạn cần phải gọi hàm trên cha mẹ (ví dụ: parent.showPopup ('....')) hoặc khai báo một bí danh cục bộ cho nó (đó là những gì chúng tôi làm trong ví dụ trên).

Chúc mừng!

0

Đây là cách tôi thực hiện. Nhưng tôi đang tạo ra Silverlight mà không có studio trực quan. Tôi chỉ có html thô, xaml và js (javascript). Chú ý MouseLeftButtonUp và giá trị của nó "LandOnSpace"

 <Canvas x:Name="btnLandOnSpace" Background="LightGreen" MouseLeftButtonUp="LandOnSpace" 
      Cursor="Hand" Canvas.Top ="0" Width="70" Height="50"> 
      <TextBlock Text="LandOnSpace" /> 
      </Canvas> 

function LandOnSpace(sender, e) { //on server 
if (!ShipAnimateActive && !blnWaitingOnServer) { 
    blnWaitingOnServer = true; 
    RunServerFunction("/sqgame/getJSLLandOnSpace"); 
     ShowWaitingBox(); 
     }; 
else { 
    alert('Waiting on server.'); 
}; 

}

0

Tôi đã gặp vấn đề tương tự trong VS 2010 với SL 4. Tôi đã tạo một vài phương pháp và đặt chúng vào một tệp JS duy nhất. Tuy nhiên tệp này chưa được thêm vào phần đầu của tệp ASPX. Thêm nó đã giải quyết được vấn đề. Sự khác biệt là mặc dù tôi không có phần đầu riêng trong iframe, tôi đã gặp sự cố và nó đã được giải quyết.

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