classNameを追加したり削除したりトグルしたり。

本当はHTMLElement.prototypeにプロパティを追加したいんだけど,Greasemonkeyがそれを許してくれないようだ。だから関数として定義してみた。

function equalTo(x) { return function (y) { return x == y;} }
function notEqualTo(x) { return function (y) { return x != y;} }

Array.contains = function(array, x) {
    return Array.some(array, equalTo(x));
}
Array.prototype.contains = function(x) { return Array.contains(this, x); }

function appendClassName() {
    var elem = Array.shift(arguments);
    var classNames = elem.className.split(/\s+/);
    Array.forEach(arguments, function(name) {
        if(!classNames.contains(name))
            classNames.push(name);
    });
    elem.className = classNames.join(' ');
}
function removeClassName() {
    var elem = Array.shift(arguments);
    var arg = arguments;
    elem.className = elem.className.split(/\s+/).filter(function(exist_name) {
        return !Array.contains(arg, exist_name);
    }).join(' ');
}
function toggleClassName() {
    var elem = Array.shift(arguments);
    var classNames = elem.className.split(/\s+/);
    Array.forEach(arguments, function(name) {
        var old_len = classNames.length;
        classNames = classNames.filter(notEqualTo(name));
        if(old_len == classNames.length)
            classNames.push(name);
    });
    elem.className = classNames.join(' ');
}

無駄に高階関数を使いたくなるから困る。高階関数ってなんか楽しい!