JavaScript

URLSearchParamsを自作してみた

JavaScript

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

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;
    })();
}

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

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

2016/05/02 修正

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

スポンサーリンク
記事を書いた人

システムえんじにゃー🐈
趣味はエレキギター、自転車など。作曲したい。
World of Warshipsやってます。
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする

コメント

タイトルとURLをコピーしました