Mümkün olduğunca spesifik ve ayrıntılı olacağım ve kullanıyorum kodun bazılarını dahil edeceğim. Zaten bir arama yaptım ve benzer görünen this question'u buldum; Ancak yazar 3 yerine ActionScript 2 kullanıyordu ve kendi durumuma verdiğim cevaplardan herhangi birini etkili bir şekilde uygulayamadım.Bu çapraz etki alanı ActionScript 3 hatasını nasıl düzeltirim?
Aynı etki alanı sınırlamalarının üstesinden gelmek için JavaScript'in XMLHttpRequest nesnesinin Flash/ActionScript 3 aracılığıyla davranışını (sınırlı bir şekilde) taklit etmeye çalışıyorum. Ancak, ActionScript'in bu konuda kendi sınırlamalarına sahip olduğunu keşfediyorum. Yanılmış olabileceğimi itiraf ediyorum ama anladığım kadarıyla, tüm izinleri doğru aldığınız sürece, bu tür bir etki alanları arası komut dosyasını ActionScript kullanarak yapmak hala teorik olarak mümkündür. Ve bu yüzden başım belaya giriyor.İlk olarak, AjaxRequest adlı bir sınıf için /ajax/AjaxRequest.as
olarak kaydettiğim bazı açık kaynaklı kodları ödünç aldım. Daha sonra, /jsajax.swf
numaralı son SWF dosyasına dışa aktarılan /jsajax.fla
adlı bir Flash dosyası oluşturdum.
import ajax.AjaxRequest;
Security.allowDomain("domainone.com");
Security.allowDomain("domaintwo.com");
function jsAjax(stringURL:String, stringMethod:String, stringData:String):void
{
var xhr:AjaxRequest = new AjaxRequest(stringURL);
xhr.contentType = "application/x-www-form-urlencoded";
xhr.dataFormat = URLLoaderDataFormat.TEXT;
if (stringMethod.toUpperCase() == "POST") {
xhr.method = URLRequestMethod.POST;
} else {
xhr.method = URLRequestMethod.GET;
}
xhr.addEventListener("complete", jsAjaxResponse);
xhr.send(stringData);
return;
}
function jsAjaxResponse(evt:Event):void
{
ExternalInterface.call("jsAjaxResponse", evt.currentTarget.data.toString());
return;
}
ExternalInterface.addCallback("jsAjax", jsAjax);
ExternalInterface.call("jsAjaxReady");
Şimdiye kadar iyi: Şimdi, işte Flash dosyasının ilk ve tek çerçeve içermektedir ActionScript kodu var. Bu Security.allowDomain
çağrılarının birine veya daha fazlasına ihtiyaç duyulmadığını hissediyorum, ancak bu sorunu çözmeye çalışmak için benim başarısız (başarısız) denemelerim vardı.
Benim JavaScript'imde tanımlı üç işlev var: jsAjax
, jsAjaxResponse
ve jsAjaxReady
. Sonuncusu, Flash nesnesinin başarıyla yüklendiğini belirtmek için kullanılan çok temel bir işlevdir (ki bu sadece yükleme sırasında hemen bir kez ve hemen çağrılır), diğer ikisi ise veri göndermek ve almak için kullanılır. Gördüğünüz gibi, karşılık gelen ActionScript muadilleri var.
Son olarak, bu SWF dosyasını (swfobject kullanarak), yerleştirmeler ve jsAjax
işlevini çağırmak için basit form denetimleri bir çift vardır /test.html
denilen basit bir HTML sayfası oluşturduk. Tüm JavaScript tanımlarım da bu HTML dosyasına gömülü. Ayrıca, $_REQUEST
dizisinin içeriğini basan /test.php
adlı çok basit bir PHP betiği oluşturdum. Bu ajax yöntemini kullanarak talep etmeyi planladığım komut dosyası.
ben test üç senaryo vardır, ama çalışma ikisini almak için tek başardı: Ben bu dosyaların tümü yüklerseniz bir sunucuya
tüm:
SENARYO BİRİNCİ domainone.com ve test.php isteği, iyi çalışıyor. Benim dosya/klasör yapısı daha sonra şuna benzer: Bu çalışır
domainone.com/jsajax.swf
domainone.com/test.html
domainone.com/test.php
Yine
, . JsAjaxResponse işlevi, verileri yalnızca test.php'den geri alır.
SENARYO İKİ: Her iki sunucularda, sol eğilerek ilk sunucuya HTML ve SWF yüklenen ve daha sonra sadece o değil mi, ikinci sunucuda PHP komut dosyası aramasını
hemen çalış. Bazı kazma yaptım ve domaintwo.com üzerinde domainone.com adresine erişim sağlayan bir crossdomain.xml
dosyası oluşturarak bunu düzeltdi.Yani benim dosya/klasör yapısı şuna benziyordu:
domainone.com/jsajax.swf
domainone.com/test.html
domaintwo.com/test.php
domaintwo.com/crossdomain.xml
açıkça bu çalışır Crossdomain.xml dosyasında domainone.com izin yaparken. Yine, jsAjaxResponse işlevi, verileri yalnızca test.php'den geri alır.
SENARYO ÜÇ: Ben domaintwo.com HTML ama Yüklenen tüm zaman hem sunucularda, eğilerek sağ
, artık işe alabilir. Başka bir deyişle, domainone.com HTML domaintwo.com barındırılan bir SWF dosya başvuran olur ve bu SWF dosyası domaintwo.com bir istek yapmaya çalışıyor. Her halükarda, senaryo 2'den aynı crossdomain.xml dosyasını bıraktım. Benim dosya/klasör yapısı şuna benziyordu:
domainone.com/test.html
domaintwo.com/jsajax.swf
domaintwo.com/test.php
domaintwo.com/crossdomain.xml
Bu benim çalışma alamadım tek durum olduğunu ve bu Çalışmaya almak gerekir böyledir. İlk ikisi, sadece senaryonun çalışıp çalışmadığını görmek için test senaryolarıydı. Benim burada jsAjax işlevini çalıştırmayı denediğimde, Firebug iki kez görünür bir hata ile rüzgar:
uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].
uncaught exception: Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.].
Yardım! Senaryo 3'te nasıl çalıştırabilirim?