ricollab の郵便番号検索サービスを利用した郵便番号検索を Ext.form.ComboBox のページングで実装する。

サンプル:http://www.moriwaki.net/ext/zip.html

HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
    <title>ComboBox - 郵便番号検索</title>
    <link rel="stylesheet" type="text/css" href="/css/ext-all.css" />
    <script type="text/javascript" src="/js/ext-base.js"></script>
    <script type="text/javascript" src="/js/ext-all.js"></script>
    <script type="text/javascript" src="zip.js"></script>
    <style type="text/css">
        .ext-ie .x-form-text {position:static !important;}
    </style>
</head>
<body>

<div style="width:400px;">
    <div class="x-box-tl"><div class="x-box-tr"><div class="x-box-tc"></div></div></div>
    <div class="x-box-ml"><div class="x-box-mr"><div class="x-box-mc">
        <h3 style="margin-bottom:5px;">郵便番号検索</h3>
        <input type="text" name="search" id="search" />
        <br />
        〒<input type="text" maxlength="7" name="zip" id="zip" />
        <br />
        <input type="text" name="address" id="address" />
    </div></div></div>
    <div class="x-box-bl"><div class="x-box-br"><div class="x-box-bc"></div></div></div>
</div>

</body>
</html>

JavaScript:

Ext.BLANK_IMAGE_URL = '/images/default/s.gif';

Ext.onReady(function(){

    var ds = new Ext.data.Store({
        baseParams: {
            type: 'json',
            count: 10
        },
        proxy: new Ext.data.ScriptTagProxy({
            url: 'http://zip.ricollab.jp/search'
        }),
        reader: new Ext.data.JsonReader({
            root: 'result',
            totalProperty: 'totalResults',
            id: 'zipcode'
        }, [
            {name: 'zipcode', mapping: 'zipcode'},
            {name: 'address', mapping: 'address'}
        ])
    });
    // ページングの送信パラメータをサイトに合わせて修正
    ds.on('beforeload', function(s, o) {
        o.params.page = o.params.start / o.params.limit + 1;
    });

    var resultTpl = new Ext.XTemplate(
        '<tpl for="."><div class="search-item">',
            '<h3>〒{zipcode}</h3>',
            '{address}',
        '</div></tpl>'
    );
    // 郵便番号入力
    var zip = new Ext.form.TextField({
        applyTo: 'zip',
        maxLength: 7,
        width: 100,
        selectOnFocus: true
    });
    // 住所入力
    var address = new Ext.form.TextField({
        applyTo: 'address',
        width: 350,
        selectOnFocus: true
    });
    // 郵便番号 or 住所検索コンボボックス
    var search = new Ext.form.ComboBox({
        store: ds,
        displayField:'title',
        typeAhead: false,
        loadingText: '検索中...',
        emptyText: '郵便番号または住所の一部を入力してください',
        width: 350,
        pageSize:10,
        hideTrigger: true, // トリガー要素を隠す
        tpl: resultTpl,
        applyTo: 'search',
        itemSelector: 'div.search-item',
        queryParam: 'q',
        minChars: 2,
        onSelect: function(record){
            zip.setValue(record.data.zipcode);
            address.setValue(record.data.address);
            this.collapse();
        },
        onKeyUp : function(e){
            if(this.editable !== false && !e.isSpecialKey()){
                this.lastKey = e.getKey();
             }
        }
    });

    var timeout;
    var comboValue = '';

    var focusCombo = function() {
        if (comboValue != search.el.dom.value) {
            if (search.isExpanded()) {
                search.collapse();
            }
            search.onTriggerClick();
            comboValue = search.el.dom.value;
        }
        timeout = setTimeout(focusCombo, 500);
    }

    var blurCombo = function() {
        clearTimeout(timeout);
    }

    search.on({
        'focus': focusCombo,
        'blur': blurCombo
    });

});
Trackback URL:
Leave a Reply

Spam Protection by WP-SpamFree

Modified by MT22(Moriwaki Takashi).