Как эффективный способ вызова плагинов jQuery без функции-оболочки в глобальной области видимости из Flash? - PullRequest
0 голосов
/ 08 мая 2011

Сначала я проверил этот вопрос: Вызов функции jQuery из Flash

если у нас есть плагин jQuery следующего стиля:

(function(){
 $.fn.pluginName = function () {
   var methods = {
     init: function ( options ) {
       var settings = $.extend( {}, {}, options ); // set your own defaults

       $('#flash')[0].initialise(settings);
     },
     initialised: function ( params ) {
       console.log(params);
     }
   };
   var method = 'init', args = [];
   if(0 < arguments.length) {
     if('object' === typeof(arguments[0])) {
       args = arguments;
     } else if('undefined' !== typeof(methods[arguments[0])) {
       args = Array.prototype.slice.call(arguments);
       args.shift();
       method = arguments[0];
     }
     methods[ method ].apply( this, args );
   }
   return this;
 };
})(jQuery);

И скажем, мы инициализируем встроенный flash-объект с id = "flash" и затем вызываем:

$('#controller').pluginName('init',{});

и дождитесь, пока вспышка перезвонит.

Если бы я написал функцию, например ::

function flashCallBack( data ) {
 $('#controller').pluginName('init',data);
}

тогда я мог бы зарегистрировать эту функцию в AS3, но есть ли способ вызвать метод плагина непосредственно для соответствующего объекта без необходимости писать функцию-оболочку, такую ​​как описанная выше, в глобальном пространстве имен?

Это не сработало:

ExternalInterface.call("$('#controller').pluginName('initialised',"+data+")");

как строка с именем функции на флэш-памяти, а также:

ExternalInterface.call("$('#controller').pluginName('initialised')",data);

Может ли кто-нибудь указать мне правильное направление, как этот вызов может быть сделан напрямую, или уточнить, если это просто не поддерживаемая операция?

Доброе спасибо :) AE

Ответы [ 3 ]

0 голосов
/ 09 мая 2011

Я думаю, вы можете сделать это так:

ExternalInterface.call("function() { $('#controller').pluginName('initialised',"+data+"); }");

Вроде как определение (и запуск) функции-оболочки непосредственно в ExternalInterface.call (), а не определение ее в глобальном пространстве на странице.

Я не пробовал это специально для плагинов jQuery, но определение и выполнение таких функций работает, например, так:

ExternalInterface.call("function() { alert('Hello World!') }");

Другой трюк Я использовал, увидев его здесь, в SO, я считаю, использовать тот факт, что ActionScript поддерживает встроенный XML (как часть E4X), когда вы хотите написать и выполнить JavaScript таким образом. через ExternalInterface, написав код JavaScript внутри блока XML CDATA, с разрывами строк и отступами и т. д. вместо конкатенации строки JavaScript, а затем выполните ее в ExternalInterface.call () (в виде строки), например так:

var checkBrowser:XML = <![CDATA[
function() { 
    return {name:navigator.appName, version:navigator.appVersion};
}
]]>;

var browser:Object = ExternalInterface.call(checkBrowser);

trace("Browser: " + browser.name + ", version: " + browser.version);
0 голосов
/ 15 мая 2011

После некоторых экспериментов я думаю, что способ сделать это, надежно, без необходимости иметь глобальную функцию, таким образом:

(function(){
 $.fn.pluginName = function () {
   var methods = {
     init: function ( options ) {
       var settings = $.extend( {}, {}, options ); // set your own defaults

       $('#flash')[0].initialise(settings);
       $(this).click(function(){
          $(this).pluginName('fromFlash');
       });
     },
     initialised: function ( params ) {
       console.log(params);
     },
     callFlash: function(subj,func, data){
        if($('#flash').length > 0){
           $('#flash')[0].callback({
               subj: (subj || 'subjectName'),
               message: {
                  func: (func || '$(\'#selector\').trigger'),
                  data: (data || 'click')
               }
           });
        }
    },
    fromFlash: function(data){
       alert('called from flash');
       console.log(data);
    }
   };
   var method = 'init', args = [];
   if(0 < arguments.length) {
     if('object' === typeof(arguments[0])) {
       args = arguments;
     } else if('undefined' !== typeof(methods[arguments[0])) {
       args = Array.prototype.slice.call(arguments);
       args.shift();
       method = arguments[0];
     }
     methods[ method ].apply( this, args );
   }
   return this;
 };
})(jQuery);

1) Вызвать метод плагина для передачи его параметров для отправки на флэш:

$('#plugin').pluginName('callFlash','subjectName',{
    func:'$(\'#plugin\').trigger',
    data: 'click'
});

или вы можете сделать что-нибудь более веселое, как это:

$('#plugin').pluginName('callFlash','subjectName',{
    func: '$(\'#plugin\')[\'pluginName\']',
    data: 'fromFlash'
});

2) Вызвать эту строку из flash как строку функции внешнего обратного вызова.

public function callback ( msg: Object ): void {

    data[0] = msg.message.data; // function callback name
    data[1] = someValue; // from inside flash

    switch ( msg.subject ) {
        case "subjectName":
                    // should push an array to the method name of the jquery plugin
            ExternalInterface.call (msg.message.func, data);
        break;
    }
}
0 голосов
/ 08 мая 2011

Самое простое решение - заключить код jquery в базовую функцию javascript, а затем вызвать эту функцию верхнего уровня из флэш-памяти с помощью внешнего интерфейса. Я нашел этот пример, и он сказал, что работает:

function showNeck () { 
   $('.neck').highlightFade({color:'#FFFF… speed: 5000}); 
} 

А внутри флеш скрипта:

import flash.external.*; 
ExternalInterface.call("showNeck", ""); 

Источник:

http://old.nabble.com/Call-Jquery-from-Flash--td24959832s27240.html

...