[JavaScript] URLSearchParamsを自作してみた

  • このエントリーをはてなブックマークに追加

Chromeやスマホのブラウザではまだ実装されてないみたいなので自作してみた。

URLSearchParams – Web API インターフェイス | MDN

[js]
if (!window.URLSearchParams) {
(function(){
var URLSearchParams = function(search) {
this.params = [];

        if (search instanceof URLSearchParams) {
            this.params = search.params;
            return;
        }

        var pairs = search.split("&");
        var len = pairs.length;
        for (var i = 0; i < len; i++) {
            var pair = pairs[i].split("=");
            pair.push(null);
            this.append(pair[0], pair[1]);
        }
    };

    var p = URLSearchParams.prototype;

    function search(name) {
        this.params.forEach(function(element, index) {
            if (element.name === name) return index;
        });
        return false;
    }

    p.append = function(name, value) {
        this.params.push({
            name: name,
            value: value,
        });
    };

    p.delete = function(name) {
        while (true) {
            var index = search.call(this, name);
            if (index === false) {
                break;
            }

            this.params.splice(index, 1);
        }
    };

    p.get = function(name) {
        var index = search.call(this, name);
        return this.params[index].name;
    };

    p.set = function(name, value) {
        var index = search.call(this, name);
        if (index === false) {
            this.append(name, value);
        } else {
            this.params[index] = {
                name: name,
                value: value,
            };
        } 
    };

    p.getAll = function() {
        var values = [];

        this.params.forEach(function(element) {
            values.push(element.value);
        });

        return values;
    };

    p.has = function(name) {
        return search.call(this, name) !== false;
    };

    p.toString = function() {
        var pairs = [];

        this.params.forEach(function(element) {
            pairs.push(element.name + '=' + element.value);
        });

        return pairs.join('&');
    };

    window.URLSearchParams = URLSearchParams;
})();

}
[/js]

Firefoxでの動作を参考に実装。だいたい合ってると思ふ。。。
間違いとかあったら教えて下さいな。

本当はURLと連動させたかったけど、searchプロパティがconfigurable:falseだったので断念しました。

2016/05/02 修正

コンストラクタのsearchに”?”から始まる正規表現パターンを検索していたのは間違いだったようなので削除。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。




コメントを残す