2009-06-24 23 views
19

Etki alanları arasında ExternalInterface aracılığıyla Javascript ve Flash arasındaki iletişimi etkinleştirmeye çalışıyorum. Javascript, SWF ile aynı alanda bulunduğunda harika çalışır. Ama bir durumda, HTML alanı A üzerinde bulunduğu, hem javascript ve flaş alanı B'ye ikamet ben aşağıdakilerin tümünü yapmış:Cross Domain ExternalInterface "NPObject öğesinde hata arama yöntemi"

  • yerleştirme etiketi allowScriptAccess="always" sahiptir (ve nesne gibi bir sahiptir param)
  • Benim SWF dosyasının actionscipt sahiptir Security.allowDomain("*")
  • Benim SWF ayrıca çağırır Security.allowInsecureDomain("*")
  • Hem alan A ve alan B allow-access-from domain="*"
olan bir /crossdomain.xml dosyası var

SWF sayfasında javascript çağırmak mümkün, ama ExternalInterface tarafından maruz işlevleri çağırmak için Javascript kullandığınızda, ben ActionScript 2 yani ExternalInterface.marshallExceptions kullanılamaz

Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.]

olsun.

+0

Birden fazla swf yükleniyor musunuz? Veya etki alanı A'da (HTML ile) swf'nizi etki alanı B'ye yükleyen bir swf mi? –

+0

Alex - İyi nokta, bundan bahsetmedim. B etki alanındaki javascript, B etki alanından bir SWF yükler ve SWF'nin etki alanı B'den ikinci bir SWF yükler. Bu yükleme işe yarıyor gibi görünüyor, ancak emin olamıyorum çünkü SWF ile etkileşimde bulunamıyorum. – Josh

cevap

20

Sen çalışması için iki şey sadece gerektiğinde AS2'de System.security.allowDomain() - AS3 veya yukarıda yazdığınızlarla aynı değil. Yukarıdaki 2, domainA'daki html sayfasının, etki alanıB'deki swf dosyasında bir şeyler çağırmasına izin verir.

Tarayıcınız domainA'da gömdüğünden, js'nin barındırıldığı etki alanı burada önemli değildir, betik domainA'da yürütülür.

crossdomain.xml temel olarak yalnızca yapmadığınız uzak dosyaları yüklemek içindir, böylece isterseniz bunu kaldırabilirsiniz. (ve muhtemelen ana etki alanınızda oturan allow="*" ile bir crossdomain.xml dosyasının olmasını istemiyorsunuz, bu çok kötü bir uygulama)

+1

garip bir şey. SWF ve JS/HTML'm her ikisi de aynı sayfada bulunuyor, ancak bu istisna hala mevcut :( – DataGreed

1

Birden fazla sayıda swfs yüklediğiniz için, yüklenen B etki alanındaki bu swfs'lerin her birine güvenlik ayarlarını eklemeniz gerekebilir.

Ayrıca, uygun güvenlik ayarlarına sahip bir yükleyici içeriğine de gereksinim duyabilirsiniz.

1) allowscriptaccess=always swf sayfa

2) olduğunu System.security.allowDomain("yourhtmldomain.com");

Not dışarı şeyler göndermek için izin verir:

import flash.system.LoaderContext; 
import flash.system.ApplicationDomain; 
import flash.system.Security; 
import flash.system.SecurityDomain; 
import flash.net.URLRequest; 
import flash.net.URLLoader; 

var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain, (Security.sandboxType == Security.REMOTE) ? SecurityDomain.currentDomain : null); 
var l:Loader = new Loader(); 
l.load(new URLRequest("http://example.com/myswf.swf"), context); 
+0

Merhaba, Güvenlik sorunu NULL dışında bir şey girmeye çalıştı her zaman, aynı sorun var Bir hata alıyorum: Hata # 2114: Parametre LoaderContext.securityDomain null olmalıdır. Herhangi bir öneriniz var mı? –

0

Aynı sorunu yaşadım (allowDomain vb. Iyi idi), ancak flash parametresine flash gönderdim - ajax çağrısından sadece JSON çıktı. Sorun gitti, jsonu "" 'ya koyup javascript nesnesine (jQuery.parseJSON yoluyla) ayrıştırdım.

http sunucusu hedefe SWFObject (flash) dosyası yazmak için izin değil yok alanları arası erişim

çözüm vardır: Benim için

1

birkaç nedeni (i Uploadify kullanıyorum) idi: html nesne etiketi allowScriptAccess'in = "always" Bu gibi set param yapılabilir olmalıdır

$('#file_upload').uploadifySettings('scriptAccess', 'always') 
than flash object must have: 
import flash.system.Security; 
Security.allowDomain('remotedomain.com'); 
bu param ile derleme kaynak tarafından yapılabilir

i var bunun ile bana yazın gerekiyorsa, o Uploadify konu. Flaş sayfasına dahil Uzaktan sunucu Daha , gibi içerikle kök crossdamoin.xml dosyasında olması gerekir: Ben yükleyici div içeren DOM öğesini değiştirerek çünkü Benim durumumda

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
0

, öyleydi.

Yükleyiciyi içeren div öğesini gizlemek için jquery hide() işlevini kullandım ve yukarıdaki hataya neden olduğunu fark ettiğimde, div'in "float" özelliğini ayarladığım farklı bir yaklaşım denedim. Her iki durumda da, yükleyiciyi kırdı.

FWIW, yükleyiciyi içeren div dosyasının genişliğini/yüksekliğini 0 olarak ayarlamanın hatayı yapmasına neden OLMAYACAĞI.

+1

n.b., Flash görünenin ne zaman gerçekleştiğinin farkındadır, bu nedenle DOM yoluyla görünmez bir film oluşturmak Flash uygulamasını derhal durdurabilir. –