2009-02-12 23 views

Trả lời

58

Với jQuery 1.4, bạn có thể thay đổi kiểu đầu vào trong khi nó được tách ra.

marker = $('<span />').insertBefore('#myInput'); 
$('#myInput').detach().attr('type', 'text').insertAfter(marker); 
marker.remove(); 
+5

Điều này làm việc một điều trị. Tôi không biết về tách ra(), đẹp nhất. – philoye

+1

Đã đồng ý với @MildFuzz đây - đây là một giải pháp tuyệt vời! –

+0

Ai đó quan tâm để chỉnh sửa và giải thích điều này thực sự làm gì? (Tôi đã bắt đầu ở đây http://api.jquery.com/detach) – matrixugly

12

Tôi không chắc chắn điều này là có thể, vì vậy tôi khuyên bạn nên sử dụng div ẩn để chứa phần tử đầu vào, có thể được hiển thị khi cần. Trường nhập văn bản vẫn có thể giữ dữ liệu ngay cả khi nó bị ẩn.

+1

Đây là điểm tốt cho lý do trợ năng. Bạn không nên sử dụng đầu vào bị ẩn ngoại trừ các trường phụ trợ không dành cho đầu vào của người dùng. –

+0

Có ý nghĩa khi chuyển đổi đầu vào văn bản thành đầu vào bị ẩn khi giá trị được biết trước thời hạn. Trong trường hợp của tôi, nó phải là trường văn bản khi tôi muốn khách truy cập nhập giá trị OpenID của riêng mình, nhưng tôi muốn loại thay đổi thành trường ẩn khi khách truy cập chọn nhà cung cấp xác thực của Google, Yahoo hoặc Facebook, vì những url đó được xác định trước và không thực sự được thay đổi bởi khách truy cập. Có những lúc bạn có thể muốn một nhãn ẩn hoặc div giữ dữ liệu, nhưng tôi không nghĩ đây là một trong số chúng. – TARKUS

8

IE sẽ không cho phép bạn thay đổi loại phần tử biểu mẫu vì lý do bảo mật vì vậy tôi sẽ đi với đề xuất div ẩn của Aram.

+3

Trong khi điều này chủ yếu là đúng, Ian Mackinnon đã đăng một giải pháp dưới đây làm việc cho tôi. Kể từ jQuery 1.4, bạn có thể thay đổi kiểu đầu vào _if_ nó được tách ra. – kingjeffrey

8

Đây là cách tôi sẽ làm điều này:

$("input[type='hidden']").each(function(){ 
    var name = $(this).attr('name'); // grab name of original 
    var value = $(this).attr('value'); // grab value of original 
    /* create new visible input */ 
    var html = '<input type="text" name="'+name+'" value="'+value+'" />'; 
    $(this).after(html).remove(); // add new, then remove original input 
}); 

Nếu bạn muốn lọc một số yếu tố gọi filter() trước mỗi(), như thế này:

$("input[type='hidden']").filter("[name='whatever']").each(function... 
2

người đàn ông dễ dàng .. .

$('input[type="hidden"]').each (function() { this.type = 'text'; });   

Kích hoạt

nó trên một sự kiện

+1

Bạn đã thử cái này chưa? –

+1

Có điều này hoạt động như một charme :) – Bunkerbuster

0
Overlay.toAnyType = function (c, type) { 

    var shadow = jQuery(document.createElement(c.context.nodeName)); 

    // Clone attributes to new object. 
    for (var i = 0; i < c[0].attributes.length; i++) { 
     var attr = c[0].attributes[i].name; 
     var val = c[0].attributes[i].value; 

     if (attr == "type") val = type; 
     shadow.attr(attr, val); 
    } 


    shadow.insertAfter(c); 
    c.remove(); 
}; 

Khi c là một đối tượng jQuery; hàm ở trên thay đổi thuộc tính type. Cách sử dụng:

var inputElemt = jQuery("#input"); 
Overlay.toAnyType(inputElemt, "text"); 
0

Cũ chủ đề, nhưng gần đây tôi cần phải làm điều gì đó tương tự nhưng với các lĩnh vực tập tin và thanh toán bù trừ họ ... Tôi nghĩ rằng giải pháp tương tự có thể áp dụng, nhưng ít nhất bạn có thể lấy nội dung trong trường hợp này.

var temp = $('#hidden-field').val(); 
$("#container-for-field").html("<input id='not-hidden' type='text' value='"+temp+"'/>"); 

Điều đó cũng nên giải quyết vấn đề :).

Các vấn đề liên quan