कैसे फ़ाइल चयन पर आग की घटना के लिए


95

मैंने एक रूप दिया है

<form  onSubmit="return disableForm(this);" action="upload.php" method="post" name="f" id="wizecho" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button onClick="return disableForm(this),ajaxUpload(this.form,'wizecho_upload.php', '&lt;br&gt;Uploading image please wait.....&lt;br&gt;'); return false;">
        Upload Image
    </button>
</form>

यह एक छवि अपलोड करना है।

यहां मुझे छवि अपलोड करने के लिए बटन पर क्लिक करने की आवश्यकता है और मुझे onClickघटना का उपयोग करना है । मैं अपलोड बटन को हटाना चाहता हूं और जैसे ही इनपुट पर फ़ाइल का चयन किया जाता है, मैं घटना को आग देना चाहता हूं। मैं उसको कैसे करू??


यदि आप एक ही फ़ाइल को दो बार चुनने के बारे में चिंतित हैं, तो @applecrusher के पास चयनित उत्तर stackoverflow.com/a/40581284/1520304
होगा

जवाबों:


130

फ़ाइल इनपुट पर परिवर्तन ईवेंट का उपयोग करें।

$("#file").change(function(){
         //submit the form here
 });

32
और तब क्या होता है जब आप फॉर्म को अतुल्यकालिक रूप से जमा करते हैं, पृष्ठ से दूर नहीं जाते हैं, फिर उसी फ़ाइल को फिर से अपलोड करने का प्रयास करते हैं? यह कोड केवल एक बार निष्पादित करेगा, दूसरी बार, एक ही फ़ाइल का चयन करने से एक परिवर्तन की घटना को अंजाम नहीं दिया जाएगा
क्रिस्टोफर थॉमस

6
@ChristopherThomas की आपत्ति बिल्कुल यही है कि मैं यहाँ क्यों हूँ, और सौभाग्य से नीचे एक बहुत ही कम-से-कम प्रतिक्रिया है जो इसे हल करती है, सालों बाद: stackoverflow.com/a/40581284/4526479
Kyle Baker

1
जब मैं एक ही फाइल को फिर से चुनता हूं तो चेंज इवेंट ट्रिगर नहीं होता है। कोई और तरीका जो हर बार काम कर सकता है?
T

1
@ T @ Mᴀʀᴇǫ अपनी ऊपर वाली टिप्पणी देखें।
डेविड लोपेज

3
तथ्य यह है कि जवाब शुद्ध जावास्क्रिप्ट का उपयोग नहीं करता है सिर्फ गलत है
दिमित्री फिलिप्पो

68

आप इनपुट फ़ील्ड पर ऑन्चेंज ईवेंट के लिए सदस्यता ले सकते हैं:

<input type="file" id="file" name="file" />

और फिर:

document.getElementById('file').onchange = function() {
    // fire the upload here
};

49

यह एक पुराना प्रश्न है, जिसे नए उत्तर की आवश्यकता है जो @Christopher Thomas की चिंता को स्वीकार करते हैं, जो उत्तर की टिप्पणियों में ऊपर दिया गया है। यदि आप पृष्ठ से दूर नहीं जाते हैं और फिर दूसरी बार फ़ाइल का चयन करते हैं, तो आपको क्लिक करने या टचस्टार्ट (मोबाइल के लिए) करने पर मूल्य को साफ़ करने की आवश्यकता होती है। जब आप पृष्ठ से दूर जाते हैं और jquery का उपयोग करते हैं तो भी नीचे काम करेंगे:

//the HTML
<input type="file" id="file" name="file" />



//the JavaScript

/*resets the value to address navigating away from the page 
and choosing to upload the same file */ 

$('#file').on('click touchstart' , function(){
    $(this).val('');
});


//Trigger now when you have selected any file 
$("#file").change(function(e) {
    //do whatever you want here
});

क्या यह क्रॉस-ब्राउज़र संगत है? ऐसा लगता है कि यह सिर्फ उपयोग कर रहा है val(''), जो अधिकांश ब्राउज़रों में काम नहीं करता है।
सीन केंडल

किस ब्राउज़र ने यह काम नहीं किया है कि आपने कोशिश की है? यदि यह अभी भी आपके लिए एक मुद्दा है तो ऑब्जेक्ट को स्वयं से क्लोन करने का प्रयास करें।
Applecrusher

2
मेरा मुद्दा उपयोग कर रहा था element.setAttribute("value", "")यदि आप jQuery का उपयोग नहीं कर रहे हैं, तो आपको element.value = ""फ़ाइल तत्व को वास्तव में ठीक से साफ़ करने के लिए उपयोग करने की आवश्यकता है।
फिल

1

फ़ाइल लोड सफलतापूर्वक होने के बाद आप जो कुछ भी करना चाहते हैं, करें। आपकी फ़ाइल प्रोसेसिंग के पूरा होने के बाद फ़ाइल नियंत्रण का मूल्य ब्लैंक नियंत्रण के लिए सेट करें।। thechange () को हमेशा फ़ाइल नाम परिवर्तन या नहीं भी कहा जाएगा। उदाहरण के लिए आप यह काम कर सकते हैं और मेरे लिए आकर्षण की तरह काम कर सकते हैं

  $('#myFile').change(function () {
    LoadFile("myFile");//function to do processing of file.
    $('#myFile').val('');// set the value to empty of myfile control.
    });

1

जब आप एक ही फ़ाइल को कई बार अपलोड करते हैं तो vue उपयोगकर्ताओं के लिए समस्या हल हो जाती है और @change घटना ट्रिगर नहीं होती है:

 <input
      ref="fileInput"
      type="file"
      @click="onClick"
    />
  methods: {
    onClick() {
       this.$refs.fileInput.value = ''
       // further logic for file...
    }
  }

<input type = "file" @ change = "onFileChange" वर्ग = "इनपुट अपलोड-इनपुट" Ref = "inputFile" /> स्वयं। $ refs.inputFile.value = ''
प्रगति

0

<input type = "file" @ change = "onFileChange" वर्ग = "इनपुट अपलोड-इनपुट" Ref = "inputFile" />

onFileChange(e) {
//upload file and then delete it from input 
 self.$refs.inputFile.value = ''
}

0

es6 का उपयोग कर वेनिला जे.एस.

document.querySelector('input[name="file"]').addEventListener('change', (e) => {
 const file = e.target.files[0];
  // todo: use file pointer
});
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.