JS Function & Flash #Adobe Flex

วันอาทิตย์ที่ผ่านมาทำงานกับเพื่อนแล้วต้องเขียนสองอย่างนี้คู่กัน มีทั้งเรียกจาก JS ไปยัง Flash และจาก Flash กลับไปยัง JS ได้ประสบการณ์มาพอสมควรเลย ดูด้านล่างเป็นข้อ ๆ เลยละกัน

  1. จากหน้าเว็บ HTML สามารถส่งข้อมูลไปยัง Flash ผ่าน embed และ object ได้เลย ผ่าน embed flashvar และ attribute flashvar ใน object ต้องกำหนดทั้งสองที่เพื่อให้ใช้ได้ทุก Browser เช่น
    <object name='flashObject' id='flashObject' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab' height='300' width='200'>
      <param name='src' value='flashObject.swf' />
      <param name='flashVars' value='name=llun&page=list' />
      <param name="allowScriptAccess" value="sameDomain" />
      <param name="wmode" value="opaque">
      <embed name='flashObject' src='flashObject.swf' pluginspage='http://www.adobe.com/go/getflashplayer' flashVars='name=llun&page=list height='300' width='200' allowScriptAccess="sameDomain" wmode="opaque" />
    </object>
    

    จากด้านบนบรรทัดที่ 3 กับ 6 จะมี flashVar ซ้ำกัน ใส่เหมือนกับที่อยู่หลัง URL เวลา request แล้วส่งค่าข้ามไปมา นอกจากวิธีกำหนด flashVar แบบนี้แล้ว จะกำนหดใน src เลยก็ได้เช่น

    <param name='src' value='flashObject.swf?name=llun&page=list' />
    
  2. wmode มีด้วยกันสามค่าคือ window, opaque, transparent ใช้ในโอกาสต่างกัน

    • window: Flash มาอยู่ด้านบนสุดของ HTML ถ้ามี tag ไหนที่ render อยู่ตำแหน่งเดียวกับ Flash จะถูกบังไม่ให้เห็น
    • opaque: Flash จะอยู่หลังสุดของ HTML content tag ต่าง ๆ ที่ถูก render ตำแหน่งเดียวกับ Flash จะบัง Flash
    • transparent: ส่วนไหนที่ Flash ไม่มีการวาดจะโปร่งใสเห็น HTML ที่ถูก render อยู่หลัง Flash

    อาทิตย์ที่ผ่านมาใช้ opaque เพราะใช้ Javascript คุม Flash จากนั้นพอกดใน Flash ให้เรียก Javascript เพื่อ render ทับอีกที พบว่ามันดูดีกว่าและง่ายกว่าใช้ Flash อย่างเดียวมาก แต่ก็คงขึ้นกับงานหละ ค่า default คือ window

  3. เวลาจะใช้ Javascript เรียกฟังก์ชั่นใน Flash ต้องทำสองอย่างคือ addCallback ใน Flash และเขียนฟังก์ชั่นเพื่อให้ resolve flash object จากชื่อได้
    ExternalInterface.addCallback("rotateLeft", rotateLeft)
    ExternalInterface.addCallback("rotateRight", rotateRight)
    

    และใน Javascript

      function thisMovie(movieName) {
        if (navigator.appName.indexOf("Microsoft") != -1) {
          return window[movieName]
        } else {
          return document[movieName]
        }
      }
    

    เวลาเรียกจาก Javascript ก็หา Flash object ผ่านฟังก์ชั่นด้านบน แล้วเรียก function ตามชื่อที่ addCallback ไว้

      function rotateLeft() {
        thisMovie('flashObject').rotateLeft()
        event.preventDefault()
        return false
      }
    

ตอนนี้เหมือนเป็นตอนต่อจาก Call JS function from Flash เพราะเรียกจากฝั่ง JS แทน จริง ๆ ที่ทำวันอาทิตย์มีมากกว่านี้ ทั้งหาตำแหน่ง render ที่ต้องคำนวนจาก Flash เพิ่มเข้ามาอีกทีด้วย รวมถึงการหมุนภาพที่ต้องย้ายมุมของภาพไปตำแหน่งต่าง ๆ แถม resize Flash embed ใน HTML แต่ไว้คราวหน้าหลังจากทำเสร็จแล้วละกัน จะเล่ามาเป็นข้อ ๆ เลย

อ้างอิง:

About llun

Just a programmer

, ,