【问题标题】:jquery chosen on disabled option在禁用选项上选择 jquery
【发布时间】:2012-06-17 20:26:37
【问题描述】:

我有一个带有一些选项的选择:

 <select id="select">
   <option>1</option>
   <option disabled="true">2</option>
   <option>3</option>
 </select>

我正在为 jQuery 使用 Chosen Plugin,问题是禁用的选项已从视图中删除。但我需要将其显示为不可点击的禁用元素。

jquery 选择的插件有机会吗?

-- 该示例将转换为:

 <ul class="chzn-results">
   <li id="location_select_chzn_o_0" class="active-result result-selected">1</li>
   <li id="location_select_chzn_o_2" class="active-result">3</li>
</ul>

所以第二个元素并没有变得不可见,它根本不存在。

【问题讨论】:

  • 你能检查一下 Firebug 中的元素,看看该元素的样式是'display:none;''visibility:hidden'还是'opacity:0'?还是完全从 DOM 中移除?
  • 抱歉回答晚了,我编辑了问题。
  • 我查看了插件的源代码和文档。很明显,Chosen automatically highlights selected options and removes disabled options 正如 DOCS 中直接提到的那样。仔细检查会发现,您将不得不重新配置它。

标签: jquery jquery-chosen


【解决方案1】:

nicholmikey 的方法是正确的,但是这里是你需要在 selected.jquery.js 中替换的代码,只是简单的几行(下面有注释)。希望这会有所帮助。

AbstractChosen.prototype.result_add_option = function(option) {
  var classes, style;

    option.dom_id = this.container_id + "_o_" + option.array_index;
    classes = option.selected && this.is_multiple ? [] : ["active-result"];
    if (option.selected) {
      classes.push("result-selected");
    }
    if (option.group_array_index != null) {
      classes.push("group-option");
    }

    // THIS IS NEW ---------------
    if (option.disabled) {
      classes.push("disabled");
    }
    // ---------------------------

    if (option.classes !== "") {
      classes.push(option.classes);
    }
    style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
    return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
};

还有这个

Chosen.prototype.result_select = function(evt) {
  var high, high_id, item, position;
  if (this.result_highlight) {
    high = this.result_highlight;
    high_id = high.attr("id");
    this.result_clear_highlight();
    if (this.is_multiple) {
      this.result_deactivate(high);
    } else {
      this.search_results.find(".result-selected").removeClass("result-selected");
      this.result_single_selected = high;
      this.selected_item.removeClass("chzn-default");
    }
    high.addClass("result-selected");
    position = high_id.substr(high_id.lastIndexOf("_") + 1);
    item = this.results_data[position];

    // THIS IS NEW ---------------
    if(this.form_field.options[item.options_index].disabled){
      return false;
    }
    // ---------------------------

    item.selected = true;
    this.form_field.options[item.options_index].selected = true;
    if (this.is_multiple) {
      this.choice_build(item);
    } else {
      this.selected_item.find("span").first().text(item.text);
      if (this.allow_single_deselect) this.single_deselect_control_build();
    }
    if (!(evt.metaKey && this.is_multiple)) this.results_hide();
    this.search_field.val("");
    if (this.is_multiple || this.form_field_jq.val() !== this.current_value) {
      this.form_field_jq.trigger("change", {
        'selected': this.form_field.options[item.options_index].value
      });
    }
    this.current_value = this.form_field_jq.val();
    return this.search_field_scale();
  }
};

最后我添加了这个 css...

.chzn-results .disabled{color:#CCC;}

【讨论】:

  • 对我来说很好,谢谢。但是我需要一段时间才能看到您已经删除了代码 'if (!option.disabled) {' 。也许最好不要删除它而只是评论它;-)
【解决方案2】:

您需要按照此处所述编辑插件:

http://bitsmash.wordpress.com/2012/10/01/making-disabled-elements-visible-with-the-jquery-chosen-plugin/

插件读入一个选择,将其从 DOM 中移除,并添加一个新的 ul。将 li 添加到新 ul 时会跳过标记为“已禁用”的选项

这里是 selected.jquery.js 中感兴趣的方法

AbstractChosen.prototype.result_add_option = function(option) {
  var classes, style;
  if (!option.disabled) {
    option.dom_id = this.container_id + "_o_" + option.array_index;
    classes = option.selected && this.is_multiple ? [] : ["active-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);
    style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
    return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
  } else {
    return "";
  }
};

请注意,如果一个选项被禁用,它不会返回任何内容。走线

return "";

并为禁用项目输入您想要的 html/css。或者,您可以删除 if (!option.disabled) 块,并添加一个新的 if (!option.disabled) 块,该块在项目被禁用时添加一个特殊的 CSS 类。

接下来,您需要确保当用户单击禁用的项目时没有任何反应。您需要编辑此方法:

 Chosen.prototype.result_select = function(evt) {
  var high, high_id, item, position;
  if (this.result_highlight) {
    high = this.result_highlight;
    high_id = high.attr("id");
    this.result_clear_highlight();
    if (this.is_multiple) {
      this.result_deactivate(high);
    } else {
      this.search_results.find(".result-selected").removeClass("result-selected");
      this.result_single_selected = high;
      this.selected_item.removeClass("chzn-default");
    }
    high.addClass("result-selected");
    position = high_id.substr(high_id.lastIndexOf("_") + 1);
    item = this.results_data[position];
    item.selected = true;
    this.form_field.options[item.options_index].selected = true;
    if (this.is_multiple) {
      this.choice_build(item);
    } else {
      this.selected_item.find("span").first().text(item.text);
      if (this.allow_single_deselect) this.single_deselect_control_build();
    }
    if (!(evt.metaKey && this.is_multiple)) this.results_hide();
    this.search_field.val("");
    if (this.is_multiple || this.form_field_jq.val() !== this.current_value) {
      this.form_field_jq.trigger("change", {
        'selected': this.form_field.options[item.options_index].value
      });
    }
    this.current_value = this.form_field_jq.val();
    return this.search_field_scale();
  }
};

添加一个块,如果禁用,则返回 false,然后当用户单击该项目时不会发生任何事情。

【讨论】:

  • 抱歉回复晚了。您的示例效果很好,谢谢!
猜你喜欢
  • 2011-01-27
  • 2016-02-25
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2015-07-10
  • 1970-01-01
相关资源
最近更新 更多