ngăn bàn phím mặc định của iphone khi lấy nét <input>


82

đây là cách tôi đang cố gắng

<script type="text/javascript">
     $(document).ready(function(){
        $('#dateIn,#dateOut').click(function(e){
            e.preventDefault();
        }); 
     });
</script>

nhưng đầu vào vẫn 'khởi chạy' bàn phím của iphone

ps: tôi muốn làm điều này vì tôi đang sử dụng plugin datepicker cho ngày

Câu trả lời:


228

Bằng cách thêm thuộc tính readonly(hoặc readonly="readonly") vào trường nhập, bạn sẽ ngăn không cho bất kỳ ai nhập bất kỳ thứ gì vào đó, nhưng vẫn có thể khởi chạy sự kiện nhấp chuột vào trường đó.

Điều này cũng hữu ích trong các thiết bị không phải di động khi bạn sử dụng bộ chọn ngày / giờ


2
Hừm! cảm ơn! nhưng liệu người chọn ngày có thể đặt giá trị chọn không?
Toni Michel Caubet,

9
Nó sẽ được thôi. Readonly chỉ dành cho người dùng, không dành cho JavaScript.
Rene Pot

4
-1 vì đây không phải là một phương pháp mạnh mẽ. Đầu vào về mặt kỹ thuật không phải là "chỉ đọc" và những thứ như tự động gắn nhãn (sử dụng tabindex = "x") không hoạt động với điều này
Patrick

Tabindex dường như vẫn hoạt động đối với tôi. Tuy nhiên, tôi không thể sử dụng readonlyvì một số tiện ích không ràng buộc sự kiện trên readonlyđầu vào.
Pierre de LESPINAY

1
Chỉ cần lưu ý: readonly là một thuộc tính HTML boolean, có nghĩa là sự hiện diện của nó là dấu hiệu của giá trị. Bạn chỉ cần "readonly", không phải "readonly = {true | readonly | etc}"
contactmatt

11

Bạn có thể thêm một hàm gọi lại vào DatePicker của mình để yêu cầu nó làm mờ trường nhập trước khi hiển thị DatePicker.

$('.selector').datepicker({
   beforeShow: function(){$('input').blur();}
});

Lưu ý: Bàn phím iOS sẽ xuất hiện trong một phần giây và sau đó ẩn.


1
cảm ơn, điều này cũng hoạt động cho Android. Đối với Android, nó thậm chí không xuất hiện
timaschew

1
Không hoạt động đối với tôi trong Android .. Bàn phím vẫn bật lên
mjs

1
Câu trả lời tốt nhất cho tôi cho đến nay. Tôi đã gần như từ bỏ điều này.
Thiago Elias

Thủ thuật tuyệt vời và thanh lịch, cảm ơn bạn. Nó hoạt động trên iPhone + Android tại đây.
Erowlin

4

Vì tôi không thể bình luận về nhận xét trên cùng, nên tôi buộc phải gửi "câu trả lời".

Vấn đề với câu trả lời đã chọn là việc thiết lập trường chỉ đọc sẽ đưa trường ra khỏi thứ tự tab trên iPhone. Vì vậy, nếu bạn muốn nhập biểu mẫu bằng cách nhấn "tiếp theo", bạn sẽ bỏ qua ngay trường này.


1
Nó có ý nghĩa, chỉ đọc sẽ không cho phép người dùng thay đổi giá trị (chỉ javascript) vì vậy tôi đoán là taht tự nhiên nó bỏ qua nó
Toni Michel Caubet

1
Tuy nhiên, trên các trình duyệt máy tính để bàn mà tôi đã thử nghiệm - bao gồm cả Safari / mac - tính năng tab sẽ đưa bạn đến trường chỉ đọc.
John Vance

1
@JohnVance Điều này có đúng ngay cả khi thuộc tính tab-index được đặt không? Hay điều đó sẽ ghi đè hiệu ứng? (Tôi hỏi vì tôi không có một chiếc iPhone, nhưng sẽ đánh giá cao những kiến thức)
Fernando Silva

1
@FernandoSilva Tôi đã thử nghiệm điều này trên iPhone Safari, với tab-index, bạn vẫn sẽ bỏ qua trường này.
Betty

4

Tôi đã hỏi một câu hỏi tương tự ở đây và nhận được một câu trả lời tuyệt vời - hãy sử dụng trình chọn ngày gốc của iPhone - điều đó thật tuyệt.

Cách tắt bàn phím iPhone cho một trường nhập cụ thể trên trang web

Tóm tắt nội dung / mã giả:

if small screen mobile device 

  set field type to "date" - e.g. document.getElementById('my_field').type = "date";
  // input fields of type "date" invoke the iPhone datepicker.

else

  init datepicker - e.g. $("#my_field").datepicker();

Lý do cho việc đặt động loại trường thành "date" là Opera sẽ bật lên trình chọn ngày gốc của riêng nó, và tôi giả sử bạn muốn hiển thị trình chọn ngày nhất quán trên các trình duyệt máy tính để bàn.


1
Vấn đề là ngày có sẵn hoặc không thể xác nhận đã được thiết lập với datepicer ... dù vậy, cảm ơn muộn!
Toni Michel Caubet

4

Mã dưới đây phù hợp với tôi:

<input id="myDatePicker" class="readonlyjm"/>


$('#myDatePicker').datepicker({
/* options */
});

$('.readonlyjm').on('focus',function(){
$(this).trigger('blur');
});

3

Cách tốt nhất để giải quyết vấn đề này theo ý kiến ​​của tôi là Sử dụng "ignoreReadonly".

Đầu tiên, hãy làm cho trường đầu vào chỉ đọc, sau đó thêm ignoreReadonly: true. Điều này sẽ đảm bảo rằng ngay cả khi trường văn bản chỉ được đọc, cửa sổ bật lên sẽ hiển thị.

$('#txtStartDate').datetimepicker({
            locale: "da",
            format: "DD/MM/YYYY",
            ignoreReadonly: true
        });
        $('#txtEndDate').datetimepicker({
            locale: "da",
            useCurrent: false,
            format: "DD/MM/YYYY",
            ignoreReadonly: true
        });
});

0

Vì vậy, đây là giải pháp của tôi (tương tự như câu trả lời của John Vance):

Đầu tiên, hãy truy cập vào đây và nhận một chức năng để phát hiện trình duyệt di động.

http://detectmobileb Browse.com/

Họ có nhiều cách khác nhau để phát hiện xem bạn có đang sử dụng thiết bị di động hay không, vì vậy hãy tìm một cách phù hợp với những gì bạn đang sử dụng.

Trang HTML của bạn (mã giả):

If Mobile Then
    <input id="selling-date" type="date" placeholder="YYYY-MM-DD" max="2999-12-31" min="2010-01-01" value="2015-01-01" />
else
    <input id="selling-date" type="text" class="date-picker" readonly="readonly" placeholder="YYYY-MM-DD" max="2999-12-31" min="2010-01-01" value="2015-01-01" />

JQuery:

$( ".date-picker" ).each(function() {
    var min = $( this ).attr("min");
    var max = $( this ).attr("max");
    $( this ).datepicker({ 
        dateFormat: "yy-mm-dd",  
        minDate: min,  
        maxDate: max  
    });
});

Bằng cách này, bạn vẫn có thể sử dụng công cụ chọn ngày gốc trên thiết bị di động trong khi vẫn đặt ngày tối thiểu và ngày tối đa theo cách này.

Trường không dành cho thiết bị di động chỉ nên được đọc vì nếu trình duyệt di động như chrome for ios "yêu cầu phiên bản dành cho máy tính để bàn" thì chúng có thể kiểm tra thiết bị di động và bạn vẫn muốn ngăn bàn phím hiển thị.

Tuy nhiên, nếu trường chỉ được đọc, nó có thể trông người dùng giống như họ không thể thay đổi trường. Bạn có thể khắc phục điều này bằng cách thay đổi CSS để làm cho nó trông giống như nó không chỉ đọc (tức là thay đổi màu đường viền thành màu đen) nhưng trừ khi bạn đang thay đổi CSS cho tất cả các thẻ đầu vào, bạn sẽ khó giữ giao diện nhất quán. các trình duyệt.

Để có được arround, tôi chỉ cần thêm một nút hình ảnh lịch vào bộ chọn ngày. Chỉ cần thay đổi mã JQuery của bạn một chút:

$( ".date-picker" ).each(function() {
    var min = $( this ).attr("min");
    var max = $( this ).attr("max");
    $( this ).datepicker({ 
        dateFormat: "yy-mm-dd",  
        minDate: min,  
        maxDate: max,
        showOn: "both",
        buttonImage: "images/calendar.gif",
        buttonImageOnly: true,
        buttonText: "Select date"
    });
});

Lưu ý: bạn sẽ phải tìm một hình ảnh phù hợp.


0

@ Rene-pot là chính xác. Tuy nhiên, bạn sẽ có dấu hiệu không được phép trên phiên bản máy tính để bàn của trang web. Giải quyết vấn đề này, hãy áp dụng readonly = "true" cho một div sẽ chỉ hiển thị trên chế độ xem trên thiết bị di động chứ không phải trên máy tính để bàn. Xem những gì chúng tôi đã làm tại đây http://www.naivashahotels.com/naivasha-hotels/lake-naivasha-country-club/


0

Tôi có một tập lệnh "không có bàn phím" chung chung - phù hợp với tôi với Android và iPhone:

  $('.readonlyJim').on('focus', function () {
      $(this).trigger('blur')
  })

Chỉ cần đính kèm thêm lớp readonlyJim vào thẻ đầu vào và thì đấy.

(* Xin lỗi StarTrek nhiều quá)

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.