क्या <input type='file' />
jQuery के साथ नियंत्रण मूल्य को साफ़ करना संभव है ? मैंने निम्नलिखित कोशिश की है:
$('#control').attr({ value: '' });
लेकिन यह काम नहीं कर रहा है।
क्या <input type='file' />
jQuery के साथ नियंत्रण मूल्य को साफ़ करना संभव है ? मैंने निम्नलिखित कोशिश की है:
$('#control').attr({ value: '' });
लेकिन यह काम नहीं कर रहा है।
जवाबों:
आसान: आप <form>
तत्व के चारों ओर लपेटते हैं , फ़ॉर्म पर कॉल रीसेट करें, फिर उपयोग करके फ़ॉर्म को हटा दें .unwrap()
। .clone()
इस धागे में अन्यथा समाधानों के विपरीत , आप अंत में उसी तत्व के साथ समाप्त होते हैं (कस्टम गुण जो उस पर सेट किए गए थे सहित)।
परीक्षण और ओपेरा, फ़ायरफ़ॉक्स, सफारी, क्रोम और 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>
जैसा कि नीचे टिमो नोट करता है, अगर आपके पास फ़ील्ड के रीसेट को ट्रिगर करने के लिए बटन हैं, तो आपको ईवेंट पर <form>
कॉल .preventDefault()
करने से रोकना <button>
होगा।
आईई 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);
यह किसी भी हैंडलर की आवश्यकता को नियंत्रित करने के लिए तत्व के साथ-साथ क्लोन करने से रोकता है।
input.value = null;
Jquery आपके लिए क्रॉस-ब्राउज़र / पुराने ब्राउज़र के मुद्दों का ध्यान रखने वाला है।
यह मेरे द्वारा परीक्षण किए गए आधुनिक ब्राउज़रों पर काम करता है: क्रोमियम v25, फ़ायरफ़ॉक्स v20, ओपेरा v12.14
1.9.1 का उपयोग करते हुए
एचटीएमएल
<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 के साथ परीक्षण करने का कोई तरीका नहीं है, लेकिन सैद्धांतिक रूप से यह काम करना चाहिए। यदि IE पर्याप्त अलग है कि जावास्क्रिप्ट संस्करण काम नहीं करता है क्योंकि MS ने इसे अलग तरीके से किया है, तो jquery विधि को आपके लिए मेरे साथ व्यवहार करना चाहिए, अन्यथा यह jquery टीम के साथ-साथ इसे इंगित करने के लायक होगा। विधि जिसे IE की आवश्यकता है। (मैं लोगों को यह कहते हुए देखता हूं कि "यह IE पर काम नहीं करेगा", लेकिन यह दिखाने के लिए कोई वेनिला जावास्क्रिप्ट नहीं है कि यह IE पर काम कैसे करता है (माना जाता है कि "सुरक्षा सुविधा"?), शायद इसे एमएस के लिए एक बग के रूप में भी रिपोर्ट करें (यदि वे) इसे इस तरह से गिनें), ताकि यह किसी भी नई रिलीज में ठीक हो जाए)
जैसे एक अन्य उत्तर में बताया गया है, जक्वेरी फोरम पर एक पोस्ट
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
ध्यान देने वाली महत्वपूर्ण बात यह है कि क्लोनोडोड विधि संबद्ध ईवेंट हैंडलर को संरक्षित नहीं करती है।
इस उदाहरण को देखें।
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 और अन्य पुस्तकालयों में ऐसी सूची को बनाए रखने के लिए आवश्यक अन्य सभी समर्थन विधियाँ हैं, यह केवल एक प्रदर्शन है।
.val('')
। क्या यह अपलोड तत्व को क्लोन करने या नेस्टेड फॉर्म को जोड़ने से आसान नहीं है? +1।
.val("")
) ने पूरी तरह से काम किया, धन्यवाद। इनपुट को क्लोन करने और उसे बदलने की तुलना में बहुत सरल है।
स्पष्ट सुरक्षा कारणों से आप फ़ाइल इनपुट का मान सेट नहीं कर सकते, यहां तक कि एक खाली स्ट्रिंग के लिए भी।
आपको केवल उस फॉर्म को रीसेट करना है जहां फ़ील्ड या यदि आप केवल अन्य फ़ील्ड वाले फ़ॉर्म के फ़ाइल इनपुट को रीसेट करना चाहते हैं, तो इसका उपयोग करें:
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 \ दस्तावेज \ secret \ image.png सबमिट करने के बजाय, Internet Explorer 8 अब केवल फ़ाइल नाम छवि सबमिट करेगा।
$("#control").val('')
आपको जो चाहिए वह यह है! JQuery 1.11 का उपयोग करके Chrome पर परीक्षण किया गया
अन्य उपयोगकर्ताओं ने फ़ायरफ़ॉक्स में भी परीक्षण किया है।
मैं यहां सभी विकल्पों के साथ फंस गया। यहाँ एक हैक है जो मैंने बनाया है जो काम करता है:
<form>
<input type="file">
<button type="reset" id="file_reset" style="display:none">
</form>
और आप इसी तरह के कोड के साथ jQuery का उपयोग करके रीसेट को ट्रिगर कर सकते हैं:
$('#file_reset').trigger('click');
(jsfiddle: http://jsfiddle.net/eCbd6/ )
मैंने इसे समाप्त किया:
if($.browser.msie || $.browser.webkit){
// doesn't work with opera and FF
$(this).after($(this).clone(true)).remove();
}else{
this.setAttribute('type', 'text');
this.setAttribute('type', 'file');
}
सबसे सुरुचिपूर्ण समाधान नहीं हो सकता है, लेकिन यह उतना ही काम करता है जितना मैं बता सकता हूं।
मैंने https://github.com/malsup/form/blob/master/jquery.form.js का उपयोग किया है , जिसमें एक फ़ंक्शन है clearInputs()
, जिसे क्रॉसब्रोसर, अच्छी तरह से परीक्षण किया गया है, उपयोग करने में आसान है और IE मुद्दे और छिपे हुए फ़ील्ड को भी हैंडल करता है अगर जरुरत हो। हो सकता है कि केवल फ़ाइल इनपुट को साफ़ करने के लिए थोड़ा लंबा समाधान हो, लेकिन यदि आप क्रॉसब्रोसर फ़ाइल अपलोड के साथ काम कर रहे हैं, तो यह समाधान अनुशंसित है।
उपयोग आसान है:
// सभी फ़ाइल फ़ील्ड साफ़ करें: $ ( "इनपुट: फ़ाइल") clearInputs ();। // स्पष्ट फ़ील्ड भी छिपाएं: $ ( "इनपुट: फ़ाइल") clearInputs (सही);। // विशिष्ट फ़ील्ड साफ़ करें: $ ( "# Myfilefield1, # myfilefield2") clearInputs ()।;
/ ** * चयनित प्रपत्र तत्वों को साफ़ करता है। * / $ .fn.clearFields = $ .fn.clearInputs = function (शामिल) {{ var re = / ^ (?: color | date | डेटाइम | ईमेल | महीना | नंबर | पासवर्ड | रेंज | खोज | tel। टेक्स्ट | समय | url | सप्ताह) $ / i // 'छिपी' इस सूची में नहीं है यह वापस लौटें। (फ़ंक्शन () { var t = this.type, tag = this.tagName.toLowerCase (); if (re.test (t) || टैग == 'textarea') { this.value = ''; } और अगर (t == 'चेकबॉक्स' || t == 'रेडियो') { this.checked = false; } और अगर (टैग == 'चयन') { this.selectedIndex = -1; } और अगर (t == "फ़ाइल") { अगर (/MSIE/.test(navigator.userAgent)) { $ (This) .replaceWith ($ (this) .clone (सही)); } अन्य { $ (This) .val ( ''); } } और अगर (शामिल) { // शामिल किया गया मान सही हो सकता है, या यह चयनकर्ता स्ट्रिंग हो सकता है // एक विशेष परीक्षण का संकेत; उदाहरण के लिए: // $ ('# myForm')। ClearForm ('। विशेष: छिपा हुआ') // ऊपर दिए गए छिपे इनपुट्स को साफ करेगा, जिसमें 'विशेष' का वर्ग है। अगर ((शामिल है === सच और& /hidden/.test(t)) || (टाइपऑफ़ में शामिल हैं == 'स्ट्रिंग' && $ (यह) .is (शामिल है)) this.value = ''; } }); };
फ़ाइल इनपुट का मान केवल (सुरक्षा कारणों से) पढ़ा जाता है। आप इसे प्रोग्रामिक रूप से रिक्त नहीं कर सकते हैं (फॉर्म की रीसेट () विधि को कॉल करने के अलावा, जिसमें उस क्षेत्र की तुलना में व्यापक गुंजाइश है)।
मैं HTML फ़ाइल इनपुट को साफ करने के लिए सरल और स्वच्छ तरीके की तलाश में हूं, उपरोक्त उत्तर बहुत अच्छे हैं, लेकिन उनमें से कोई भी वास्तव में जवाब नहीं देता है कि मैं क्या देख रहा हूं, जब तक कि मैं वेब पर सरल तरीके से ऐसा करने के लिए नहीं आया:
var $input = $("#control");
$input.replaceWith($input.val('').clone(true));
सारा श्रेय क्रिस कॉयर को जाता है ।
// Referneces
var control = $("#control"),
clearBn = $("#clear");
// Setup the clear functionality
clearBn.on("click", function(){
control.replaceWith( control.val('').clone( true ) );
});
// Some bound handlers to preserve when cloning
control.on({
change: function(){ console.log( "Changed" ) },
focus: function(){ console.log( "Focus" ) }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="control">
<br><br>
<a href="#" id="clear">Clear</a>
.clone()
काम करता है नहीं ओपेरा में (और संभवतः अन्य) काम करते हैं। यह सामग्री रखता है।
मेरे लिए यहां सबसे करीबी तरीका जोनाथन का था, हालांकि यह सुनिश्चित करना कि इस क्षेत्र ने अपने नाम, वर्गों, आदि को मेरे मामले में गंदे कोड के लिए संरक्षित किया था।
कुछ इस तरह से काम हो सकता है (क्वेंटिन को भी धन्यवाद):
function clearInput($source) {
var $form = $('<form>')
var $targ = $source.clone().appendTo($form)
$form[0].reset()
$source.replaceWith($targ)
}
मैं निम्नलिखित का उपयोग करके इसे प्राप्त करने में कामयाब रहा हूं ...
function resetFileElement(ele)
{
ele.val('');
ele.wrap('<form>').parent('form').trigger('reset');
ele.unwrap();
ele.prop('files')[0] = null;
ele.replaceWith(ele.clone());
}
यह IE10, FF, क्रोम और ओपेरा में परीक्षण किया गया है।
दो कैविएट हैं ...
फिर भी एफएफ में ठीक से काम नहीं करता है, यदि आप पृष्ठ को ताज़ा करते हैं, तो फ़ाइल तत्व चयनित फ़ाइल के साथ फिर से आबाद हो जाता है। यह जानकारी कहाँ से मिल रही है यह मेरे से परे है। फ़ाइल इनपुट तत्व से संबंधित और क्या मैं संभव है कि स्पष्ट करने की कोशिश करूं?
फ़ाइल इनपुट तत्व से जुड़ी किसी भी घटना पर प्रतिनिधिमंडल का उपयोग करना याद रखें, इसलिए क्लोन बनाने के बाद भी वे काम करते हैं।
जो मुझे समझ में नहीं आता है वह यह है कि धरती पर किसने सोचा था कि आप एक अमान्य अस्वीकार्य फ़ाइल चयन से एक इनपुट फ़ील्ड को साफ़ नहीं कर सकते?
ठीक है, मुझे गतिशील रूप से मान के साथ सेट न करने दें ताकि मैं किसी उपयोगकर्ता के OS से फ़ाइलों को प्राप्त न कर सकूं, लेकिन मुझे एक अमान्य चयन को पूरी तरह से रीसेट किए बिना स्पष्ट कर देना चाहिए।
यह किसी भी तरह एक फिल्टर के अलावा और IE10 में 'स्वीकार' कुछ भी नहीं करता है, यह एमएस वर्ड माइम प्रकारों को भी नहीं समझता है, यह एक मजाक है!
.pop()
इसे सेट करने के बजाय फ़ाइलों की सरणी पर उपयोग करना है। यह फ़ाइल को ठीक से साफ़ करने के लिए लगता है।
मैंने उन तकनीकों का सबसे अधिक उपयोग करने की कोशिश की, जिनका उल्लेख उपयोगकर्ताओं ने किया, लेकिन उनमें से किसी ने भी सभी ब्राउज़रों में काम नहीं किया। यानी: क्लोन () फ़ाइल इनपुट के लिए एफएफ में काम नहीं करता है। मैंने फ़ाइल इनपुट को मैन्युअल रूप से कॉपी करना समाप्त कर दिया, और फिर कॉपी किए गए के साथ मूल को बदल दिया। यह सभी ब्राउज़रों में काम करता है।
<input type="file" id="fileID" class="aClass" name="aName"/>
var $fileInput=$("#fileID");
var $fileCopy=$("<input type='file' class='"+$fileInput.attr("class")+" id='fileID' name='"+$fileInput.attr("name")+"'/>");
$fileInput.replaceWith($fileCopy);
$("input[type=file]").wrap("<div id='fileWrapper'/>");
$("#fileWrapper").append("<div id='duplicateFile' style='display:none'>"+$("#fileWrapper").html()+"</div>");
$("#fileWrapper").html($("#duplicateFile").html());
यह क्रोम, एफएफ और सफारी के साथ काम करता है
$("#control").val("")
IE या ओपेरा के साथ काम नहीं कर सकता
बटन के वांछित कार्यों के बाद इसे अतुल्यकालिक बनाएं और इसे रीसेट करें।
<!-- Html Markup --->
<input id="btn" type="file" value="Button" onchange="function()" />
<script>
//Function
function function(e) {
//input your coding here
//Reset
var controlInput = $("#btn");
controlInput.replaceWith(controlInput = controlInput.val('').clone(true));
}
</script>
function clear() {
var input = document.createElement("input");
input.setAttribute('type', 'file');
input.setAttribute('value', '');
input.setAttribute('id', 'email_attach');
$('#email_attach').replaceWith( input.cloneNode() );
}
यह मेरे लिए काम नहीं करता है:
$('#Attachment').replaceWith($(this).clone());
or
$('#Attachment').replaceWith($('#Attachment').clone());
इसलिए asp mvc में मैं फ़ाइल इनपुट को बदलने के लिए रेजर सुविधाओं का उपयोग करता हूं। पहले आईडी और नाम के साथ इनपुट स्ट्रिंग के लिए एक वैरिएबल बनाएं और फिर इसे पेज में दिखाने और रीसेट बटन पर क्लिक करने के लिए उपयोग करें:
@{
var attachmentInput = Html.TextBoxFor(c => c.Attachment, new { type = "file" });
}
@attachmentInput
<button type="button" onclick="$('#@(Html.IdFor(p => p.Attachment))').replaceWith('@(attachmentInput)');">--</button>
एक आसान तरीका इनपुट प्रकार को बदल रहा है और इसे फिर से वापस बदल सकता है।
कुछ इस तरह:
var input = $('#attachments');
input.prop('type', 'text');
input.prop('type', 'file')
यह आसान है (ओपेरा को छोड़कर सभी ब्राउज़रों में काम करता है):
$('input[type=file]').each(function(){
$(this).after($(this).clone(true)).remove();
});
जेएस फिडल: http://jsfiddle.net/cw84x/1/
reset()
उदा।reset2()
, क्योंकि कम से कम क्रोम में सभी फ़ील्ड साफ़ हो जाते हैं यदि यह हैreset()
। और सबमिट करने से रोकने के लिए कॉल क्लीयर करने के बाद event.preventDefault () जोड़ें। इस तरह<button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>
:। कार्य उदाहरण: jsfiddle.net/rPaZQ/23 ।