Вызов функции Javascript из Silverlight - PullRequest
7 голосов
/ 11 февраля 2009

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

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

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

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

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

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

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

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

Ответы [ 6 ]

2 голосов
/ 09 марта 2009

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

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

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

ура!

2 голосов
/ 11 февраля 2009

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>. Добавление ссылки на файл в iframe <head> решило проблему.

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

2 голосов
/ 11 февраля 2009

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

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

alt text

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

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

Используете ли вы где-нибудь атрибут ScriptableType?

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

0 голосов
/ 09 февраля 2011

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

0 голосов
/ 18 июня 2009

Вот как я это делаю. Но я создаю 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 голосов
/ 11 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...