2011-05-08 44 views
0

我檢查這個問題,第一: Calling jQuery Function from Flash什麼是一種有效的方式來調用全球範圍內沒有包裝函數的jQuery插件?

如果我們有以下風格的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); 

而且我們說,我們初始化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

回答

0

最簡單的辦法似乎是包裝你的jQuery代碼內部的基本javascript函數,然後使用外部接口調用頂級功能的閃光燈。我發現這個例子,它是說工作:

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

和Flash腳本里面:

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

來源:

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

+0

Hi Ascension Systems。是的,我想要做的是'避免'把它放到全球範圍內。將它放入全局範圍允許您使用我放入我的問題的第三種方法,但我現在正在查看的元素現在是直接調用jQuery插件的方法,而不是使用包裝器。例如,如果可以使用ExternalInterface('$ .fn.pluginName','initialised',data);我會嘗試,但這是無效的。不幸的是,我可以找到大多數資源使用包裝器,而不是探索它是不可能的還是需要另一種方法。謝謝! – ArcaneErudite3 2011-05-08 11:28:29

+0

好的,如果你找到一個解決方案,一定要把它發佈!問題在於你依賴於Flash ExternalInteface API的限制,這似乎是問題,因爲VM不能(看似)接受這種類型的參數。我相信這就是爲什麼我能找到的所有解決方案都是提供包裝的解決方案。 – 2011-05-08 11:52:25

+0

我會= D我不確定那裏是否有一個,但是我認爲我也可以嘗試爲其他人提供一個明確的問題和答案,幫助他們或者幫助他們實現這個目標,或者幫助他們更快地創建一個全局函數並節省一點時間= D謝謝阿森鬆系統。出於好奇,我想知道是否可以調用這個:window ['functionName']而不是'functionName',出於同樣的原因。任何想法? – ArcaneErudite3 2011-05-08 11:56:47

0

我認爲你可以做這樣的:

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

有點像直接在ExternalInterface.call()中定義(和運行)包裝函數,而不是在頁面的全局空間中定義它。

我還沒有和jQuery插件專門嘗試過,但定義和執行這樣的功能的作品,例如像這樣:

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

另一個我都用過,在這裏看到它在打完我相信,當您要通過ExternalInterface編寫和執行JavaScript時,ActionScript支持嵌入式XML(作爲E4X的一部分),通過在XML CDATA塊中寫入JavaScript代碼,使用換行符和縮進等而不是連接一串JavaScript,然後在ExternalInterface中執行它。()調用(字符串),像這樣:

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

這一個爲我工作,但只是改變「$」爲「jQuery」離開後: – 2011-12-08 15:29:51

0

一些試驗後,我想辦法做到這一點,可靠,而不必有一個全球性的功能正是如此:

(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)調用插件的方法來傳遞參數發送到flash:

$('#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; 
    } 
} 
相關問題