Как исправить ошибку: «NPMethod вызван для не-NPObject-обернутого JSObject»? - PullRequest
3 голосов
/ 17 марта 2010

HI

Я пытаюсь вызвать метод, определенный во флэш-объекте из JavaScript (firefox-3.0 / Linux) и получение исключения: "NPMethod вызван не- NPObject JSPbject ".

Если я использую eval для window.document.flash_object.func (), он выдает «NPMethod вызвал JSObject, не являющийся объектом NPObject».

Где как, если я определю функцию javascript на стороне страницы, как указано ниже: * * 1007

function myFunc () { return flash_object.func ();

}

и позже сделайте eval из window.document.myFunc (), он отлично работает.

Я выполняю два теста через тестовую среду под названием Selenium. [eval (window.document.flash_object.func ()) и Eval (window.document.myFunc ())].

Проблемы, похоже, связаны с вызовом метода flash-объекта без передачи ссылки "this". Вот пример html / js-кода для воспроизведения этой проблемы: «NPMethod вызван для JSObject, не являющегося NPObject».

<script>
function changeColor() {
  mymovie.changeColor();
}
function getColorNP() {
 var func = mymovie.getColor;
 func();
}
</script>
<button type="button" onclick="getColorNP();">getColorNP</button>
<button type="button" onclick="getColor();">getColor</button>

getColorNP throws the exception
Error: NPMethod called on non-NPObject wrapped JSObject!
Source File: http://my.host/Colors/colors.html
getColorNP throws the exception
Error: NPMethod called on non-NPObject wrapped JSObject!
Source File: http://my.host/Colors/colors.html

Теперь вопрос к гуру javascript: При наличии флэш-объекта и имени метода, как мне вызвать метод для этого объекта. Допустим, функция принимает два аргумента: флэш-объект и имя метода в виде строки. Я хочу сделать eval для object.method () внутри этой функции. Возможно ли это, если да, объясните, пожалуйста, как это можно сделать.

Поскольку метод flash-объекта не является стандартной функцией javascript, я думаю, что невозможно связать функцию через bind (). Есть ли другая альтернатива?

Thx, Chandra

Ответы [ 5 ]

6 голосов
/ 25 ноября 2011

Эта ошибка возникает, когда вы пытаетесь установить функцию flash (собственный код) для некоторой переменной, а затем вызываете эту переменную. В качестве примера возьмем ваши функции:

function getColorNP() { // this will call error
 var func = mymovie.getColor;
 func();
}

function getColorNP() { //this will work
 mymovie.getColor();
}

В любом случае, если вам нужно сохранить функцию флэш-памяти в какую-либо переменную, вы должны обернуть ее лямбда-функцией. Вот так:

function getColorNP() { // this will work also
 var func = function(){mymovie.getColor()};
 func();
}

Так что, когда вы используете функцию flash в javascript, вы не должны тормозить, тогда цепочка ссылок.

1 голос
/ 04 мая 2011

Завершение вызова в закрытие - это нормально (и вам не нужно оценивать)

1 голос
/ 05 июня 2010

Вы смотрели на Вызов обратного вызова Flex / AS3 из Javascript

Я также использую селен, и есть два проекта для поддержки flex / flash:

FlashSelenium: расширение клиентского драйвера Selenium RC, которое позволяет тестовым драйверам клиента Selenium RC вызывать методы ActionScript приложения Flex. FlashSelenium полагается на то, что разработчик вручную предоставляет специальные методы и компоненты приложения Flex. http://code.google.com/p/flash-selenium/

Selenium Flex API: расширение Selenium IDE и механизм, который автоматически предоставляет компоненты пользовательского интерфейса приложения Flex. http://code.google.com/p/sfapi/.

Я недавно начал использовать их и получил ту же проблему, о которой вы упомянули (NPMethod вызывал JSObject, не содержащий NPObject!) При запуске теста в firefox, и кажется, что firefox не позволяет javaScript вызывать Flash, когда JavaScript поступает из другого окна.

В моем случае эта проблема была решена путем вызова selenium с использованием * firefoxproxy.

С уважением,

0 голосов
/ 02 апреля 2014

В этом варианте я получил сообщение об ошибке «NPMethod вызван для не-NPObject-обернутого JSObject» при попытке настроить обработчик фокуса / размытия окна jQuery во Flash следующим образом:

    if (ExternalInterface.available) {
      ExternalInterface.addCallback("on_focus", on_activate);
      ExternalInterface.addCallback("on_blur", on_deactivate);
      ExternalInterface.call("eval", "if ($) $(window).focus($('object')[0].on_focus);");
      ExternalInterface.call("eval", "if ($) $(window).blur($('object')[0].on_blur);");
    }

Исправлено было отложить селектор SWF, добавив дополнительную функцию закрытия:

    if (ExternalInterface.available) {
      ExternalInterface.addCallback("on_focus", on_activate);
      ExternalInterface.addCallback("on_blur", on_deactivate);
      ExternalInterface.call("eval", "if ($) $(window).focus(function() { $('object')[0].on_focus() });");
      ExternalInterface.call("eval", "if ($) $(window).blur(function() { $('object')[0].on_blur() });");
    }
0 голосов
/ 08 ноября 2011
function callFlash(domobj, method_name){
    domobj[method_name]()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...