Tag Archive for 'javascript'

20MayEsperatipo公開

Esperanto用のテキスト変換ライブラリを組み込んだEsperantipo version 0.1.0 を公開しました。
公開フェーズはティザー期としていて、「こんなのって使い道ある?」的な問いかけをEsperantistな皆様にしていこうかという段階です。
使い道がなければ放置、あればライブラリ化・ライセンスほぼフリーでの公開を目指します。

ローカル環境での変換用のアプリケーションは存在してるみたい(下部リンク参照)だったけど、ウェブアプリとしてのライブラリ的なものをネット上で見なかったので開発しました。
需要があればBBSやブログなどの記事入力欄やコメント欄なんかに組み込めるようなライブラリになればよいかなと。

Windowsのローカル環境をEsperanto仕様にしたい場合はIMEの言語設定にEsperantoを指定する(下部リンク参照)のが適切だと思います。
本ライブラリはローカルアプリと競合する立場ではなく、あくまでもウェブアプリとして最近のOSと一般的なブラウザさえあれば成立するようなお手軽な立ち位置なのではないでしょうか。
本ライブラリも他ローカルアプリ同様、Unicodeが持ち込まれる以前のPC(WindowsMe以前)上では文字コードの越えられない壁があり、正常な動作が絶望的です。

以下はEsperantipoの主な仕様です。

  • 使い方

    ボタン方式
    ボタンを押して、’ĉ’,'ĝ’などを入力する。
    X方式
    ‘cx’,'gx’のように変換対象文字に’x'や’X'を後置すると、’ĉ’,'ĝ’に変換する。
    キャレット方式
    ‘c^’,'g^’のように変換対象文字に’^'を後置すると、’ĉ’,'ĝ’に変換する。
  • 動作環境

    動作確認済みOS
    WindowsVista/WindowsXP/MacOSX
    動作確認済みブラウザ(Windows)
    Firefox2/Safari3/InternetExplorer6or7
    動作確認済みブラウザ(Mac)
    Firefox2/Safari2
  • ライセンス

    Esperantipo.js
    Flabo.js
    Announce.js
    Creative Commons 表示-非営利 2.1 日本
  • 協力

    Yasukaさん
    YasukaWeb

動作環境については、個人の情報収集能力に限界があるためユーザーの協力をお願いします。
ライセンスとありますが、動作環境が確定後もっと組み込みやすい形にしてから積極的に公開していく予定です。

26AprExternalInterface - ActionScript/JavaScriptのオブジェクトの受け渡し

ExternalInterfaceでActionScriptとJavaScript間で相互にObjectを渡す。

Browser

  • parameter

    value

ソースコードは以下の通り。

  1. <div id="interface">
  2.     <p>Browser</p>
  3.     <input type="button" name="" value="sendObject()" onclick="sendObject();" id="send" />
  4.     <input type="button" name="" value="clearTextField()" onclick="clearTextField();" id="send" />
  5.     <p id="debugText"></p>
  6.     <ul>
  7.         <li><p class="param">parameter</p><p class="value">value</p><div class="clear"></div></li>
  8.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  9.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  10.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  11.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  12.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  13.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  14.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  15.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  16.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  17.         <li><input type="text" name="param" value="" class="param" /><input type="text" name="value" value="" class="value" /></li>
  18.     </ul>
  19. </div>
  1. // send Object
  2. function sendObject() {
  3.     debugText("send Object to swf(ActionScript)");
  4.     getEmbedElementByName('externalSWF').loadObject(getObject());
  5. }
  6.  
  7. function getObject(name) {
  8.     var obj = new Object();
  9.     var arrParam = document.getElementsByName('param');
  10.     var arrValue = document.getElementsByName('value');
  11.     var param, value;
  12.    
  13.     for (var i = 0; i <arrParam.length; i++) {
  14.         param = arrParam[i].value;
  15.         value = arrValue[i].value;
  16.        
  17.         obj[param] = value;
  18.     }
  19.    
  20.     return obj;
  21. }
  22.  
  23. // load Object
  24. function loadObject(obj) {
  25.     clearTextField();
  26.    
  27.     debugText("load Object from swf(ActionScript)");
  28.     var arrParam = document.getElementsByName('param');
  29.     var arrValue = document.getElementsByName('value');
  30.     var i = 0;
  31.    
  32.     for (var param in obj) {
  33.         arrParam[i].value = param;
  34.         arrValue[i].value = obj[param];
  35.         i++;
  36.     }
  37. }
  38.  
  39. // clear Input Text
  40. function clearTextField() {
  41.     debugText("clear text field");
  42.     var arrParam = document.getElementsByName('param');
  43.     var arrValue = document.getElementsByName('value');
  44.    
  45.     for (var i = 0; i <arrParam.length; i++) {
  46.         arrParam[i].value = '';
  47.         arrValue[i].value = '';
  48.     }
  49. }
  50.  
  51. // debugText
  52. function debugText(str) {
  53.     var element = document.getElementById('debugText');
  54.     removeChildren(element);
  55.     element.appendChild(document.createTextNode(str));
  56. }
  57.  
  58. // common
  59. function getEmbedElementByName(name) {
  60.     return (/*@cc_on!@*/false)? window[name]: document[name];
  61. }
  62.  
  63. function removeChildren(element) {
  64.     while (element.hasChildNodes()) element.removeChild(element.firstChild);
  65. }
  1. import flash.external.ExternalInterface;
  2.  
  3.  
  4. init();
  5.  
  6.  
  7. function init() {
  8.     setupEI();
  9.     setupButton();
  10.     setupTabIndex();
  11. }
  12.  
  13. // ExternalInterface
  14. function setupEI() {
  15.     var isAvailable = ExternalInterface.available;
  16.     if (isAvailable) {
  17.         debug("ExternalInterface is available");
  18.         addCallbackEI("loadObject", null, loadObject);
  19.     } else {
  20.         debug("ExternalInterface is not available");
  21.     }
  22. }
  23.  
  24. function addCallbackEI(strMethodName_js, objInstance_as, fncMethod_as) {
  25.     ExternalInterface.addCallback(strMethodName_js, objInstance_as, fncMethod_as);
  26. }
  27.  
  28. function callJS(strMethodName_js, objParameter_as) {
  29.     ExternalInterface.call(strMethodName_js, objParameter_as);
  30. }
  31.  
  32. // Button
  33. function setupButton() {
  34.     mcSendObject.onRelease = function() {
  35.         sendObject();
  36.     };
  37.     mcSendObject.onReleaseOutside = mcSendObject.onRollOut;
  38.    
  39.     mcClearTextField.onRelease = function() {
  40.         clearTextField();
  41.     };
  42.     mcClearTextField.onReleaseOutside = mcClearTextField.onRollOut;
  43. }
  44.  
  45. // Tab Index
  46. function setupTabIndex() {
  47.     mcSendObject.tabIndex = 1;
  48.     mcClearTextField.tabIndex = 2;
  49.     txtDebug.tabEnabled = false;
  50.    
  51.     var txtParam, txtValue;
  52.     for (var i = 0; i <10; i++) {
  53.         txtParam = this["txtParam_" + i];
  54.         txtValue = this["txtValue_" + i];
  55.        
  56.         txtParam.tabIndex = 3 + i * 2;
  57.         txtValue.tabIndex = 4 + i * 2;
  58.     }
  59. }
  60.  
  61. // send Ojbect
  62. function sendObject() {
  63.     debug("send Object to browser(JavaScript)");
  64.     callJS("loadObject", getObject());
  65. }
  66.  
  67. function getObject() {
  68.     var obj = new Object();
  69.     var param, value;
  70.    
  71.     for (var i:Number = 0; i <10; i++) {
  72.         param = this["txtParam_" + i].text;
  73.         value = this["txtValue_" + i].text;
  74.        
  75.         obj[param] = value;
  76.     }
  77.    
  78.     return obj;
  79. }
  80.  
  81. // load Object
  82. function loadObject(obj) {
  83.     clearTextField();
  84.    
  85.     debug("load Object from browser(JavaScript)");
  86.     setObject(obj);
  87. }
  88.  
  89. function setObject(obj) {
  90.     var i = 0;
  91.     var txtParam, txtValue;
  92.    
  93.     for (var param in obj) {
  94.         txtParam = this["txtParam_" + i];
  95.         txtValue = this["txtValue_" + i];
  96.        
  97.         txtParam.text = param;
  98.         txtValue.text = obj[param];
  99.         i++;
  100.     }
  101. }
  102.  
  103. // clear TextField
  104. function clearTextField() {
  105.     debug("clear text field");
  106.    
  107.     var txtParam, txtValue;
  108.     for (var i = 0; i <10; i++) {
  109.         txtParam = this["txtParam_" + i];
  110.         txtValue = this["txtValue_" + i];
  111.        
  112.         txtParam.text = "";
  113.         txtValue.text = "";
  114.     }
  115. }
  116.  
  117. // debug
  118. function debug(str) {
  119.     txtDebug.text = str;
  120. }
JavaScript
//sendObject : ObjectをSWFに渡す。
//loadObject : ObjectがSWFから渡される。
ActionScript
//ExternalInterface : Browserから呼び出し可能なActionScriptのメソッドを登録する。
//sendObject : ObjectをBrowserに渡す。
//loadObject : ObjectがBrowserから渡される。

これ以外のメソッドはActionScript/JavaScript共にオブジェクト生成用のテキストフィールドのセットアップに使ってるだけで、ExternalInterfaceには関係ない。

25Marname属性付きのエレメントを生成する

エレメントに対してname属性を動的に付加する際に、element.setAttribute('name', name);とかelement.name = 'name';とかやってはみるものの、IEだとまともにname属性を付加してくれない。
そんな時は、DOM操作の範疇を逸して無理やりラップ。

  1. function createElementWithName(tag, name) {
  2.     var isIE =/*@cc_on!@*/false;
  3.     var element;
  4.     if (name) {
  5.         element = (isIE)? document.createElement('<' + tag + ' name="' + name + '">'): document.createElement(tag);
  6.         element.name = name;
  7.     } else {
  8.         element = document.createElement(tag);
  9.     }
  10.    
  11.     return element;
  12. }
/*@cc_on@*/とは?
IE限定の@cc_onステートメント。
"/*@cc_on"と"@*/"の間に書いたものをIE限定で認識してくれる。
この場合IEのみ"!"を認識するので、isIEはIEにおいてのみtrueとなる。

22MaraddEventListener/attachEventをラップする

イベントリスナのMOZ/IEのブラウザ間の差異を吸収。

  1. function setEventListener(element, type, listener) {
  2.     if (element.addEventListener) element.addEventListener(type, function(event){listener(this)}, false);
  3.     else if (element.attachEvent) element.attachEvent('on' + type, function(event){listener(event.srcElement)});
  4. }
element
document.getElementById('hoge')等で取得したDOM Element
type
イベントの種類。"click"とか"focus"とか"blur"とか。"on"抜きで渡しませう。
listener
イベントが起こったときに叩く関数名
ブラウザ間の差異
addEventListenerはMOZ/Safari
attachEventはIE

"テストする"というボタンをクリックした時に、ボタンの背景色を赤くするサンプル。

  1. var element = document.getElementById('button');
  2.  
  3. setEventListener(element, 'click', writeText);
  4.  
  5. function setEventListener(element, type, listener) {
  6.     if (element.addEventListener) element.addEventListener(type, function(event){listener(this)}, false);
  7.     else if (element.attachEvent) element.attachEvent('on' + type, function(event){listener(event.srcElement)});
  8. }
  9. function writeText(targetElement) {
  10.     targetElement.style.backgroundColor = 'red';
  11. }

イベントが起きたとき、リスナーであるwriteTextに引数としてtargetElementが渡される。
これは、イベントが起きたエレメント自身のことで、今回の場合はクリックされたボタン自身が渡されます。




Return to page top