题解 | #选择组件#

选择组件

https://www.nowcoder.com/practice/ed0bd346dc9c4184aacda183484a3a6f

// CheckGroup是一个选择组件类,支持单选和多选

    // 选项参数格式:

    // var options = [{text: '选项a', value: 'a'}, {text: '选项b', value: 'b'}, {text: '选项c', value: 'c'}, {text: '选项d', value: 'd'}];

    // 给定的options中, text和value属性的值均为非空字符串

    // 实例化单选组件:

    // var item = new CheckGroup(document.getElementById('jsCheckGroup'), options);

    // item.val(['a']);

    // 实例化多选组件:

    // var item = new CheckGroup(document.getElementById('jsCheckGroup'), options, true);

    // item.val(['a']);

    // 选中的dom元素className = 'item selected'

    // 单选组件className = 'checkgroup radius'

    // 单选时, 如果点击的dom元素没有selected类, 则添加selected类, 并移除其他选项元素的selected类;如果有selected类,则移除selected类

    // 点击多选选项,如果未选中当前选项则添加selected类,否则移除selected类

    function CheckGroup(renderTo, options, isMultiple) {
      var that = this; // CheckGroup实例
      that.renderTo = renderTo;
      that.options = options;
      that.isMultiple = !!isMultiple; // 针对无参数传入的情况,!!undefined == false
      that.initHtml();
      that.initEvent();
    }
    CheckGroup.prototype.initHtml = fInitHtml;
    CheckGroup.prototype.initEvent = fInitEvent;
    CheckGroup.prototype.toggleEl = fToggleEl;
    CheckGroup.prototype.isSelected = fIsSelected;
    CheckGroup.prototype.val = fVal;

    function fInitHtml() {
      var that = this;
      // 请补全代码,拼接html字符串
      var sHtml = `<div class="checkgroup ${that.isMultiple ? '' : 'radius'}">
        ${that.options.reduce((divhtml, cur) => divhtml + `<div data-val="${cur.value}" class="item">${cur.text}</div>`, '')}
      </div>`

      that.renderTo.innerHTML = sHtml;
      // 请补全代码,获取checkgroup的dom元素引用
      that.el = this.renderTo.querySelector('.checkgroup');
    }

    function fInitEvent() {
      var that = this;
      that.el && that.el.addEventListener('click', function (event) {
        var item = event.target;
        item.classList.contains('item') && that.toggleEl(item);
      });
    }

    function fToggleEl(item) {
      // 根据当前是单选还是多选,以及当前元素是否选中,高亮/取消���亮指定的选项dom元素
      var that = this;
      if (that.isSelected(item)) {
        // 请补全代码
        item.classList.remove('selected')
      } else if (that.isMultiple) {
        // 请补全代码
        item.classList.add('selected')
      } else {
        // 请补全代码
        item.parentNode.querySelector('.selected') && item.parentNode.querySelector('.selected').classList.remove('selected')
        item.classList.add('selected')
      }
    }

    function fIsSelected(item) {
      // 请补全代码,判断item是否选中
      return item.classList.contains('selected');
    }

    // val方法的参数和返回值均为数组(单选时数组长度不超过)
    function fVal(values) {
      var that = this; // 实例
      if (arguments.length === 0) {
        // 请补全代码,获取高亮的选项元素
        var items = jsCheckGroup.querySelectorAll('.selected');
        // 请补全代码,获取高亮的选项元素的data-val
        var result = [].map.call(items, item => item.dataset.val)

        return result;
      }
      !that.isMultiple && values.length > 1 && (values.length = 1); // 单选组件,只能选一个
      // 请补全代码,获取所有的选项元素
      var items = jsCheckGroup.querySelectorAll('.item');
      // 请补全代码,在指定元素上加上高亮的class
      [].forEach.call(items, item => {
        if (values.includes(item.dataset.val)) {
          that.toggleEl(item)
        }
      })
    }

全部评论

相关推荐

牛客34884196...:你期望薪资4-5k,那确实可以重生了,但很难在深圳活下去
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务