2010-11-05 28 views
58

Tôi muốn kích hoạt sự kiện khi người dùng chọn tệp. Làm như vậy với sự kiện .change nó hoạt động nếu người dùng thay đổi tệp mỗi lần.Cách phát hiện loại đầu vào = tệp "thay đổi" cho cùng một tệp?

Nhưng tôi muốn kích hoạt sự kiện nếu người dùng chọn lại cùng một tệp.

  1. tài chọn tập tin A.jpg (cháy sự kiện)
  2. tài chọn tập tin B.jpg (cháy sự kiện)
  3. tài chọn tập tin B.jpg (sự kiện không cháy, tôi muốn nó bắn)

Tôi có thể làm như thế nào?

Trả lời

42

Bạn có thể đánh lừa nó. Xóa phần tử tệp và thêm phần tử đó vào cùng một vị trí trên sự kiện change. Nó sẽ xóa đường dẫn tập tin làm cho nó thay đổi mọi lúc.

Example on jsFiddle.

Hoặc bạn chỉ có thể sử dụng .prop("value", ""), xem this example on jsFiddle.

  • jQuery 1.6 + prop
  • phiên bản trước attr

Hoặc sử dụng .val("")

+0

Nhưng điều này không phù hợp với yêu cầu của OP, phải không? –

+0

@Pekka: Không chính xác. Nhưng anh ta có thể thích ứng với nó. Giả sử anh ấy cần đăng tệp. Sau bài đăng, anh ta có thể gọi hàm js sẽ xóa và thêm bộ chọn tệp mới. Nó là doable. – BrunoLM

+3

lưu ý rằng khi bạn sử dụng '.attr (" value "," ")' hoặc '.val (" ")' (như đề xuất bởi @ wagner-leonardi bên dưới), Internet explorer sẽ kích hoạt sự kiện thay đổi trong khi chrome không – fadomire

1

Bạn không thể thực hiện change lửa tại đây (hành vi đúng, vì không có gì thay đổi). Tuy nhiên, bạn có thể ràng buộc click là tốt ... mặc dù điều này có thể bắn quá thường ... không có nhiều mặt đất trung gian giữa hai mặc dù.

$("#fileID").bind("click change", function() { 
    //do stuff 
}); 
+2

@downvoter - quan tâm để nhận xét? –

+0

Có vẻ như bạn đang lặp lại lời nói của mình và '.click()' không phải là "lửa khi chọn lại". – BrunoLM

+0

@BrunoLM - Không, nó không ... nhưng tôi nghĩ bạn đọc qua phần mà tôi nói bạn không thể làm điều này, 'click' là gần như nó được. –

14

tôi để làm việc này bằng cách xóa các giá trị đầu vào tập tin onClick và sau đó đăng file onChange. Điều này cho phép người dùng chọn cùng một tệp hai lần liên tiếp và vẫn có sự kiện thay đổi để đăng lên máy chủ. Ví dụ của tôi sử dụng the jQuery form plugin.

$('input[type=file]').click(function(){ 
    $(this).attr("value", ""); 
}) 
$('input[type=file]').change(function(){ 
    $('#my-form').ajaxSubmit(options);  
}) 
+0

'onClick' kích hoạt trước 'onChange', vì vậy phương pháp này hoạt động tốt cho tôi. – iplus26

+0

Đây là một giải pháp rất thanh lịch và cần được đánh dấu là câu trả lời. –

4

Công việc này đối với tôi

<input type="file" onchange="function();this.value=null;return false;"> 
+0

tôi đoán bạn có nghĩa là một cái gì đó như function() {this.value = null; return false; } – Prozi

52

Nếu bạn đã thử .attr("value", "") và đã không làm việc, đừng hoảng sợ (như tôi đã làm)

chỉ làm .val("") thay vào đó, và sẽ làm việc fine

+7

haha: D, tôi nhìn xung quanh để xem bạn có đang ngồi cạnh tôi –

+1

siêu câu trả lời không! :) – YdB

+2

Đây phải là câu trả lời được chấp nhận. –

1

Nếu bạn không muốn sử dụng jQuery

<form enctype='multipart/form-data'> 
    <input onchange="alert(this.value); return false;" type='file'> 
    <br> 
    <input type='submit' value='Upload'> 
</form> 

Nó hoạt động tốt trong Firefox, nhưng đối với Chrome, bạn cần phải thêm this.value=null; sau khi thông báo.

0

Bạn có thể sử dụng form.reset() để xóa danh sách files của tệp nhập. Điều này sẽ đặt lại tất cả các trường thành giá trị mặc định, nhưng trong nhiều trường hợp, bạn có thể chỉ sử dụng kiểu nhập = 'tệp' trong biểu mẫu để tải lên tệp. Trong giải pháp này không cần sao chép thành phần và tái móc các sự kiện một lần nữa.

Nhờ philiplehmann

0

Vâng, tôi đã gặp phải vấn đề tương tự. Tôi đã sử dụng sự kiện "đầu vào" (hoặc đầu vào) thay vì thay đổi và nó hoạt động như sự quyến rũ.

1

Bạn chỉ có thể đặt thành null đường dẫn tệp mỗi lần người dùng nhấp vào điều khiển. Bây giờ, ngay cả khi người dùng chọn cùng một tệp, sự kiện onchange sẽ được kích hoạt.

<input id="file" onchange="file_changed(this)" onclick="this.value=null;" type="file" accept="*/*" /> 
+0

Tôi cần một giải pháp như thế này. Nó thực sự ngắn và hoàn thành công việc. Nice suy nghĩ Mariusz Wiazowski. –

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