【現象】
以下の 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/