2012-11-29 11 views
9

To jest moje pierwsze pytanie na Stack Overflow. Nie po raz pierwszy chciałem go napisać, ale zazwyczaj znajduję rozwiązanie za pomocą paska wyszukiwania, tym razem nie. Problem, z którym się zmagam jest trochę skomplikowany, więc postaram się być tak dokładny, jak to tylko możliwe.Flash AS3 - renderuj html przez ExternalInterface

Zasadniczo dodajemy chińskie płatności do istniejącego już e-commerce we Flashu. Cała strona jest w AS3, osadzona za pomocą SWFObject, już używa ExternalInterface do innych rzeczy.

Ta nowa chińska metoda płatności jest nieco staroświecka, więc mają dziwny sposób obsługi płatności. Po wysłaniu POST na ich serwery z wszystkimi szczegółami zamówienia, odpowiadają one na stronie HTML. Mój problem polega na renderowaniu tej strony, biorąc pod uwagę, że otrzymuję ją wewnątrz Flasha.

Rozwiązanie, które próbuję w tej chwili działa częściowo, co oznacza, że ​​jestem w stanie zobaczyć stronę, ale chińskie znaki, które powinny znajdować się na stronie, źle się wyświetlają. Zamiast chińskich znaków widzę dziwne postacie, więc domyślam się, że musi wystąpić problem z kodowaniem, kiedy przekazuję kod HTML z Flasha do Javascript. Jest to, jak ja to robię:

AS3:

//extract html page from response 
var newHTML:String = e.currentTarget.data; 
//trim whitespace to avoid javascript error 
newHTML = newHTML.replace(/\n/g, ''); 
newHTML = newHTML.split("\r").join(""); 

if(ExternalInterface.available) 
    ExternalInterface.call("chinesePayment('"+newHTML+"')"); 
else 
    trace("External interface error"); 

Javascript:

function chinesePayment(param) { 
    var newWindow = window.open(); 
    //var unescaped = unescape(param); 
    newWindow.document.write(param); 
} 

Próbowałem ingerować unescape, ucieczka, URIencoding ale bez powodzenia, tak ja Naprawdę mam nadzieję, że możesz mi pomóc tutaj!

Dzięki, Domenico

EDIT:

Chciałbym tylko wspomnieć, że jestem otrzymania poprawnej strony HTML z ich serwerów. Próbowałem już zapisać stronę lokalnie, kopiując kod HTML bezpośrednio z odpowiedzi serwera i wyświetlenia strony. Oznacza to, że w procesie przekazywania strony z AS3 do Javascript musi być coś nie tak.

EDIT2 ważne:

zdałem sobie sprawę, że problem leży w kodowaniu podręcznego. Kiedy skopiuję kod HTML z wyskakującego okienka, wklej go do edytora i zapisz, mogę poprawnie wyświetlić kod HTML. Wygląda na to, że popup nie uwzględnia kodowania gbk. Teraz szukam rozwiązania tego problemu.

+0

Jeśli zrzucasz te dane za pomocą polecenia FileReference, a następnie otwierasz je jako HTML, czy działa poprawnie w przeglądarce? – Vesper

+0

Nie próbowałem tego, również dlatego, że nie może to być ostateczne rozwiązanie. Widząc, jak ta strona otrzymuje dużo zamówień, chciałbym uniknąć tworzenia statycznych stron dla każdego zamówienia. W każdym razie próbowałem wstawić punkt przerwania w pamięci flash, kopiując kod HTML i wklejając go do edytora. Kiedy zapisałem ten plik, renderowałem go poprawnie, więc html jest w porządku do tego czasu. Spróbuję tego rozwiązania, aby sprawdzić, czy działa, a następnie poinformować, jak to działa. – aberonni

+0

Nie, chodzi mi o sprawdzanie, czy otrzymujesz poprawną stronę HTML i czy ma ona poprawnie ustawione wszystkie metadane i inne rzeczy. Jeśli zostanie poprawnie utworzony w przeglądarce, jeśli zostanie przesłany za pośrednictwem pliku, otrzymasz poprawny kod HTML i będziesz musiał dalej przekopywać się do JS obsługujących łańcuchy HTML - nie mam wiedzy o tym, czy coś może się nie udać w procesie. Jeśli nie, to albo otrzymasz błędny/niekompletny HTML, albo nie masz czcionek w swoim systemie, albo istnieje inna nie-programowa przyczyna obserwowanego zachowania. – Vesper

Odpowiedz

2

W końcu znalazłem rozwiązanie !!!!

Zasadniczo musiałem renderować chińskie znaki w pamięci flash, aby po przekazaniu ich do javascript były już zakodowane. Więc przede wszystkim musiałem zmienić typ URLLoaderDataFormat dwuskładnikowych, abym otrzymał tablicaBitowa:

my_loader.dataFormat = URLLoaderDataFormat.BINARY; 

Raz dostałam odpowiedź, że zmodyfikował kod w ten sposób:

 var bytes:ByteArray = e.currentTarget.data; 
     var newHTML:String = bytes.readMultiByte(bytes.length,"gb2312"); 
     //trim whitespace to avoid javascript error 
     newHTML = newHTML.replace(/\n/g, ''); 
     newHTML = newHTML.split("\r").join(""); 

     if(ExternalInterface.available) 
      ExternalInterface.call("chinesePayment('"+newHTML+"')"); 
     else 
      trace("External interface error"); 

jak można zobacz, dzięki specjalnej funkcji byteArray mogę odczytać odpowiedź za pomocą preferowanego zestawu znaków, a teraz działa!

Javascript pozostał taki sam, bez unescape lub podobnych.W ten sposób funkcja javascript otrzymała ciąg znaków z chińskimi znakami, a nie z odpowiednimi znakami UTF.

Dziękuję wszystkim, że pomogliście mi znaleźć rozwiązanie!

Powiązane problemy