以前に正規表現を使用したことを思い出し調べていたときにでてきたソースです。実際、正規表現は一か所でしか使用していないのですが、こうゆう使い方もあるということで、クラス操作関数とあわせて備忘録として残しておこうと思います。
クラス操作は classList のメソッドで容易に行うことができますが、Can I use で調べてみると Android 4.4 からの対応になっています。それ以前のバージョンに対応する場合は classList の代用が必要になりますが、そのようなときに使えるかと思います。(indexOf()を使用しているのでクラス名の重複部分には注意が必要になります)
/***
* クラス追加
*/
function add_class(elem, cls) {
if (!elem || !cls) return;
elem.className = add_str(elem.className, cls);
}
/***
* クラス削除
*/
function remove_class(elem, cls) {
if (!elem || !cls) return;
elem.className = remove_str(elem.className, cls);
}
/***
* クラス確認
*/
function has_class(elem, cls) {
if (!elem || !cls) return;
return has_str(elem.className, cls);
}
/***
* クラス追加・削除
*/
function toggle_class(elem, cls) {
if (!elem || !cls) return;
elem.className = toggle_str(elem.className, cls);
}
// 文字列 strings に文字列 str を追加する
function add_str(strings, str) {
var i = strings.indexOf(str);
if (i === -1) {
var len = strings.length;
if (len !== 0 && strings.charAt(len -1) !== " ") {
strings += " ";
}
strings += str;
}
return strings;
}
// 文字列 strings から文字列 str を削除する
function remove_str(strings, str) {
var i = strings.indexOf(str);
if (i !== -1) {
strings = strings.substr(0, i)
+ strings.substr(i + str.length + 1);
}
return strings;
}
// 文字列 strings に文字列 str が含まれているか検査する
function has_str(strings, str) {
var regex = new RegExp("(^|\\s)" + str + "(\\s|$)");
if (regex.test(strings)) return true;
else return false;
}
// 文字列 strings に文字列 str があれば str を削除し、
// str がなければ追加する
function toggle_str(strings, str) {
if (has_str(strings, str)) {
return remove_str(strings, str);
} else {
return add_str(strings, str);
}
}