2012-11-29 42 views
9

Đây là câu hỏi đầu tiên của tôi về Stack Overflow. Đây không phải là lần đầu tiên tôi muốn viết một, nhưng thường tôi tìm thấy một giải pháp bằng cách sử dụng thanh tìm kiếm, lần này thì không. Vấn đề tôi giải quyết là một chút phức tạp vì vậy tôi sẽ cố gắng và kỹ lưỡng như possibile.AS3 Flash - hiển thị html qua ExternalInterface

Về cơ bản, chúng tôi đang thêm các khoản thanh toán của Trung Quốc vào một thương mại điện tử đã có sẵn trong Flash. Toàn bộ trang web nằm trong AS3, được nhúng bằng SWFObject, đã sử dụng ExternalInterface cho những thứ khác.

Phương thức thanh toán mới của Trung Quốc này hơi lỗi thời, vì vậy họ có cách xử lý thanh toán lạ. Khi chúng tôi đã gửi POST tới máy chủ của họ với tất cả các chi tiết đơn đặt hàng, họ sẽ phản hồi bằng một trang HTML. Vấn đề của tôi là hiển thị trang này, xem xét rằng tôi nhận được nó bên trong Flash.

Giải pháp tôi đang cố gắng tại thời điểm này hoạt động một phần, có nghĩa là tôi có thể xem trang, nhưng các ký tự Trung Quốc được cho là nằm trong trang đang hiển thị xấu. Thay vì các ký tự Trung Quốc, tôi thấy các ký tự lạ, vì vậy tôi đoán có phải là một vấn đề mã hóa khi tôi chuyển HTML từ Flash sang Javascript. Đây là cách tôi đang làm nó:

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); 
} 

Tôi đã thử rối tung lên với unescape, trốn thoát, URIencoding nhưng không có bất kỳ thành công, vì vậy tôi thực sự hy vọng bạn có thể giúp tôi ở đây!

Cảm ơn, Domenico

EDIT:

tôi chỉ muốn đề cập đến mà tôi nhận được một trang HTML đúng từ các máy chủ của họ. Tôi đã thử lưu trang cục bộ, sao chép mã HTML trực tiếp từ phản hồi của máy chủ và lượt xem trang chính xác. Điều đó có nghĩa là phải có điều gì đó sai trong quá trình chuyển trang từ AS3 sang Javascript.

EDIT2 quan trọng:

tôi đã nhận ra rằng vấn đề đặt trong mã hóa popup. Khi tôi sao chép HTML từ cửa sổ bật lên, dán nó vào trình chỉnh sửa và lưu nó, tôi có thể xem HTML một cách chính xác. Có vẻ như cửa sổ bật lên không xem xét mã hóa gbk. Tôi đang tìm một giải pháp cho vấn đề này.

+0

Nếu bạn đổ dữ liệu đó thông qua nói FileReference, sau đó mở nó dưới dạng HTML, nó có hoạt động đúng trong trình duyệt không? – Vesper

+0

Tôi chưa thử điều đó, bởi vì đây không phải là giải pháp cuối cùng. Thấy như trang web này nhận được rất nhiều đơn đặt hàng tôi muốn tránh tạo các trang tĩnh cho mỗi đơn đặt hàng. Nhưng dù sao tôi đã thử chèn một điểm ngắt trong flash, sao chép html và dán vào trình chỉnh sửa. Một khi tôi lưu tập tin đó nó đã được dựng hình đúng cách, do đó html là tốt cho đến khi có. Tôi sẽ thử giải pháp này chỉ để xem nó có hoạt động hay không, sau đó cho bạn biết nó hoạt động như thế nào. – aberonni

+0

Không, ý tôi là thử nghiệm xem bạn có nhận được trang HTML chính xác hay không và liệu nó có tất cả siêu dữ liệu được đặt chính xác hay không và các nội dung khác. Nếu nó được định dạng chính xác trong trình duyệt nếu được chuyển qua tệp, thì bạn nhận được một mã HTML chính xác và bạn cần đào sâu vào JS xử lý chuỗi HTML hơn nữa - Tôi không có kiến ​​thức về việc liệu có trục trặc nào trong quá trình. Nếu không, sau đó bạn nhận được một HTML không chính xác/không đầy đủ, hoặc bạn thiếu phông chữ trên hệ thống của bạn, hoặc có một số nguyên nhân không lập trình khác của hành vi bạn quan sát. – Vesper

Trả lời

2

Cuối cùng tôi đã tìm được giải pháp !!!!

Về cơ bản tôi đã phải hiển thị các ký tự tiếng Trung trong flash để khi tôi chuyển chúng sang javascript, chúng đã được mã hóa. Vì vậy, trước hết tôi phải thay đổi kiểu của URLLoaderDataFormat để Binary vì vậy mà tôi nhận được một ByteArray:

my_loader.dataFormat = URLLoaderDataFormat.BINARY; 

Khi tôi nhận được câu trả lời tôi sửa đổi mã theo cách này:

 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"); 

Như bạn có thể thấy, nhờ vào một hàm byteArray cụ thể, tôi có thể đọc phản hồi bằng cách sử dụng bảng mã ưa thích, và bây giờ nó hoạt động!

javascript vẫn giữ nguyên, không có cảnh báo hoặc similars.Bằng cách này, hàm javascript nhận được một chuỗi ký tự với các ký tự Trung Quốc trong đó, không phải với các ký tự utf tương đương.

Nhờ tất cả mọi người, bạn đã giúp tôi tìm ra giải pháp!

Các vấn đề liên quan