Làm cách nào để tạo một menu thả xuống chỉ đọc bằng jquery?


91

Tôi đang sử dụng câu lệnh sau để làm cho nó chỉ đọc nhưng nó không hoạt động.

$('#cf_1268591').attr("readonly", "readonly"); 

Tôi không muốn vô hiệu hóa nó, tôi muốn làm cho nó chỉ đọc.


4
Sự khác biệt giữa menu thả xuống chỉ đọc và menu thả xuống tiêu chuẩn là gì?
Leo


Đây thực sự là một vấn đề jQuery? Hoặc có thể trình đơn thả xuống không hoạt động với thuộc tính chỉ đọc?
Ilia G

Kanishka Panamaldeniya đã cho bạn câu trả lời chính xác (nên biến nó thành một câu trả lời thay vì một bình luận).
qbantek

2
Trình đơn thả xuống không phải lúc nào cũng chỉ đọc. Chỉ đọc có nghĩa là bạn có thể thấy giá trị của nó nhưng không thể thay đổi nó.
Suncat2000

Câu trả lời:


183
$('#cf_1268591').attr("disabled", true); 

thả xuống luôn chỉ được đọc. những gì bạn có thể làm là làm cho nó bị vô hiệu hóa

nếu bạn làm việc với biểu mẫu, các trường bị vô hiệu hóa không gửi, vì vậy hãy sử dụng trường ẩn để lưu trữ giá trị thả xuống bị vô hiệu hóa


26
Tắt menu thả xuống sẽ không gửi được. Tôi sẽ thử giải pháp của bạn.
Karim Ali

3
Một vấn đề với việc tắt tính năng chọn (thả xuống) là tiêu điểm bị mất trong một số trình duyệt (ví dụ: IE9). Điều này có thể là một vấn đề nếu phần tử select đang bị vô hiệu hóa trong khi một lệnh gọi ajax được xử lý, chẳng hạn như vị trí của người dùng trong biểu mẫu bị mất.
Chris

1
Cảm ơn đề nghị của bạn. Chỉ là một câu hỏi; làm cách nào để lưu trữ giá trị thả xuống trong một trường ẩn? Bạn có một số mã ví dụ cho điều đó?
kramer65

2
Một "giải pháp thay thế" khác là kích hoạt các trường đó trước khi gửi biểu mẫu. Hoặc trong trường hợp của tôi, nơi tôi đã gửi dữ liệu ở định dạng JSON (bật, lấy dữ liệu, vô hiệu hóa lại): var disable = $ (yourform) .find (': input: disable'). RemoveAttr ('vô hiệu hóa'); var data = getFormJSONData ($ (yourform)); disable.attr ('bị vô hiệu hóa', 'bị vô hiệu hóa');
KDT

4
Bạn nên sử dụng prop()ngay bây giờ.
alex

144

Tôi đã gặp vấn đề tương tự, giải pháp của tôi là vô hiệu hóa tất cả các tùy chọn không được chọn. Rất dễ dàng với jQuery:

$('option:not(:selected)').attr('disabled', true);

Chỉnh sửa => Nếu bạn có nhiều trình đơn thả xuống trên cùng một trang, hãy tắt tất cả các tùy chọn không được chọn trên select-ID như bên dưới.

$('#select_field_id option:not(:selected)').attr('disabled', true);

24
Ý tưởng tuyệt vời! Để sử dụng các phương pháp hay nhất với các phiên bản jQuery hiện tại, tôi sẽ sử dụng phương thức prop để đặt giá trị bị tắt. tức là$('option:not(:selected)').prop('disabled', true);
Chris O'Connell

Đây là một giải pháp rất dí dỏm!
Jacques

1
ĐÚNG! ý tưởng tuyệt vời.
Eric

1
Đây phải là câu trả lời n ° 1.
Erwan Clügairtz

22

Hãy thử cái này .. mà không tắt giá trị đã chọn ..

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Nó phù hợp với tôi ..


Cùng dòng với câu trả lời của bạn, tôi đã xóa các tùy chọn khác $ ('# cf_1268591 option: not (: selected)'). Remove ();
Seth Winters

20

Đây là những gì bạn đang tìm kiếm:

$('#cf_1268591').attr("style", "pointer-events: none;");

Hoạt động như một sự quyến rũ.


1
Câu trả lời tuyệt vời nhưng hãy cẩn thận điều này vẫn cho phép lựa chọn được gắn thẻ. Bạn cũng cần đặttabindex="-1"
uesports135

Người đàn ông tuyệt vời, tôi cần điều này, vì người khuyết tật không được ánh xạ đến mô hình, cảm ơn câu trả lời của bạn.
sina_Islam

13

Đặt một phần tử với disabledsẽ không gửi dữ liệu, tuy nhiên, selectcác phần tử không córeadonly .

Bạn có thể mô phỏng một readonlytrên selectsử dụng CSS để tạo kiểu tóc và JS để ngăn chặn sự thay đổi với tab:

select[readonly] {
  background: #eee;
  pointer-events: none;
  touch-action: none;
}

Sau đó sử dụng nó như:

var readonly_select = $('select');
$(readonly_select).attr('readonly', true).attr('data-original-value', $(readonly_select).val()).on('change', function(i) {
    $(i.target).val($(this).attr('data-original-value'));
});

Kết quả:


2
Cách tiếp cận rất hay, nhưng người dùng vẫn có thể sử dụng TAB trên bàn phím để chọn giá trị.
Ricardo Martins

1
@RicardoMartins cảm ơn, cập nhật các câu trả lời để ngăn chặn sự thay đổi với TAB
Lucas Bustamante

12

Tôi sẽ làm cho trường bị vô hiệu hóa. Sau đó, khi biểu mẫu được gửi đi, hãy làm cho nó không bị vô hiệu hóa. Theo tôi, điều này dễ dàng hơn so với việc phải xử lý các trường ẩn.

//disable the field
$("#myFieldID").prop( "disabled", true );           

//right before the form submits, we re-enable the fields, to make them submit.
$( "#myFormID" ).submit(function( event ) {
    $("#myFieldID").prop( "disabled", false );
});     

8

Jquery đơn giản để loại bỏ các tùy chọn không được chọn.

$('#your_dropdown_id option:not(:selected)').remove();

Cũng là giải pháp của tôi. Tốt hơn là làm cho họ bị vô hiệu hóa.
Gianluca Demarinis

6

Để đơn giản hóa mọi thứ, đây là một plugin jQuery thực hiện điều đó mà không gặp rắc rối: https://github.com/haggen/readonly


Đoạn mã tuyệt vời (nhỏ), cảm ơn. Nó vô hiệu hóa trình đơn thả xuống để không thể thay đổi chúng nhưng vẫn cho phép gửi các giá trị của chúng. Rất hữu ích.
Alex Hopkins

3

Dòng này thực hiện các lựa chọn với readonlythuộc tính chỉ đọc:

$('select[readonly=readonly] option:not(:selected)').prop('disabled', true);

2

Mã này trước tiên sẽ lưu trữ lựa chọn ban đầu trên mỗi menu thả xuống. Sau đó, nếu người dùng thay đổi lựa chọn, nó sẽ đặt lại danh sách thả xuống về lựa chọn ban đầu.

http://jsfiddle.net/4aHcD/22/

//store the original selection
$("select :selected").each(function(){
    $(this).parent().data("default", this);
});

//change the selction back to the original
$("select").change(function(e) {
    $($(this).data("default")).prop("selected", true);
});

2

Tùy chọn dễ nhất đối với tôi là chọn chỉ đọc và thêm:

onmousedown="return false" onkeydown="return false"

Bạn không cần phải viết thêm bất kỳ logic nào. Không có đầu vào ẩn hoặc bị vô hiệu hóa và sau đó được bật lại khi gửi biểu mẫu.


1

Đó là một bài báo cũ, nhưng tôi muốn cảnh báo những người sẽ tìm thấy nó. Hãy cẩn thận với thuộc tính bị vô hiệu hóa có phần tử theo tên. Lạ nhưng nó có vẻ không quá hiệu quả.

điều này không hoạt động:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('name=img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

công việc này:

<script language="JavaScript">
function onChangeFullpageCheckbox() {    
$('#img_size').attr("disabled",$("#fullpage").attr("checked"));
</script>

Vâng, tôi biết rằng tôi nên sử dụng prop chứ không phải attr, nhưng ít nhất bây giờ prop sẽ không hoạt động vì phiên bản cũ của jquery, và bây giờ tôi không thể cập nhật nó, đừng hỏi tại sao ... sự khác biệt html chỉ được thêm id :. ..

<select name="img_size" class="dropDown" id="img_size">
<option value="200">200px
</option><option value="300">300px
</option><option value="400">400px
</option><option value="500">500px
</option><option value="600" selected="">600px
</option><option value="800">800px
</option><option value="900">900px
</option><option value="1024">1024px
</option></select>

<input type="checkbox" name="fullpage" id="fullpage" onChange="onChangeFullpageCheckbox()" />

...

Tôi không tìm thấy bất kỳ lỗi nào trong tập lệnh và trong phiên bản có tên, không có lỗi nào trong bảng điều khiển. Nhưng tất nhiên nó có thể là sai lầm của tôi trong mã

Đã xem trên: Chrome 26 trên Win 7 Pro

Xin lỗi vì ngữ pháp tồi.


1

Tôi đã tìm thấy, cách tốt hơn để làm điều này là sử dụng CSS để loại bỏ sự kiện con trỏ và sửa đổi độ mờ trên menu thả xuống (thử 0,5). Điều này cho người dùng thấy rằng nó bị vô hiệu hóa như bình thường, nhưng vẫn đăng dữ liệu.

Được cho là điều này có một số vấn đề với khả năng tương thích ngược, nhưng theo tôi là một lựa chọn tốt hơn là giải quyết vấn đề bị vô hiệu hóa / chỉ đọc khó chịu.


Bạn có thể giải thích thêm về CSS cần thiết để làm điều này không?
Cocowalla

1

Bạn cũng có thể vô hiệu hóa nó và tại thời điểm bạn thực hiện cuộc gọi gửi, hãy bật nó. Tôi nghĩ là cách dễ nhất :)


1

Nó hoạt động rất tốt

$('#cf_1268591 option:not(:selected)').prop('disabled', true);

Với cái này, tôi có thể thấy các tùy chọn nhưng tôi không thể chọn nó


0

Không có cái gọi là trình đơn thả xuống chỉ đọc. Những gì bạn có thể làm là đặt lại giá trị đầu tiên theo cách thủ công sau mỗi lần thay đổi.

$("select").change(function(event) {
    $(this).val($(this).find("option").first().val());
});

http://jsfiddle.net/4aHcD/


3
không tốt nếu tùy chọn được chọn hiện thời không phải là lần đầu tiên trong danh sách như trong ví dụ này: jsfiddle.net/4aHcD/19
Homer

@ Xin chào, mã này nhằm mục đích đặt lại mã sau bất kỳ thay đổi nào và nó sẽ hoạt động theo hiệu quả đó. Nếu bạn muốn nó chạy ban đầu thay vì tự thay đổi giá trị ban đầu vì lý do nào đó, bạn luôn có thể gọi sự kiện thay đổi trên phần tử của mình sau khi khai báo sự kiện, bằng cách sử dụng $("select").change(), như vậy jsfiddle.net/4aHcD/20
Alex Turpin

2
khi trang được tải lần đầu, nếu mục thứ ba được chọn và người dùng cố gắng thay đổi nó thành mục thứ hai, thì mã của bạn sẽ thay đổi lựa chọn thành mục đầu tiên. Tôi không nghĩ rằng nó không nên làm như vậy. Đây là một ví dụ về những gì tôi nghĩ OP muốn, một menu thả xuống sẽ không thay đổi giá trị đã chọn của nó dựa trên tương tác của người dùng: jsfiddle.net/4aHcD/22
Homer

Những gì tôi cần và những gì OP yêu cầu là một cách để làm cho nó ở chế độ chỉ đọc. Điều đó có nghĩa là bạn có thể thấy giá trị hoặc các giá trị đã chọn nhưng không thể thay đổi nó. Điều đó có nghĩa là màn hình bắt chước giao diện của điều khiển có thể chỉnh sửa mà không thể chỉnh sửa nó.
Suncat2000

0

Cố gắng tạo chuỗi trống khi "nhấn phím lên"

Html là:

<input id="cf_1268591" style="width:60px;line-height:16px;border:1px solid #ccc">

Jquery là:

$("#cf_1268591").combobox({
  url:"your url",
  valueField:"id",
  textField:"text",
  panelWidth: "350",
  panelHeight: "200",
});

// tạo sau keyup với chuỗi trống

var tb = $("#cf_1268591").combobox("textbox");
  tb.bind("keyup",function(e){
  this.value = "";
});

0

Có lẽ bạn có thể thử cách này

function myFunction()
{
   $("select[id^=myID]").attr("disabled", true);
   var txtSelect = $("select[id^=myID] option[selected]").text();
}

Điều này đặt giá trị đầu tiên của menu thả xuống làm giá trị mặc định và có vẻ như nó chỉ đọc


0

html5 hỗ trợ:

`
     $("#cCity").attr("disabled", "disabled"); 
     $("#cCity").addClass('not-allow');

`


0

Đây là một biến thể nhỏ đối với các câu trả lời khác đề xuất sử dụng tắt. Vì thuộc tính "đã tắt" thực sự có thể có bất kỳ giá trị nào và vẫn bị vô hiệu hóa, bạn có thể đặt nó thành chỉ đọc, như vô hiệu hóa = "readonly". Điều này sẽ vô hiệu hóa điều khiển như bình thường và cũng sẽ cho phép bạn dễ dàng tạo kiểu cho nó khác với các điều khiển bị tắt thông thường, với CSS như:

select[disabled=readonly] {
    .... styles you like for read-only
}

Nếu bạn muốn dữ liệu được bao gồm, hãy gửi, hãy sử dụng các trường ẩn hoặc bật trước khi gửi, như được nêu chi tiết trong các câu trả lời khác.


0

Như @Kanishka đã nói, nếu chúng tôi vô hiệu hóa một phần tử biểu mẫu, nó sẽ không được gửi. Tôi đã tạo một đoạn mã cho vấn đề này. Khi phần tử chọn bị tắt, nó sẽ tạo ra một trường nhập ẩn và lưu trữ giá trị. Khi nó được kích hoạt, nó sẽ xóa các trường nhập ẩn đã tạo.

Thêm thông tin

jQuery(document).ready(function($) {
  var $dropDown = $('#my-select'),
    name = $dropDown.prop('name'),
    $form = $dropDown.parent('form');

  $dropDown.data('original-name', name); //store the name in the data attribute 

  $('#toggle').on('click', function(event) {
    if ($dropDown.is('.disabled')) {
      //enable it 
      $form.find('input[type="hidden"][name=' + name + ']').remove(); // remove the hidden fields if any
      $dropDown.removeClass('disabled') //remove disable class 
        .prop({
          name: name,
          disabled: false
        }); //restore the name and enable 
    } else {
      //disable it 
      var $hiddenInput = $('<input/>', {
        type: 'hidden',
        name: name,
        value: $dropDown.val()
      });
      $form.append($hiddenInput); //append the hidden field with same name and value from the dropdown field 
      $dropDown.addClass('disabled') //disable class
        .prop({
          'name': name + "_1",
          disabled: true
        }); //change name and disbale 
    }
  });
});
/*Optional*/

select.disabled {
  color: graytext;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form action="#" name="my-form">
  <select id="my-select" name="alpha">
    <option value="A">A</option>
    <option value="B">B</option>
    <option value="C">C</option>
  </select>
</form>
<br/>
<button id="toggle">toggle enable/disable</button>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.