jQuery-chosen - 将所选选项的自定义选项属性推送到列表

时间:2016-07-06 14:16:30

标签: javascript jquery jquery-chosen

我有一个像bellow

这样的选项列表
<select data-placeholder="Choose users" style="width:350px;" multiple class="chosen-select" tabindex="8">
    <option data-user-id="1">User1</option>
    <option data-user-id="3">User2</option>
    <option data-user-id="6">User3</option>
    <option data-user-id="14">User4</option>
</select>

我可以使用chosen plugin选择多个选项。每个选定的值都会输入新的<li>元素,如下所示:

<li class="search-choice"><span>User</span><a class="search-choice-close" data-option-array-index="2"></a></li>

有没有办法将data-user-id从选项推送到上面的<li>

我可以在不破解选择的插件的情况下完成吗?

  

下面你将通过更改一点点选择的插件来找到我的解决方案

3 个答案:

答案 0 :(得分:1)

我已经用 selected_v1.8.7 对此进行了测试。正如@panagiotis-koursaris 在他的回答中指出的那样,可以将 user_id: $(option).attr('data-user-id') 行添加到第一个函数中:

SelectParser.prototype.add_option = function(option, group_position, group_disabled) { 
if (option.nodeName.toUpperCase() === "OPTION") { 
    if (option.text !== "") { 
      if (group_position != null) { 
        this.parsed[group_position].children += 1; 
      } 
      this.parsed.push({ 
        user_id: $(option).attr('data-user-id'), 
        array_index: this.parsed.length, 
        options_index: this.options_index, 
        value: option.value, 
        text: option.text, 
        html: option.innerHTML, 
        title: option.title ? option.title : void 0, 
        selected: option.selected, 
        disabled: group_disabled === true ? group_disabled : option.disabled, 
        group_array_index: group_position, 
        group_label: group_position != null ? this.parsed[group_position].label : null, 
        classes: option.className, 
        style: option.style.cssText 
      }); 
    } else { 
      this.parsed.push({ 
        array_index: this.parsed.length, 
        options_index: this.options_index, 
        empty: true 
      }); 
    } 
    return this.options_index += 1; 
  } 
};

但您还需要将此行 option_el.setAttribute("data-user-id", option.user_id); 添加到 AbstractChosen.prototype.result_add_option:

AbstractChosen.prototype.result_add_option = function(option) {
      var classes, option_el;
      if (!option.search_match) {
        return '';
      }
      if (!this.include_option_in_results(option)) {
        return '';
      }
      classes = [];
      if (!option.disabled && !(option.selected && this.is_multiple)) {
        classes.push("active-result");
      }
      if (option.disabled && !(option.selected && this.is_multiple)) {
        classes.push("disabled-result");
      }
      if (option.selected) {
        classes.push("result-selected");
      }
      if (option.group_array_index != null) {
        classes.push("group-option");
      }
      if (option.classes !== "") {
        classes.push(option.classes);
      }
      option_el = document.createElement("li");
      option_el.className = classes.join(" ");
      if (option.style) {
        option_el.style.cssText = option.style;
      }
      option_el.setAttribute("data-option-array-index", option.array_index);
      // Add the line below
      option_el.setAttribute("data-user-id", option.user_id);
      option_el.innerHTML = option.highlighted_html || option.html;
      if (option.title) {
        option_el.title = option.title;
      }
      return this.outerHTML(option_el);
    };

答案 1 :(得分:0)

我建议使用value属性而不是数据属性。

<select data-placeholder="Choose users" style="width:350px;" multiple class="chosen-select" tabindex="8">
    <option value="1">User1</option>
    <option value="3">User2</option>
    <option value="6">User3</option>
    <option value="14">User4</option>
</select>

然后您可以使用

检索ID
$('select').val(); //use a name or id attribute to make this selector more specific..

答案 2 :(得分:0)

SelectParser.prototype.add_option内部,我使用jquery获取了自定义属性,然后我将其作为选项推送。

SelectParser.prototype.add_option看起来像:

SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
  if (option.nodeName.toUpperCase() === "OPTION") {
    if (option.text !== "") {
      if (group_position != null) {
        this.parsed[group_position].children += 1;
      }
      this.parsed.push({
        user_id: $(option).attr('data-user-id'),
        array_index: this.parsed.length,
        options_index: this.options_index,
        value: option.value,
        text: option.text,
        html: option.innerHTML,
        title: option.title ? option.title : void 0,
        selected: option.selected,
        disabled: group_disabled === true ? group_disabled : option.disabled,
        group_array_index: group_position,
        group_label: group_position != null ? this.parsed[group_position].label : null,
        classes: option.className,
        style: option.style.cssText
      });
    } else {
      this.parsed.push({
        array_index: this.parsed.length,
        options_index: this.options_index,
        empty: true
      });
    }
    return this.options_index += 1;
  }
};

正如您所注意到的那样,我只放了user_id: $(option).attr('data-user-id'),行代码。

然后,为了将data-user-id推送到<li>列表,我将此行'data-user-id': item.user_id添加到Chosen.prototype.choice_build,以便最后看起来像:

  Chosen.prototype.choice_build = function(item) {
      var choice, close_link,
        _this = this;
      choice = $('<li />', {
        "class": "search-choice"
      }).html("<span>" + (this.choice_label(item)) + "</span>");
      if (item.disabled) {
        choice.addClass('search-choice-disabled');
      } else {
        close_link = $('<a />', {
          "class": 'search-choice-close',
          'data-option-array-index': item.array_index,
          'data-user-id': item.user_id
        });
        close_link.bind('click.chosen', function(evt) {
          return _this.choice_destroy_link_click(evt);
        });
        choice.append(close_link);
      }
      return this.search_container.before(choice);
    };

那就是它!您可以通过这种方式按任意方式推送任意数量的自定义属性。