/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ /* Copyright 2012 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** @license Copyright 2012 Mozilla Foundation * Copyright 2013 Lu Wang * Apache License Version 2.0 */ 'use strict'; // HTMLElement classList property (function checkClassListProperty() { var div = document.createElement('div'); if ('classList' in div) return; // classList property exists function changeList(element, itemName, add, remove) { var s = element.className || ''; var list = s.split(/\s+/g); if (list[0] === '') list.shift(); var index = list.indexOf(itemName); if (index < 0 && add) list.push(itemName); if (index >= 0 && remove) list.splice(index, 1); element.className = list.join(' '); return (index >= 0); } var classListPrototype = { add: function(name) { changeList(this.element, name, true, false); }, contains: function(name) { return changeList(this.element, name, false, false); }, remove: function(name) { changeList(this.element, name, false, true); }, toggle: function(name) { changeList(this.element, name, true, true); } }; Object.defineProperty(HTMLElement.prototype, 'classList', { get: function() { if (this['_classList']) return this['_classList']; var classList = Object.create(classListPrototype, { element: { value: this, writable: false, enumerable: true } }); Object.defineProperty(this, '_classList', { value: classList, writable: false, enumerable: false }); return classList; }, enumerable: true }); })();