― MozillaZine.jp フォーラムは Mozilla 製品に関する情報交換の場です ―



All times are UTC + 9 hours

新しいトピックを投稿する トピックへ返信する  [ 5 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2008年10月14日(火) 07:19 
オフライン

登録日時: 2007年1月14日(日) 14:24
記事: 138
お住まい: Osaka,Japan
【現象】
 以下の XUL の button 要素の onclick と onkeypress イベントで getAddress() という関数を呼んでいるが、Firefox 3.0.3 では常に機能するにも関わらず、ある条件下において XULRunner 1.9.0.3 では、getAddress() 関数が機能しない。
コード:
<window id='edit-address' title='&edit_address_title;' xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul' onload="init();">
   <script type="application/x-javascript" src="chrome://addressbook/content/edit_address.js"/>


[略]

         <row>
            <vbox>
               <spacer flex="1"/>

               <description id='zip_code_label' value='&zip_code;'/>
               <spacer flex="1"/>

            </vbox>
            <hbox>
               <textbox tabindex='3' id='zip_code1' value='' cols='3' min='3'/>
               <vbox>
                  <spacer flex="1"/>

                  <description id='zip_tarm' value='−'/>
                  <spacer flex="1"/>
               </vbox>

               <textbox tabindex='4' id='zip_code2' value='' cols='4' min='4'/>
               <button tabindex='5' id='search_from_zip' label='&zip_search;' tooltiptext='&zip_search_text;' onclick="getAddress();" onkeypress="getAddress();" />
            </hbox>
         </row>



【getAddress() のコード】
コード:
function   getAddress()
{
   // Create object to got ZipCode from XUL Element
   var ctrlZipCode = getZipTextBox;
   var   zipCode1;
   var   zipCode2;

   // Create object to set Address to XUL Element
   var   ctrlAddress = setAddressTextBox;

   // Create zip database instance
   var zipTable = zipDB;

   // Initialize zip database
   if((zipTable.init())==false)
      return;

   // Connect zip database
   if((zipTable.open())==false)
      return;


   // Get zip code
   zipCode1 = ctrlZipCode.getZipCode('zip_code1');
   zipCode2 = ctrlZipCode.getZipCode('zip_code2');

   // Get address from zip database
   if((zipTable.getAddress(zipCode1,zipCode2))==false) ←ここが XULRunner だと機能しない
      return;


   // set address
   ctrlAddress.setAddress('ctr_edit_address1',zipTable.address1);
   ctrlAddress.setAddress('ctr_edit_address2',zipTable.address2);

   // Disconnect zip database
   zipTable.close();
};



【zipTable.getAddress(zipCode1,zipCode2) のコード】
コード:
const   zipDB = {
[略]
   getAddress:   function(pZip1,pZip2)
   {
      var   result;
      if ((pZip1=='') || (pZip2==''))
      {
         this.dispErrorMessage('inputZipCode');
         return false;
      }
      else if ((3!=pZip1.length)||(4!=pZip2.length))
      {
         this.dispErrorMessage('invalidZipCodeSize');
         return false;
      }

      var statement = this.mDBConn.createStatement("SELECT pref,city,town FROM zip_table WHERE zip_code = ?1");
      try
      {
         // Get address from zip database
         this.zipCode = pZip1+pZip2
         statement.bindUTF8StringParameter(0,this.zipCode);
         while(statement.executeStep()){
            this.pref[this.zipLength] = statement.getUTF8String(0);
            this.city[this.zipLength] = statement.getUTF8String(1);
            this.town[this.zipLength] = statement.getUTF8String(2);
            this.zipLength++;
         }
         statement.reset();
         if(this.zipLength==0)
         {
            this.dispErrorMessage('nothingAddress');
            this.mDBConn.finalize();
            this.mDBConn.close();
            return false;
         }
      }
      catch(e)
      {
         // Oh My!! We can't get address from zip database. orz
         this.dispErrorMessage('cannotSelectAddressData');
         this.mDBConn.finalize();
         this.mDBConn.close();
         return false;
      }
      if (1<this.zipLength) {
         // Create common data strage
         Application.storage.set('noAddress', this.selectAddress);

         // Case of many result!! We must select one of them.Because we never lost the letter or postcard.
         openDialog('select_address.xul','','',this.zipLength,this.pref,this.city,this.town); ← XULRunner ではこの openDailog で失敗する。
         this.selectAddress = Application.storage.get('noAddress', -1);
         if (0<=this.selectAddress)
         {
            this.address1 = this.pref[this.selectAddress]+this.city[this.selectAddress];
            if ('以下に掲載がない場合'!=this.town[this.selectAddress])
            {
               this.address2 = this.town[this.selectAddress];
            }
            return true;
         }
      }
      else
      {
         // Case of one result
         this.address1 = this.pref[0]+this.city[0];
         this.address2 = this.town[0];
         return true;
      }
   }
};



【発生条件】
 id=zip_code1 の textbox 要素の値が "004" かつ id=zip_code2 の textbox 要素の値が "0000"


【本来の動作】
 二つの住所から片方を選択するダイアログが開く ( Firefox 3.0.3 では動作する )。


【環境】
 WindowsXP、Windows2000、Ubuntu 8.04.1
 Firefox 3.0.3
 XULRunner 1.9.0.3


【ナイトリー配布場所】
 http://www.hcn.zaq.ne.jp/cahpa908/


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2008年10月14日(火) 22:27 
オフライン
Moderator

登録日時: 2006年10月29日(日) 21:56
記事: 472
mitsugu さんが書きました:
button 要素の onclick と onkeypress イベントで

普通にボタンを働かせる状況なら、oncommand だと思います。
click や keypress の時点では、本来ボタンを働かせるタイミングではないので、そこで処理する内容によっては何かと不都合が起こります。

mitsugu さんが書きました:
Firefox 3.0.3 では常に機能するにも関わらず、ある条件下において XULRunner 1.9.0.3 では、getAddress() 関数が機能しない。

FUEL の Application オブジェクトを使っているようですが、FUEL がなくても大丈夫な作りにはなっているでしょうか。
XULRunner は Firefox ではありませんので、Firefox User Extension Library は同梱されていません。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2008年10月15日(水) 08:36 
オフライン

登録日時: 2007年1月14日(日) 14:24
記事: 138
お住まい: Osaka,Japan
あさん さんが書きました:
普通にボタンを働かせる状況なら、oncommand だと思います。
click や keypress の時点では、本来ボタンを働かせるタイミングではないので、そこで処理する内容によっては何かと不都合が起こります。

 そうでしたか。書き直します。

あさん さんが書きました:
FUEL の Application オブジェクトを使っているようですが、FUEL がなくても大丈夫な作りにはなっているでしょうか。
XULRunner は Firefox ではありませんので、Firefox User Extension Library は同梱されていません。

 Application オブジェクトは、Firefox User Extension Library に入っているのですか。XULRunner は Firefox のコア部分を抜き出してランタイム環境として再構築しているものと思って、Application オブジェクトをなにも考えずに使っていました。
 他の方法を試してみます。

 有難うございました。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2008年10月15日(水) 09:39 
オフライン

登録日時: 2007年1月14日(日) 14:24
記事: 138
お住まい: Osaka,Japan
 引数を渡してダイアログを表示するという非常にシンプルな方法を MDC で見つけたので、コードをそのように書き換えました。

【呼出側】
コード:
const   zipDB = {
   file:            null,
   storageService:   null,
   mDBconn:      null,
   zipCode:         null,
   zipLength:      0,
   pref:            [],
   city:            [],
   town:         [],
   address1:      null,
   address2:      null,
   selectAddress:   -1,
[略]
         openDialog('select_address.xul','','',this.zipLength,this.pref,this.city,this.town,this);
         if (0<=this.selectAddress)
         {
            this.address1 = this.pref[this.selectAddress]+this.city[this.selectAddress];
            if ('以下に掲載がない場合'!=this.town[this.selectAddress])
            {
               this.address2 = this.town[this.selectAddress];
            }
            return true;
         }


【ダイアログ側】
コード:
function   doOk()
{
   var i;
   for (i=0;i<maxAddress;i++)
   {
      if(document.getElementsByTagName('menupopup').item(0).childNodes.item(i).selected==true)
      {
         break;
      }
   }
   if (i<maxAddress)
   {
      window.arguments[4].selectAddress = i;
   }
   return;
}


 あさん、アドバイス有難うございました。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
投稿記事Posted: 2008年10月20日(月) 21:35 
オフライン
Moderator

登録日時: 2006年10月29日(日) 21:56
記事: 472
mitsugu さんが書きました:
 Application オブジェクトは、Firefox User Extension Library に入っているのですか。XULRunner は Firefox のコア部分を抜き出してランタイム環境として再構築しているものと思って、

XULRunner は Firefox のコア部分と言っても良いとは思いますが、Application オブジェクトが入っている FUEL は、ガワの方に含まれています。


通報する
ページトップ
 プロフィール  
引用付きで返信する  
期間内表示:  ソート  
新しいトピックを投稿する トピックへ返信する  [ 5 件の記事 ] 

All times are UTC + 9 hours


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[6人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by MozillaZine.jp® Forum Software © phpBB Group , Almsamim WYSIWYG
Japanese translation principally by ocean