2011-03-01 20 views
14

मुझे फ्लैश 10 और बाहरी इंटरफेस के साथ एक बहुत ही मुश्किल समस्या है। मैं वर्तमान में एक घर का बना पुल का उपयोग कर रहा जावास्क्रिप्ट के साथ RTMFP उपयोग करने के लिए और जब भी मैं डेटा कि JSON शामिल पारित करने के लिए प्रयास करते हैं, मैं एक अजीब जावास्क्रिप्ट त्रुटि है कि फ्लैश से आता मिलती है:जब मैं JSON के साथ पैरामीटर पास करता हूं तो बाहरी इंटरफेस ब्रेक क्यों करता है?

missing) after argument list 
try { __flash__toXML(Flash.Utilities.A..."")) ; } catch (e) { "<undefined/>"; } 

यह और अधिक जानकारी प्राप्त करने के लिए के बाद से इस आना नामुमकिन है फ्लैश से और यह किसी भी जावास्क्रिप्ट फ़ाइल से बंधे नहीं है।

इस समस्या को पुन: पेश करने के लिए आप इस स्क्रिप्ट का उपयोग कर सकते हैं:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.external.ExternalInterface; 

    public class Main extends Sprite 
    { 

     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      var test:String; 

      test = "\"\\\"\""; 

      ExternalInterface.call("console.log", test); 
     } 

    } 

} 

मैं इस समस्या से बचने के लिए क्या कर और यह एक ज्ञात समस्या है सकते हैं?

+0

प्रयोग कर रहे हैं 'json_encode'? – kjy112

+0

@ kjy112 नहीं, मुझे लगता है कि बाहरी इंटरफेस.call उस डेटा से ठीक से बचने का ख्याल रखेगा जिसे मैं पास कर रहा हूं। – HoLyVieR

+0

@holyvier http://maccherone.com/larry/projects/a-pretty-json-encoder-for-actionscript-3-as3/ – kjy112

उत्तर

22

यह स्पष्ट रूप से एक ज्ञात मुद्दा है और ऐसा लगता है कि एडोब जल्द ही इसे ठीक करने जा रहा है।

मैं इस समस्या का एक detailled explaination पाया जाता है और मूल रूप से मुद्दा है कि फ्लैश संभाल नहीं करता है लगता है \ और & ठीक से जो जावास्क्रिप्ट को Flash से स्थानांतरण के दौरान जावास्क्रिप्ट त्रुटि या डेटा भ्रष्टाचार हो सकता है।

फ्लैश जब आप जे एस के लिए फ़्लैश में डेटा स्थानांतरित करने के लिए क्या प्रयास करता है निम्नलिखित बात पर अमल करने के लिए है:

try { 
    __flash__toXML(yourJavascriptFunction("[DATA]")) ; 
} catch (e) { "<undefined/>"; } 

समस्या यह कच्चे अपने डेटा डालता है और यह बिल्कुल बैकस्लैश बच नहीं करता है । अपने स्ट्रिंग केवल \ होता है और आप उस पर console.log कॉल करना चाहते हैं, तो निम्न बात करने की कोशिश करेंगे:

try { 
    __flash__toXML(console.log("\")) ; 
} catch (e) { "<undefined/>"; } 

आप देख सकते हैं इस अमान्य जावास्क्रिप्ट है। यह आपके जावास्क्रिप्ट कंसोल में एक त्रुटि फेंकता है और यह कभी भी console.log पर कॉल नहीं करेगा।

समाधान या तो फ्लैश व्यवहार को डकटाइप करना है या इसके आसपास जाने के लिए कुछ बुरा हैक करना है।

फ्लैश बग्गीनेस को बताने के लिए आप उन्हें स्थानांतरित करने से पहले ब्लैकस्लैश से बच सकते हैं। यह समाधान अब के लिए काम करेगा, लेकिन जब फ्लैश इसे ठीक करेगा (संभवतः निकट भविष्य में नहीं, यदि आप मानते हैं कि यह बग 4 से अधिक वर्षों से ज्ञात है), तो यह आपके आवेदन को तोड़ देगा।

अन्य संभावना यूआरएल एनकोड करने के लिए चरित्र है कि फ्लैश अच्छी तरह से संभाल नहीं करता है (\, ", &) और दूसरी तरफ उन्हें डिकोड करने के लिए है।

फ्लैश:

data = data.split("%").join("%25") 
      .split("\\").join("%5c") 
      .split("\"").join("%22") 
      .split("&").join("%26"); 

जावास्क्रिप्ट:

data = data.replace(/%22/g, "\"") 
      .replace(/%5c/g, "\\") 
      .replace(/%26/g, "&") 
      .replace(/%25/g, "%"); 

यह बदसूरत है, लेकिन यह काम करता है।

+0

"बदसूरत" हैक काम नहीं किया, लेकिन नीचे से बच निकला। अभी भी कुछ सकारात्मक लाने के लिए स्पष्टीकरण काफी व्यापक है। – Wernight

6

यह माना जाता है कि यह सीधे फ़ायरबग में कंसोल के आउटपुट के लिए काम नहीं करेगा, लेकिन अधिकांश अन्य अनुप्रयोगों के लिए (यानी।जावास्क्रिप्ट के लिए एक संभावित 'अमान्य' स्ट्रिंग) भेजने, escape और unescape ठीक काम करना चाहिए:

AS3:

var testString:String = "\"\\\"\""; 
ExternalInterface.call("showString", escape(testString)); 

और फिर में जावास्क्रिप्ट:

function showString(msg) { 
    console.log(unescape(msg)); 
    document.getElementById('messagebox').innerHTML = unescape(msg); 
} 

<div id="messagebox"></div> 
संबंधित मुद्दे

 संबंधित मुद्दे