2009-02-10 3 views
7

Я пытаюсь вызвать функцию javascript (в нашем коде) из элемента управления silverlight. Я пытаюсь вызвать функцию с помощью:Вызов функции Javascript от Silverlight

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

и я получаю сообщение об ошибке «Не удалось Invoke: showPopup»

я могу назвать HtmlPage.Window.Invoke("alert", new string[]{"test"}); без проблем, но не свою собственную функцию.

Я также могу открыть эту страницу в инструментах разработчика IE и вручную позвонить showPopup("http://www.example.com"), и она работает как ожидалось.

Так работает функция js, а бинарник Silverlight может найти другие js-функции. Что мне здесь не хватает?

Дополнительные примечания:

  • Вызов функции в обработчик события нажатия кнопки, так что происходит после того, как страницы (и сценарий), были загружены)
+0

Любая идея, почему я не могу сделать HtmlPage.Window.Invoke ("document.getElementById (\" LogoutButton \ "). Click();")? –

ответ

2

Aha! Я понял. Наше приложение использует IFRAME, так тонированное HTML выглядит как этот

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

И Silverlight управления в вопросе находится в IFRAME. Проблема заключалась в том, что файл, содержащий функцию showPopup, ссылался на внешний <head> (почему я мог бы вызвать эту функцию с помощью панели инструментов IE), но не внутренний <head>. Добавление ссылки на файл в in-the-iframe <head> решило проблему.

Отклонено, но спасибо за помощь.

0

Убедитесь, что ваш скрипт полностью загружен, прежде чем пытаться вызвать из него функции.

+0

Все это происходит после загрузки страницы (и всех скриптов). Отредактировал вопрос, чтобы отразить это. Спасибо хоть. – Ryan

2

Является ли функция showPopup javascript на той же странице html или aspx, что и элемент управления Silverlight? Вы, как правило, получить «Не удалось Invoke ...» ошибка, если Javascript функция не существует:

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

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

Какой браузер вы используете, когда вы получаете эту проблему?

Вы используете последнюю версию Silverlight?

Вы используете приложение ScriptableType attrbiute где угодно?

Можно ли перечислить код на короткую, но полную программу, которая вызывает эту проблему случиться на вашей машине ...

2

Фактически ссылка на сценарий снова из iframe не является наиболее эффективным способом ссылки на код, содержащийся в родительском. Если ваша функция называется «showPopup», вы можете вставить это в IFRAME:

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

и вуаля. Объяснение этому состоит в том, что все «глобальные» функции и объекты являются частью этого «глобального пространства имен» ... который является «оконным» объектом.Поэтому, если вы пытаетесь получить доступ к «глобальным» функциям от ребенка, вам нужно либо вызвать функцию родителя (например, parent.showPopup («....»)), либо объявить локальный псевдоним для него (который что мы делаем в приведенном выше примере).

Cheers!

0

Вот как я это делаю. Но я создаю Silverlight без визуальной студии. Я просто имею сырые html, xaml и js (javascript). Обратите внимание MouseLeftButtonUp и это значение "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

У меня была такая же проблема в VS 2010 с SL 4. Я создал несколько методов и поместил их в один JS-файл. Однако этот файл не был добавлен в главный раздел файла ASPX. Добавление его решило проблему. Разница в том, что, хотя у меня не было отдельной секции заголовка в iframe, у меня была проблема, и она была решена.

Смежные вопросы