<input type='file' />
jQuery 로 제어 값 을 지울 수 있습니까? 나는 다음을 시도했다.
$('#control').attr({ value: '' });
그러나 작동하지 않습니다.
답변
쉬움 : <form>
요소 를 감싸고 폼에서 reset을 호출 한 다음을 사용하여 폼을 제거합니다 .unwrap()
. .clone()
이 스레드의 다른 솔루션 과 달리 마지막에는 동일한 요소 (설정된 사용자 정의 속성 포함)로 끝납니다.
Opera, Firefox, Safari, Chrome 및 IE6 +에서 테스트 및 작동 을 제외한 다른 유형의 양식 요소에서도 작동합니다 type="hidden"
.
window.reset = function(e) {
e.wrap('<form>').closest('form').get(0).reset();
e.unwrap();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form>
<input id="file" type="file">
<br>
<input id="text" type="text" value="Original">
</form>
<button onclick="reset($('#file'))">Reset file</button>
<button onclick="reset($('#text'))">Reset text</button>
아래의 Timo 메모에서 알 수 있듯이의 내부 필드 재설정을 트리거하는 버튼이있는 경우 제출을 트리거 하지 않도록 이벤트를 <form>
호출해야합니다 ..preventDefault()
<button>
편집하다
수정되지 않은 버그로 인해 IE 11에서 작동하지 않습니다. 입력시 텍스트 (파일 이름)가 지워지지 만 File
목록은 채워져 있습니다.
답변
빠른 답변 : 교체하십시오.
아래 코드에서 replaceWith
jQuery 메서드를 사용 하여 컨트롤을 자체 복제본으로 바꿉니다. 이 컨트롤의 이벤트에 바인딩 된 핸들러가있는 경우 해당 핸들러도 보존해야합니다. 이를 위해 메소드 true
의 첫 번째 매개 변수로 전달 합니다 clone
.
<input type="file" id="control"/>
<button id="clear">Clear</button>
var control = $("#control");
$("#clear").on("click", function () {
control.replaceWith( control = control.clone( true ) );
});
피들 : http://jsfiddle.net/jonathansampson/dAQVM/
이벤트 핸들러를 유지하면서 복제하는 경우 이벤트 위임을 사용하여 상위 요소에서이 제어에 대한 클릭을 처리하는 데 고려할 수있는 문제가있는 경우 :
$("form").on("focus", "#control", doStuff);
따라서 컨트롤을 새로 고칠 때 처리기와 요소를 복제 할 필요가 없습니다.
답변
Jquery는 크로스 브라우저 / 이전 브라우저 문제를 처리해야합니다.
이것은 내가 테스트 한 최신 브라우저에서 작동합니다 : Chromium v25, Firefox v20, Opera v12.14
jquery 1.9.1 사용
HTML
<input id="fileopen" type="file" value="" />
<button id="clear">Clear</button>
jquery
$("#clear").click(function () {
$("#fileopen").val("");
});
에 jsfiddle
다음 자바 스크립트 솔루션은 위의 브라우저에서 저에게 효과적이었습니다.
document.getElementById("clear").addEventListener("click", function () {
document.getElementById("fileopen").value = "";
}, false);
에 jsfiddle
IE로 테스트 할 방법이 없지만 이론적으로는 작동합니다. MS가 다른 방식으로 수행했기 때문에 IE가 Javascript 버전이 작동하지 않을만큼 충분히 다른 경우 jquery 메소드는 귀하를 대신하여 처리해야합니다. 그렇지 않으면 jquery 팀과 함께 jquery 팀을 지적 할 가치가 있습니다. IE가 요구하는 방법. ( “IE에서는 작동하지 않을 것”이라고 말하는 사람들이 있지만 IE에서 작동하는 방식을 보여주는 바닐라 자바 스크립트 (아마도 “보안 기능”?)는없는 것으로 보입니다. 아마도 MS에게도 버그로보고 할 것입니다. 최신 릴리스에서 수정되도록))
다른 답변에서 언급했듯이 jquery 포럼 의 게시물
if ($.browser.msie) {
$('#file').replaceWith($('#file').clone());
} else {
$('#file').val('');
}
그러나 jquery는 이제 브라우저 테스트 jquery.browser에 대한 지원을 제거 했습니다.
이 자바 스크립트 솔루션도 저에게 효과적이었습니다 .jquery.replaceWith 메소드 와 동일한 바닐라 입니다.
document.getElementById("clear").addEventListener("click", function () {
var fileopen = document.getElementById("fileopen"),
clone = fileopen.cloneNode(true);
fileopen.parentNode.replaceChild(clone, fileopen);
}, false);
에 jsfiddle
중요한 점은 cloneNode 메소드가 연관된 이벤트 핸들러를 보존하지 않는다는 것입니다.
이 예를 참조하십시오.
document.getElementById("fileopen").addEventListener("change", function () {
alert("change");
}, false);
document.getElementById("clear").addEventListener("click", function () {
var fileopen = document.getElementById("fileopen"),
clone = fileopen.cloneNode(true);
fileopen.parentNode.replaceChild(clone, fileopen);
}, false);
에 jsfiddle
그러나 jquery.clone 은 이것을 제공합니다 [* 1]
$("#fileopen").change(function () {
alert("change");
});
$("#clear").click(function () {
var fileopen = $("#fileopen"),
clone = fileopen.clone(true);
fileopen.replaceWith(clone);
});
에 jsfiddle
[* 1] 그것의 사본 유지로 이벤트가 jQuery의 방법으로 추가 된 경우 JQuery와이 작업을 수행 할 수 jquery.data을 그것은 속임수의 비트, 그래서 그것을, 그렇지 않으면 작동하지 않습니다 / 해결 방법과 수단 일이 아니다 다른 방법이나 라이브러리간에 호환됩니다.
document.getElementById("fileopen").addEventListener("change", function () {
alert("change");
}, false);
$("#clear").click(function () {
var fileopen = $("#fileopen"),
clone = fileopen.clone(true);
fileopen.replaceWith(clone);
});
에 jsfiddle
첨부 된 이벤트 핸들러를 요소 자체에서 직접 가져올 수 없습니다.
여기에 바닐라 자바 스크립트의 일반적인 원칙이 있습니다. 이것은 다른 모든 라이브러리에서 jquery가 수행하는 방식입니다.
(function () {
var listeners = [];
function getListeners(node) {
var length = listeners.length,
i = 0,
result = [],
listener;
while (i < length) {
listener = listeners[i];
if (listener.node === node) {
result.push(listener);
}
i += 1;
}
return result;
}
function addEventListener(node, type, handler) {
listeners.push({
"node": node,
"type": type,
"handler": handler
});
node.addEventListener(type, handler, false);
}
function cloneNode(node, deep, withEvents) {
var clone = node.cloneNode(deep),
attached,
length,
evt,
i = 0;
if (withEvents) {
attached = getListeners(node);
if (attached) {
length = attached.length;
while (i < length) {
evt = attached[i];
addEventListener(clone, evt.type, evt.handler);
i += 1;
}
}
}
return clone;
}
addEventListener(document.getElementById("fileopen"), "change", function () {
alert("change");
});
addEventListener(document.getElementById("clear"), "click", function () {
var fileopen = document.getElementById("fileopen"),
clone = cloneNode(fileopen, true, true);
fileopen.parentNode.replaceChild(clone, fileopen);
});
}());
에 jsfiddle
물론 jquery와 다른 라이브러리에는 그러한 목록을 유지하는 데 필요한 다른 모든 지원 방법이 있습니다. 이것은 단지 시연입니다.
답변
명백한 보안상의 이유로 파일 입력 값을 빈 문자열로 설정할 수 없습니다.
필드가있는 양식을 재설정하거나 다른 필드가 포함 된 양식의 파일 입력 만 재설정하려면 다음을 사용하십시오.
function reset_field (e) {
e.wrap('<form>').parent('form').trigger('reset');
e.unwrap();
}
예를 들면 다음과 같습니다. http://jsfiddle.net/v2SZJ/1/
답변
이것은 나를 위해 작동합니다.
$("#file").replaceWith($("#file").clone());
http://forum.jquery.com/topic/how-to-clear-a-file-input-in-ie
도움이 되길 바랍니다.
답변
IE8에서는 보안을 위해 파일 업로드 필드를 읽기 전용으로 만들었습니다. IE 팀 블로그 게시물을 참조하십시오 .
역사적으로 HTML 파일 업로드 컨트롤 ()은 수많은 정보 유출 취약점의 원인이었습니다. 이러한 문제를 해결하기 위해 컨트롤의 동작이 두 가지로 변경되었습니다.
사용자가 컨트롤에 로컬 파일 경로를 입력하도록 속이는 “스틸 링”키 입력에 의존하는 공격을 차단하기 위해 이제 파일 경로 편집 상자가 읽기 전용입니다. 파일 찾아보기 대화 상자를 사용하여 업로드 할 파일을 명시 적으로 선택해야합니다.
또한 인터넷 영역에 대해 “파일을 업로드 할 때 로컬 디렉토리 경로 포함”URLAction이 “사용 안 함”으로 설정되었습니다. 이 변경은 잠재적으로 민감한 로컬 파일 시스템 정보가 인터넷으로 유출되는 것을 방지합니다. 예를 들어, 전체 경로 C : \ users \ ericlaw \ documents \ secret \ image.png를 제출하지 않고 Internet Explorer 8은 이제 파일 이름 image.png 만 제출합니다.
답변
$("#control").val('')
당신이 필요한 전부입니다! JQuery 1.11을 사용하여 Chrome에서 테스트
다른 사용자도 Firefox에서 테스트했습니다.