2016-01-18 16 views
5

Tôi đang làm việc với đầu vào tệp chuẩn để tải lên và tôi đang tìm cách đính kèm chức năng vào sự kiện khi người dùng nhấp/lần truy cập vào nút "hủy" (hoặc thoát ra khỏi) hộp thoại chọn tệp.Hủy sự kiện trên loại đầu vào = "tệp"

Tôi không thể tìm thấy bất kỳ sự kiện nào hoạt động trên tất cả các trình duyệt và nền tảng một cách nhất quán.

Tôi đã đọc câu trả lời cho câu hỏi này: Capturing cancel event on input type=file nhưng chúng không hoạt động vì sự kiện thay đổi không kích hoạt trong hầu hết các trình duyệt khi hủy hộp thoại chọn tệp.

Tôi đang tìm giải pháp js thuần túy, nhưng cũng mở ra các giải pháp jquery.

Bất kỳ ai giải quyết vấn đề này thành công?

+0

Từ '.change() 'không được thực hiện bởi tất cả các trình duyệt, nên tìm kiếm sự kiện đó được gọi. Các trình duyệt của họ mà bạn đang muốn làm việc cụ thể phải không? – Twisty

+0

Một số thử nghiệm với https://jsfiddle.net/Twisty/j18td9cs/ này, trong FF, và vì 'Hủy' là phần tử của hộp thoại trình duyệt, tôi chỉ có thể kiểm tra xem tệp đã được chọn hay chưa. Tôi nhận thấy nếu tôi chọn một tập tin, và sau đó duyệt một lần thứ hai, và nhấn hủy bỏ, nó giữ lại giá trị tập tin ... do đó, đó không phải là giúp đỡ ở đây. Có thể tạo nút Hủy của riêng bạn trong trang. Cố gắng để xem nếu một cái gì đó được cập nhật hoặc trả lại nếu hủy bỏ được chọn, giống như với 'confirm()' hoặc 'prompt()'. – Twisty

Trả lời

4

Một chút nghiên cứu chỉ ra rằng không có cách nào để phát hiện khi Hủy được chọn trong cửa sổ hộp thoại Chọn tệp. Bạn có thể sử dụng onchange hoặc onblur để kiểm tra xem tệp đã được chọn hay chưa hoặc một cái gì đó đã được thêm vào đầu vào value.

Điều này có thể trông giống như: https://jsfiddle.net/Twisty/j18td9cs/

HTML

<form> 
    Select File: 
    <input type="file" name="test1" id="testFile" /> 
    <button type="reset" id="pseudoCancel"> 
    Cancel 
    </button> 
</form> 

Javascript

var inputElement = document.getElementById("testFile"); 
var cancelButton = document.getElementById("pseudoCancel"); 
var numFiles = 0; 

inputElement.onclick = function(event) { 
    var target = event.target || event.srcElement; 
    console.log(target, "clicked."); 
    console.log(event); 
    if (target.value.length == 0) { 
    console.log("Suspect Cancel was hit, no files selected."); 
    cancelButton.onclick(); 
    } else { 
    console.log("File selected: ", target.value); 
    numFiles = target.files.length; 
    } 
} 

inputElement.onchange = function(event) { 
    var target = event.target || event.srcElement; 
    console.log(target, "changed."); 
    console.log(event); 
    if (target.value.length == 0) { 
    console.log("Suspect Cancel was hit, no files selected."); 
    if (numFiles == target.files.length) { 
     cancelButton.onclick(); 
    } 
    } else { 
    console.log("File selected: ", target.value); 
    numFiles = target.files.length; 
    } 
} 

inputElement.onblur = function(event) { 
    var target = event.target || event.srcElement; 
    console.log(target, "changed."); 
    console.log(event); 
    if (target.value.length == 0) { 
    console.log("Suspect Cancel was hit, no files selected."); 
    if (numFiles == target.files.length) { 
     cancelButton.onclick(); 
    } 
    } else { 
    console.log("File selected: ", target.value); 
    numFiles = target.files.length; 
    } 
} 


cancelButton.onclick = function(event) { 
    console.log("Pseudo Cancel button clicked."); 
} 

Tôi đề nghị làm riêng hủy hoặc thiết lập lại nút của bạn mà resets các hình thức hoặc xóa giá trị từ đầu vào.

+0

Điều này không hoạt động trên Firefox. :(Nếu một tập tin không được chọn trước đó, ngay sau khi tôi nhấp vào nút "Duyệt", nó sẽ ghi vào giao diện điều khiển 'Nghi ngờ Hủy bỏ được nhấn, không có tập tin được chọn.' và' Nút Hủy giả được nhấp. '. Khi nhấp hủy trong hộp thoại trình duyệt Nếu một tập tin được chọn trước đó, ngay sau khi tôi nhấp vào "Duyệt", nó sẽ ghi lại rằng tôi đã chọn tập tin trước đó, mặc dù tôi vẫn đang ở trong hộp thoại – Noitidart

+0

Đã viết bài này trong FF.Bạn phải kiểm tra lại. fiddle của mã kiểm tra của bạn? – Twisty

+0

Cảm ơn ông đã trả lời nhanh chóng của bạn, tôi chỉ cần sử dụng fiddle ở trên tôi didnt viết bất cứ điều gì riêng biệt. – Noitidart

-1

Tôi gặp sự cố khi tôi nhấp vào nút hủy trên phần tử loại đầu vào = "tệp" và muốn chức năng không làm gì cả. nếu một cái gì đó đã được chọn và tôi nhấp vào nút mở sau đó tôi muốn chức năng của tôi để làm một cái gì đó. Ví dụ chỉ cho thấy phương pháp, tôi đã loại bỏ những gì tôi làm với nó sau khi nó mở ra. Tôi đặt trong các cảnh báo chỉ để bạn có thể thấy không có một tên tập tin quay trở lại từ hộp thoại khi hủy bỏ được nhấp. Đây là phương pháp tôi sử dụng, nó rất đơn giản nhưng nó hoạt động.

function openFileOnClick(){ 
 
    document.getElementById("fileSelector").value = ""; 
 
    document.getElementById("fileSelector").files.length = 0;    
 
    document.getElementById("fileSelector").click(); 
 
    if(document.getElementById("fileSelector").files.length >= 1){ 
 
     alert(document.getElementById("fileSelector").value); 
 
     //Do something 
 
    } 
 
    else{ 
 
     alert(document.getElementById("fileSelector").value); 
 
     //Cancel button has been called. 
 
    } 
 
}
<html> 
 
<head> 
 
</head> 
 
<body> 
 
<input type="file" id="fileSelector" name="fileSelector" value="" style="display:none;" /> 
 
<input type="button" value="Open File" name="openFile" onclick="openFileOnClick();" /> 
 
</body> 
 
</html>

+0

Bạn có thể giải thích chi tiết hơn về đoạn mã của bạn hoặc lý do đoạn mã hoạt động không? – danjuggler

+0

Tôi gặp sự cố khi tôi nhấp vào nút hủy trên phần tử loại đầu vào = "tệp" và muốn chức năng không làm gì cả. nếu một cái gì đó đã được chọn và tôi nhấp vào nút mở sau đó tôi muốn chức năng của tôi để làm một cái gì đó. Ví dụ trên chỉ cho thấy phương pháp, tôi đã loại bỏ những gì tôi làm với nó sau khi nó mở ra. Tôi đặt trong các cảnh báo chỉ để bạn có thể thấy không có một tên tập tin trở lại từ hộp thoại. – DJones

+1

Đối với những nội dung như thế này, bạn có thể quan sát hành vi – GWR

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