2012-06-17 156 views
6

我有一個選擇一些選項的:jQuery的選擇上禁用選項

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

我使用的是選上的jQuery插件,問題是,禁用選項從視圖中刪除。但我需要將它顯示爲不可禁用的禁用元素。

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> 

所以謝勝利元素不發unvisible,它根本不存在。

+0

您可以檢查在Firebug的元素,看看是否有元素的風格''display:none;'',''visibility:hidden''或'opacity:0''?還是完全從DOM中刪除? – Ohgodwhy

+0

很抱歉,我編輯了這個問題。 – take

+3

我看了一下插件的Source和Docs。很明顯,「選擇」會自動突出顯示選定的選項並刪除禁用的選項。正如DOCS中直接提到的那樣。仔細檢查發現,你將有一個乾草日重新配置。 – Ohgodwhy

回答

6

您需要編輯插件作爲這裏概述:

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

該插件在選擇讀取,從DOM中刪除,並增加了一個新的UL。選項標記爲「已禁用」,並稱李時新UL

這裏是興趣chosen.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,那麼當用戶在該項目上什麼都不會發生單擊一個塊。

+0

對不起,延遲迴復。你的例子工作得很好,謝謝! – take

9

nicholmikey的方法是正確的,但這裏是你需要在chosen.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;} 
+0

工作正常,謝謝。但我需要一定的時間才能看到你已經刪除了代碼*'if(!option.disabled){'*。或許會更好,不要刪除它,只是評論它;-) – Hugo