বাতিল ফাইল ফাইল ইনপুট ক্লিক করা হয় কিভাবে সনাক্ত করতে?


112

ব্যবহারকারী এইচটিএমএল ফাইল ইনপুট ব্যবহার করে কোনও ফাইল ইনপুট বাতিল করলে আমি কীভাবে সনাক্ত করতে পারি?

ওনচেঞ্জ আমাকে কোনও ফাইল চয়ন করার সময় তা সনাক্ত করতে দেয়, তবে তারা কখন বাতিল করে দেয় তাও জানতে চাই (কিছু না বাছাই করেই ফাইলটি বেছে নিন ডায়ালগটি বন্ধ করুন)।


কেউ যদি ফাইল বাছাই করে তা সনাক্ত করতে পারেন এবং তারপরে একটি প্রেরণ বাছতে চেষ্টা করুন তবে বাতিল করুন, আপনি খালি পাবেনe.target.files
jcubic

উত্তর:


45

সরাসরি সমাধান না হলেও এবং এটির পক্ষে খারাপ এটি কেবল (যতদূর আমি পরীক্ষা করেছি) অনফোকাসের সাথে কাজ করে (একটি সুন্দর সীমিত ইভেন্ট ব্লক করা প্রয়োজন) আপনি নিম্নলিখিতটি দিয়ে এটি অর্জন করতে পারেন:

document.body.onfocus = function(){ /*rock it*/ }

এ সম্পর্কে দুর্দান্ত, আপনি এটি ফাইলের ইভেন্টের সাথে সময়মতো সংযুক্ত / বিচ্ছিন্ন করতে পারেন এবং এটি লুকানো ইনপুটগুলি নিয়েও ভাল কাজ করবে বলে মনে হয় (আপনি যদি ক্রেডি ডিফল্ট ইনপুট টাইপের জন্য ভিজ্যুয়াল ওয়ার্কআরউন্ড ব্যবহার করছেন তবে = ' ফাইল ')। এর পরে, আপনাকে কেবল ইনপুট মানটি পরিবর্তন হয়েছে কিনা তা খুঁজে বের করতে হবে।

একটি উদাহরণ:

var godzilla = document.getElementById('godzilla')

godzilla.onclick = charge

function charge()
{
    document.body.onfocus = roar
    console.log('chargin')
}

function roar()
{
    if(godzilla.value.length) alert('ROAR! FILES!')
    else alert('*empty wheeze*')
    document.body.onfocus = null
    console.log('depleted')
}

এটি কর্মে দেখুন: http://jsfiddle.net/Shiboe/yuK3r/6/

দুঃখের বিষয়, এটি কেবল ওয়েবকিট ব্রাউজারগুলিতে কাজ করে বলে মনে হচ্ছে। হতে পারে অন্য কেউ ফায়ারফক্স / আইই সমাধান সমাধান করতে পারেন


আমি চাইনি প্রতিবারের ফোকাস ইভেন্টটি আগুন লাগবে, তাই আমি ব্যবহার করতে চেয়েছিলাম addEventListener("focus",fn,{once: true})। তবে আমি এটি ব্যবহার করে একেবারে গুলি ছুঁড়ে ফেলতে document.body.addEventListenerপারি নি .. কেন জানি না। পরিবর্তে আমি একই ফলাফল পেয়েছি window.addEventListener
উডেনকিটি

3
এটি আমার জন্য ফায়ারফক্স এবং এজে কাজ করে না। যাইহোক, mousemoveইভেন্টটি শোনার window.document পাশাপাশি শোনাও সর্বত্র কাজ focusকরে windowবলে মনে হচ্ছে (কমপক্ষে আধুনিক ব্রাউজারগুলিতে, আমি গত দশকের ধ্বংসযজ্ঞের বিষয়ে চিন্তা করি না)। মূলত, কোনও ক্রিয়াকলাপ ইভেন্ট এই টাস্কের জন্য ব্যবহার করা যেতে পারে যা একটি খোলা ফাইল খোলা ডায়ালগ দ্বারা অবরুদ্ধ।
জন ওয়েইজ

@ উডেনকিটি কীভাবে আপনি এটি অ্যাডএভেন্টলিস্টনার ব্যবহার করে বাস্তবায়ন করেছেন। আমি এটি কৌণিক এবং ডকুমেন্টে করার চেষ্টা করছি me যে কেউ আমার পক্ষে কাজ করছে না
টেরেন্স জ্যাকসন

এটি লুকানো ইনপুট ক্ষেত্রে কাজ করে না।
সেবাস্তিয়ান

20

আপনি পারবেন না।

ফাইল সংলাপের ফলাফল ব্রাউজারের সামনে প্রকাশিত হয় না।


ফাইল চয়নকারীটি খোলা আছে কিনা তা যাচাই করা সম্ভব?
পিপিপি

1
@ পিপিপি - না। ব্রাউজারটি এটি আপনাকে বলে না।
ওদেড

6
"ফাইল সংলাপের ফলাফল ব্রাউজারের সামনে প্রকাশিত হয়নি।" যদি ডায়ালগটি কোনও ফাইল নির্বাচন করে বন্ধ করা হয় তবে এটি সত্য নয়।
ট্রেভর

3
পরিবর্তন করে ফাইল ডায়ালগ দ্বারা আলোড়ন সৃষ্টি ব্রাউজার উন্মুক্ত করা হয়। দেখুন, যদি কোনও ফাইল বাছাই না করা থাকে এবং পরে কোনও ফাইল নির্বাচন করা না থাকে, তবে কিছুই পরিবর্তন হয়নি, সুতরাং কোনও changeইভেন্ট প্রেরণ করা হয় না ।
জন ওয়েইজ

1
এছাড়াও, যদি কোনও ফাইল ইতিমধ্যে নির্বাচিত হয় এবং আপনি আবার একই ফাইলটি নির্বাচন করেন তবে এর changeজন্য কোনও ইভেন্ট প্রেরণ করা হবে না।
প্যাট্রিক রবার্টস

16

আমি একটি উপন্যাস সমাধান নিয়ে আসার পর থেকে আমি এই প্রশ্নটিতে আমার টুপি ফেলে দেব। আমার কাছে একটি প্রগ্রেসিভ ওয়েব অ্যাপ্লিকেশন রয়েছে যা ব্যবহারকারীদের ফটো এবং ভিডিও ক্যাপচার করতে এবং সেগুলি আপলোড করতে দেয় upload সম্ভব হলে আমরা ওয়েবআরটিটিসি ব্যবহার করি তবে কম সমর্থন * কাশি সাফারি কাশি * এর ডিভাইসগুলির জন্য HTML5 ফাইল পিকারে ফিরে যান।আপনি যদি এমন একটি অ্যান্ড্রয়েড / আইওএস মোবাইল ওয়েব অ্যাপ্লিকেশনটিতে বিশেষভাবে কাজ করছেন যা ফটো / ভিডিওগুলি সরাসরি ক্যাপচারের জন্য নেটিভ ক্যামেরা ব্যবহার করে, তবে এটি আমার কাছে আসা সেরা সমাধান।

এই সমস্যার মূর্খতা হচ্ছে পৃষ্ঠাটি লোড হওয়ার পরে, fileহ'ল null, তবে যখন ব্যবহারকারী ডায়ালগটি খুলুন এবং "বাতিল করুন" টিপেন, fileতবুও nullএটি "পরিবর্তন" হয়নি, সুতরাং কোনও "পরিবর্তন" ইভেন্টটি ট্রিগার করা হয় না। ডেস্কটপগুলির জন্য, এটি খুব খারাপ নয় কারণ বেশিরভাগ ডেস্কটপ ইউআই কখন বাতিল করা হয় তা জানার উপর নির্ভর করে না, তবে মোবাইল ইউআই যা কোনও ফটো / ভিডিও ক্যাপচারের জন্য ক্যামেরা নিয়ে আসে তা খুব বুদ্ধিমান যখন একটি বাতিল টেপা হলে উপর নির্ভরশীল।

আমি মূলত ব্যবহৃত document.body.onfocusব্যবহারকারী কখন ফাইল পিকার থেকে ফিরে এসেছিল তা সনাক্ত করার জন্য ইভেন্টটি এবং এটি বেশিরভাগ ডিভাইসের জন্য কাজ করেছে, তবে ইভেন্টটি ট্রিগার না হওয়ার কারণে আইওএস 11.3 এটিকে ভেঙে দিয়েছে।

ধারণা

পৃষ্ঠার বর্তমানে অগ্রভূমি বা ব্যাকগ্রাউন্ডে রয়েছে কিনা তা নির্ধারণ করতে সিপিইউয়ের সময় নির্ধারণের জন্য এটির আমার সমাধানটি * কাঁপুন *। মোবাইল ডিভাইসগুলিতে, অগ্রভাগে থাকা অ্যাপটিতে প্রসেসিংয়ের সময় দেওয়া হয়। যখন কোনও ক্যামেরা দৃশ্যমান হয় এটি সিপিইউ সময় চুরি করে ব্রাউজারকে বঞ্চিত করবে। আমাদের কেবল কী করতে হবে তা পরিমাপ করার জন্য যে আমাদের পৃষ্ঠাটি কত প্রসেসিং সময় দেওয়া হয়, যখন ক্যামেরা চালু হয় তখন আমাদের উপলব্ধ সময়টি খুব কমবে। যখন ক্যামেরাটি বরখাস্ত হয় (হয় বাতিল বা অন্যথায়), তখন আমাদের উপলভ্য সময়টি ব্যাক আপ হয়।

বাস্তবায়ন

setTimeout()এক্স মিলিসেকেন্ডে কলব্যাক শুরু করার মাধ্যমে আমরা সিপিইউয়ের সময় পরিমাপ করতে পারি এবং তারপরে পরিমাপ করতে পারি যে এটি গ্রহণ করতে আসলে এটি কত সময় নিয়েছিল। এক্স মিলিসেকেন্ডের পরে ব্রাউজারটি কখনই একেবারে অনুরোধ করবে না , তবে এটি যদি যুক্তিসঙ্গত হয় তবে অবশ্যই আমাদের অগ্রভাগে থাকা উচিত। যদি ব্রাউজারটি খুব বেশি দূরে থাকে (অনুরোধের চেয়ে 10x এর বেশি ধীর) তবে আমাদের অবশ্যই পটভূমিতে থাকতে হবে। এর একটি প্রাথমিক বাস্তবায়ন এরকম:

function waitForCameraDismiss() {
  const REQUESTED_DELAY_MS = 25;
  const ALLOWED_MARGIN_OF_ERROR_MS = 25;
  const MAX_REASONABLE_DELAY_MS =
      REQUESTED_DELAY_MS + ALLOWED_MARGIN_OF_ERROR_MS;
  const MAX_TRIALS_TO_RECORD = 10;

  const triggerDelays = [];
  let lastTriggerTime = Date.now();

  return new Promise((resolve) => {
    const evtTimer = () => {
      // Add the time since the last run
      const now = Date.now();
      triggerDelays.push(now - lastTriggerTime);
      lastTriggerTime = now;

      // Wait until we have enough trials before interpreting them.
      if (triggerDelays.length < MAX_TRIALS_TO_RECORD) {
        window.setTimeout(evtTimer, REQUESTED_DELAY_MS);
        return;
      }

      // Only maintain the last few event delays as trials so as not
      // to penalize a long time in the camera and to avoid exploding
      // memory.
      if (triggerDelays.length > MAX_TRIALS_TO_RECORD) {
        triggerDelays.shift();
      }

      // Compute the average of all trials. If it is outside the
      // acceptable margin of error, then the user must have the
      // camera open. If it is within the margin of error, then the
      // user must have dismissed the camera and returned to the page.
      const averageDelay =
          triggerDelays.reduce((l, r) => l + r) / triggerDelays.length
      if (averageDelay < MAX_REASONABLE_DELAY_MS) {
        // Beyond any reasonable doubt, the user has returned from the
        // camera
        resolve();
      } else {
        // Probably not returned from camera, run another trial.
        window.setTimeout(evtTimer, REQUESTED_DELAY_MS);
      }
    };
    window.setTimeout(evtTimer, REQUESTED_DELAY_MS);
  });
}

আমি এটি আইওএস এবং অ্যান্ড্রয়েডের সাম্প্রতিক সংস্করণে পরীক্ষা করেছি, <input />উপাদানটিতে বৈশিষ্ট্যগুলি সেট করে নেটিভ ক্যামেরা আনছি ।

<input type="file" accept="image/*" capture="camera" />
<input type="file" accept="video/*" capture="camcorder" />

এটি আমার প্রত্যাশার চেয়ে অনেক বেশি ভাল কাজ করে। এটি একটি টাইমারকে 25 মিলিসেকেন্ডে চালিত হওয়ার অনুরোধ করে 10 টি ট্রায়াল চালায়। এটি তখন পরিমাপ করে যে প্রকৃতপক্ষে এটি শুরু করতে কতক্ষণ সময় লেগেছিল এবং যদি 10 টি ট্রায়ালের গড় গড় 50 মিলিসেকেন্ডের চেয়ে কম হয় তবে আমরা ধরে নিই যে আমাদের অবশ্যই অগ্রভাগে থাকা এবং ক্যামেরাটি চলে গেছে is যদি এটি 50 মিলিসেকেন্ডের বেশি হয় তবে আমাদের অবশ্যই পটভূমিতে থাকা উচিত এবং অপেক্ষা করা অবিরত করা উচিত।

কিছু অতিরিক্ত বিবরণ

আমি তার setTimeout()পরিবর্তে ব্যবহার করেছি setInterval()কারণ পরেরগুলি একাধিক অনুরোধ সারি করতে পারে যা পরস্পরের পরপরই কার্যকর হয়। এটি মারাত্মকভাবে আমাদের ডেটাতে শব্দকে বাড়িয়ে তুলতে পারে, তাই setTimeout()এটি করা একটু জটিল হলেও আমি আটকে গেলাম ।

এই নির্দিষ্ট নম্বরগুলি আমার পক্ষে ভাল কাজ করেছে, যদিও আমি কমপক্ষে একবারে দেখেছি যেখানে ক্যামেরা বরখাস্ত অকাল আগে সনাক্ত করা হয়েছিল। আমি বিশ্বাস করি এটি কারণ ক্যামেরাটি খোলার ক্ষেত্রে ধীর হতে পারে এবং ডিভাইসটি বাস্তবে ব্যাকগ্রাউন্ড হওয়ার আগে 10 টি ট্রায়াল চালাতে পারে। এই ফাংশনটি শুরু করার আগে আরও ট্রায়াল যুক্ত করা বা 25-50 মিলিসেকেন্ড অপেক্ষা করা তার জন্য কার্যকর হতে পারে।

ডেস্কটপ

দুর্ভাগ্যক্রমে, ডেস্কটপ ব্রাউজারগুলির জন্য এটি সত্যিই কাজ করে না। তাত্ত্বিকভাবে একই কৌশলটি সম্ভব কারণ তারা পটভূমি পৃষ্ঠাগুলির চেয়ে বর্তমান পৃষ্ঠাটিকে অগ্রাধিকার দেয়। তবে অনেকগুলি ডেস্কটপগুলির পৃষ্ঠাগুলি ব্যাকগ্রাউন্ড হওয়ার পরেও পৃষ্ঠাটি পুরো গতিতে চলমান রাখার পর্যাপ্ত সংস্থান রয়েছে, সুতরাং এই কৌশলটি বাস্তবে বাস্তবে কার্যকর হয় না।

বিকল্প সমাধান

একটি বিকল্প সমাধান অনেকেই উল্লেখ করেন না যে আমি এক্সপ্লোর করেছিলাম এটি একটি উপহাস করেছিল FileList। আমরা দিয়ে শুরু nullমধ্যে <input />এবং তারপর ব্যবহারকারী ক্যামেরা প্রর্দশিত হবে এবং বাতিল তারা ফিরে আসা null, যা একটি পরিবর্তন নয় এবং কোন ঘটনা আরম্ভ হবে। একটি সমাধান হ'ল <input />পৃষ্ঠার শুরুতে একটি ডামি ফাইল বরাদ্দ করা , সুতরাং nullএটি এমন একটি পরিবর্তন হিসাবে সেট করা যা উপযুক্ত ইভেন্টটিকে ট্রিগার করবে।

দুর্ভাগ্যক্রমে, একটি তৈরির কোনও সরকারী উপায় নেই FileList, এবং <input />উপাদানটির একটি FileListবিশেষত প্রয়োজন এবং এটি ছাড়া অন্য কোনও মান গ্রহণ করা হবে না null। স্বাভাবিকভাবেই, FileListঅবজেক্টগুলি সরাসরি নির্মাণ করা যায় না, কিছু পুরানো সুরক্ষা ইস্যুতে করুন যা আপাতদৃষ্টিতে প্রাসঙ্গিকও নয়। কোনও <input />উপাদানটির বাইরের অংশ হ'ল একমাত্র উপায় হ্যাক ব্যবহার করা যা কোনও ক্লিপবোর্ড ইভেন্টকে নকল করে ডেটা অনুলিপি করে যা এতে থাকতে পারেFileList (আপনি মূলত একটি ড্রাগ-এ-ড্রপ-এ-ফাইল-ফিকিং করছেন -আপনার ওয়েবসাইট ইভেন্ট)। এটি ফায়ারফক্সে সম্ভব, তবে আইওএস সাফারির জন্য নয়, তাই এটি আমার বিশেষ ব্যবহারের ক্ষেত্রে কার্যকর ছিল না।

ব্রাউজারগুলি, দয়া করে ...

এটি স্পষ্টতই হাস্যকর বলার দরকার নেই। ওয়েব পৃষ্ঠাগুলিকে শূন্য নোটিফিকেশন দেওয়া হয়েছে যে একটি গুরুতর ইউআই উপাদান পরিবর্তিত হয়েছে তা কেবল হাস্যকর। এটি সত্যই একটি বিশেষ ত্রুটি, কারণ এটি কখনই কোনও পূর্ণ-স্ক্রিন মিডিয়া ক্যাপচার ইউআইয়ের উদ্দেশ্যে তৈরি করা হয়নি, এবং "পরিবর্তন" ইভেন্টটি ট্রিগার না করা প্রযুক্তিগতভাবে অনুমেয়।

তবে , ব্রাউজার বিক্রেতারা কি এর বাস্তবতাটি চিনতে পারবেন? এটি কোনও নতুন "সম্পন্ন" ইভেন্টের মাধ্যমে সমাধান করা যেতে পারে যা কোনও পরিবর্তন না ঘটে এমনকি যদি ট্রিগার হয় বা আপনি যেভাবেই "পরিবর্তন" সঞ্চার করতে পারেন। হ্যাঁ, এটি অনুমানের বিরুদ্ধে হবে, তবে জাভাস্ক্রিপ্টের দিক থেকে আমার একটি পরিবর্তন ইভেন্ট ডুপ করা আমার পক্ষে তুচ্ছ, তবুও আমার নিজের "সম্পন্ন" ইভেন্টটি উদ্ভাবন করা মৌলিকভাবে অসম্ভব। এমনকি আমার সমাধানটি সত্যই হিউরিস্টিকস, যদি ব্রাউজারের অবস্থার কোনও গ্যারান্টি না থাকে।

যেমনটি দাঁড়িয়েছে, এই এপিআইটি মোবাইল ডিভাইসের জন্য মূলত অব্যবহৃত এবং আমি মনে করি অপেক্ষাকৃত সরল ব্রাউজার পরিবর্তন এটি ওয়েব বিকাশকারীদের জন্য * সাবান বক্স * থেকে সরিয়ে * অসীম সহজতর করে তুলতে পারে।



7

আপনি যখন কোনও ফাইল নির্বাচন করেন এবং খুলুন / বাতিল ক্লিক করেন, তখন inputউপাদানটির ফোকাস হ্রাস করা উচিত blur। প্রাথমিক ধরে নেওয়া যাক valueএর inputখালি থাকে, আপনার কোনো অ মান খালি blurহ্যান্ডলার একটি ঠিক আছে ইঙ্গিত হবে, এবং একটি খালি মান মানে হবে একটি বাতিল করুন।

আপডেট: blurযখন inputলুকানো থাকে তখন ট্রিগার হয় না । সুতরাং আপনি যদি অস্থায়ীভাবে প্রদর্শন করতে না চান তবে IFRAME- ভিত্তিক আপলোডগুলির সাথে এই কৌশলটি ব্যবহার করতে পারবেন না input


3
ফায়ারফক্স 10 বিটা এবং ক্রোম 16 এ, blurআপনি কোনও ফাইল নির্বাচন করার পরে ট্রিগার হয় না। অন্যান্য ব্রাউজারে চেষ্টা করা হয়নি।
ব্লেইস

1
এটি কাজ করে না - ক্লিকের সাথে সাথে ইনপুটটিতে অস্পষ্টতা ট্রিগার করা হয়। উইন 7-এ ক্রোম 63.0.3239.84 x64।
কিওয়ারটি

7
/* Tested on Google Chrome */
$("input[type=file]").bind("change", function() {
    var selected_file_name = $(this).val();
    if ( selected_file_name.length > 0 ) {
        /* Some file selected */
    }
    else {
        /* No file selected or cancel/close
           dialog button clicked */
        /* If user has select a file before,
           when they submit, it will treated as
           no file selected */
    }
});

6
আপনার elseবিবৃতিটি কখনও মূল্যায়ন হয় কিনা তা পরীক্ষা করে দেখেছেন?
জয়য়ারজো

যতদূর আমি মনে করি আমি এই উত্তরটি লেখার সময়, যদি ব্যবহারকারী কোনও ফাইল নির্বাচন করেন এবং ফাইলটি পুনরায় নির্বাচন করেন (তবে বাতিল করা হয়) তবে এটি কোনও ফাইল নির্বাচিত হিসাবে গণ্য হবে না, আমি কেবল এটি পরীক্ষার জন্য নির্বাচিত_ফাইলে_নাম পরিবর্তনশীলতে সতর্কতা ব্যবহার করি। যাইহোক, এর পর থেকে আর এটি পরীক্ষা করা হয়নি।
রিজকি

4
আমি বলতে পারি, কিছু ক্রস ব্রাউজার পরীক্ষার পরে, ফায়ারফক্স বাতিল হওয়ার পরিবর্তনের কোনও অনুষ্ঠান চালায় না, আবার নির্বাচিত বিদ্যমান ফাইলগুলি পুনরায় খোলা থাকলে এবং দ্বিতীয়বার ক্লিক করলে এটি বাতিল করে না। অদ্ভুত, আহ?
মিশ্র

7

এই সমাধানগুলির বেশিরভাগই আমার পক্ষে কাজ করে না।

সমস্যাটি হ'ল আপনি কখনই জানেন না যে কোন ঘটনাকে মুষ্টির সূচনা করা হবে, এটি clickনাকি change? আপনি কোনও অর্ডার ধরে নিতে পারবেন না, কারণ এটি সম্ভবত ব্রাউজারের প্রয়োগের উপর নির্ভর করে।

কমপক্ষে অপেরা এবং ক্রোমে (২০১৫ সালের শেষের দিকে) clickফাইলগুলির সাথে 'ফিলিং' ইনপুট দেওয়ার ঠিক আগে ট্রিগার করা হয়, যার ফলে আপনি কখনই ট্রিগার হতে files.length != 0দেরি না করে আপনি কখনই তার দৈর্ঘ্য জানতে পারবেন না ।clickchange

এখানে কোড:

var inputfile = $("#yourid");

inputfile.on("change click", function(ev){
    if (ev.originalEvent != null){
        console.log("OK clicked");
    }
    document.body.onfocus = function(){
        document.body.onfocus = null;
        setTimeout(function(){
            if (inputfile.val().length === 0) console.log("Cancel clicked");
        }, 1000);
    };
});

আপনি যদি পৃষ্ঠায় ক্লিক করেন ... "ক্লিক করা বাতিল করুন" ... = | (ক্রোমের সাথে পরীক্ষিত)
এডুয়ার্ডো লুসিও

5

ক্লিক ইভেন্টটি পাশাপাশি শুনতে।

শিবোর উদাহরণ অনুসরণ করে, এখানে একটি jQuery উদাহরণ রয়েছে:

var godzilla = $('#godzilla');
var godzillaBtn = $('#godzilla-btn');

godzillaBtn.on('click', function(){
    godzilla.trigger('click');
});

godzilla.on('change click', function(){

    if (godzilla.val() != '') {
        $('#state').html('You have chosen a Mech!');    
    } else {
        $('#state').html('Choose your Mech!');
    }

});

আপনি এটি এখানে ক্রিয়াতে দেখতে পারেন: http://jsfiddle.net/T3Vwz


1
আমি ক্রোম ৫১ এ পরীক্ষা করেছি, আপনি ফাইল নির্বাচন করার সময় এটি কার্যকর হয় না। সমাধানটি বিলম্ব যুক্ত করার জন্য: jsfiddle.net/7jfbmunh
বেনোইট

আপনার ফিডল আমার পক্ষে কাজ করে নি - ফায়ারফক্স 58.0.2 ব্যবহার করে
ব্যারিপিকার

4

আপনি আগের হিসাবে একই ফাইলটি চয়ন করেন এবং আপনি বাতিল ক্লিক করুন: এই ক্ষেত্রে আপনি বাতিলটিকে ধরতে পারেন।

আপনি এটি এর মতো করতে পারেন:

<input type="file" id="myinputfile"/>
<script>
document.getElementById('myinputfile').addEventListener('change', myMethod, false);
function myMethod(evt) {
  var files = evt.target.files; 
  f= files[0];
  if (f==undefined) {
     // the user has clicked on cancel
  }
  else if (f.name.match(".*\.jpg")|| f.name.match(".*\.png")) {
     //.... the user has choosen an image file
     var reader = new FileReader();
     reader.onload = function(evt) { 
        try {
        myimage.src=evt.target.result;
            ...
         } catch (err) {
            ...
         }
     };
  }     
  reader.readAsDataURL(f);          
</script>

1
এই পোস্টটি সত্যিই আমাকে সাহায্য করেছে
ভিপিকে

4
ঠিক না, যদি ব্যবহারকারী একই ফাইলটি নির্বাচন করে তবে এটি বাতিল নয় = (
টিয়াগো পেরেস ফ্রান্সিয়া

13
পরিবর্তন যদি আগত হয় তবেই গুলি চালায়। সুতরাং যদি ফাইলটি আগের মতো একই ফাইল হয় তবে অনভিজ্ঞ শ্রোতা ফায়ার করবে না।
শেন

1
আপনি প্রথম পরিবর্তনটি সনাক্ত করার পরে আপনি ইনপুট নির্বাচন (ইনপুট.ভ্যালু = '') সাফ করতে পারেন, যাতে ব্যবহারকারী আবার একই ফাইলটি নির্বাচন করে এমনকী দ্বিতীয়বারের মতবিনিময় চলবে।
ক্রিস

1
@ কোডগেমস এটিকে প্রোগ্রামগতভাবে ইনপুট.মূল্যটিকে একটি খালি স্ট্রিংয়ে সেট করার অনুমতি দেওয়া হয়েছে। তবে আপনি ঠিক বলেছেন যে এটি অন্য কোনও মানতে সেট করার অনুমতি নেই।
ক্রিস

4

সবচেয়ে সহজ উপায় হল অস্থায়ী স্মৃতিতে কোনও ফাইল রয়েছে কিনা তা পরীক্ষা করা। আপনি যদি প্রতিবার ফাইল ফাইল ইনপুট ক্লিক করে পরিবর্তন ইভেন্টটি পেতে চান আপনি এটি ট্রিগার করতে পারেন।

var yourFileInput = $("#yourFileInput");

yourFileInput.on('mouseup', function() {
    $(this).trigger("change");
}).on('change', function() {
    if (this.files.length) {
        //User chose a picture
    } else {
        //User clicked cancel
    }
});

2

যদি মোবাইল ওয়েবকিটে কাজ করে তবে শিবির সমাধান খুব ভাল হবে। আমি যেটা সামনে আসতে পারি তা হ'ল ফাইল ইনপুট উইন্ডোটি খোলার সময় কিছু ডম অবজেক্টে মাউসমেভ ইভেন্ট শ্রোতাদের যুক্ত করা যেমন:

 $('.upload-progress').mousemove(function() {
        checkForFiles(this);
      });
      checkForFiles = function(me) {
        var filefield = $('#myfileinput');
        var files = filefield.get(0).files;
        if (files == undefined || files[0] == undefined) $(me).remove(); // user cancelled the upload
      };

ফাইল ডায়লগটি খোলা থাকাকালীন পৃষ্ঠা থেকে মাউসমেভ ইভেন্টটি অবরুদ্ধ করা হয়েছে এবং এটি বন্ধ হয়ে গেলে ফাইল ইনপুটটিতে কোনও ফাইল আছে কিনা তা পরীক্ষা করে দেখুন। আমার ক্ষেত্রে আমি ফাইলটি আপলোড না হওয়া পর্যন্ত কোনও ক্রিয়াকলাপের সূচক জিনিসগুলি ব্লক করা চাই, সুতরাং আমি কেবল বাতিল হওয়ার পরে আমার সূচকটি সরাতে চাই।

তবে এটি মোবাইলের জন্য সমাধান করে না, যেহেতু সরানোর মতো কোনও মাউস নেই। আমার সমাধানটি নিখুঁত চেয়ে কম, তবে আমি এটি যথেষ্ট ভাল বলে মনে করি।

       $('.upload-progress').bind('touchstart', function() {
        checkForFiles(this);
      });

এখন আমরা একই ফাইলগুলি পরীক্ষা করতে পর্দায় একটি স্পর্শের জন্য শুনছি। আমি দৃ confident়ভাবে আত্মবিশ্বাসী যে ব্যবহারকারীর আঙ্গুলটি এই ক্রিয়াকলাপের সূচকটি বাতিল এবং বরখাস্ত করার পরে খুব দ্রুত স্ক্রিনে লাগানো হবে।

কেউ কেবল ফাইল ইনপুট পরিবর্তন ইভেন্টের ক্রিয়াকলাপ সূচকটি যুক্ত করতে পারে, তবে মোবাইলে চিত্র নির্বাচন এবং পরিবর্তন ইভেন্ট ফায়ারিংয়ের মধ্যে প্রায় কয়েক সেকেন্ড পিছিয়ে থাকে, সুতরাং ক্রিয়াকলাপের সূচকটি প্রদর্শিত হওয়ার জন্য এটির চেয়ে আরও ভাল ইউএক্স প্রক্রিয়া শুরু


2

আমি এটি পেয়েছি এটি এখনও সবচেয়ে সহজ।

if ($('#selectedFile')[0].files.length > 1)
{
   // Clicked on 'open' with file
} else {
   // Clicked on 'cancel'
}

এখানে, selectedFileএকটি input type=file


এটি আমার জন্য একটি ভাল সমাধান, এটি বাদে> = 1 হওয়া উচিত
ব্রোন থুল্ক

2

আমি জানি এটি একটি খুব পুরানো প্রশ্ন তবে ঠিক যদি এটি কাউকে সহায়তা করে তবে আমি অনমাসমোভ ইভেন্টটি বাতিলটি সনাক্ত করতে ব্যবহার করতে গিয়ে জানতে পেরেছিলাম যে অল্প সময়ের মধ্যে এইরকম দুটি বা আরও বেশি ইভেন্টের পরীক্ষা করা দরকার ছিল। এর কারণ হ'ল ব্রাউজার (ক্রোম 65) দ্বারা প্রতিটি বার সিলেক্ট ফাইল ডায়ালগ উইন্ডো থেকে কার্সারটি সরানো হয় এবং প্রতিটি সময় এটি মূল উইন্ডো থেকে বেরিয়ে আসে এবং পিছনে ফিরে আসে single মাউস আন্দোলনের ইভেন্টগুলির একটি সহজ কাউন্টার কাউন্টারটিকে শূন্যে পুনরায় সেট করতে একটি স্বল্প সময়ের মেয়াদ উত্তীর্ণের সাথে ট্রিট কাজ করেছে।


1
প্রথম অনুচ্ছেদে একটি ভাল উত্তর, যদিও এটি আরও ভাল পাঠযোগ্যতার জন্য একাধিকটিতে বিভক্ত হতে পারে। কিন্তু এই দুটি "এসওএপবক্স" লাইন এটিকে উত্তরহীন সীমারেখা তৈরি করে কারণ প্রশ্নগুলির উত্তরের সাথে সম্পর্কিত নয়। আপনি কি নিজের উত্তরটি কিছুটা পুনঃব্যবহার / পুনঃব্যবহার করতে পারেন? ধন্যবাদ.
ফিল্ডার

1

আমার ক্ষেত্রে ব্যবহারকারীরা ছবি নির্বাচন করার সময় আমাকে জমা দেওয়ার বোতামটি আড়াল করতে হয়েছিল।

এই আমি এসেছি:

$(document).on('click', '#image-field', function(e) {
  $('.submit-button').prop('disabled', true)
})
$(document).on('focus', '#image-field'), function(e) {
  $('.submit-button').prop('disabled', false)
})

#image-fieldআমার ফাইল নির্বাচনকারী। যখন কোনওর উপর ক্লিক করা হয়, আমি ফর্ম জমা বোতামটি অক্ষম করি। মুল বক্তব্যটি হ'ল, যখন ফাইল ডায়লগটি বন্ধ হয়ে যায় - তারা কোনও ফাইল নির্বাচন করে বা বাতিল করে না - #image-fieldফোকাসটি ফিরে পেয়েছিল, তাই আমি সেই ইভেন্টটি শুনি।

হালনাগাদ

আমি দেখতে পেয়েছি, এটি সাফারি এবং পল্টেরজিস্ট / ফ্যান্টমজে কাজ করে না। আপনি যদি এটি প্রয়োগ করতে চান তবে এই তথ্যটি অ্যাকাউন্টে নিন।


1

শিবো এবং অ্যালেক্সের সমাধানগুলির সংমিশ্রণটি, আমি সবচেয়ে নির্ভরযোগ্য কোড পেয়েছি:

var selector = $('<input/>')
   .attr({ /* just for example, use your own attributes */
      "id": "FilesSelector",
      "name": "File",
      "type": "file",
      "contentEditable": "false" /* if you "click" on input via label, this prevents IE7-8 from just setting caret into file input's text filed*/
   })
   .on("click.filesSelector", function () {
      /* do some magic here, e.g. invoke callback for selection begin */
      var cancelled = false; /* need this because .one calls handler once for each event type */
      setTimeout(function () {
         $(document).one("mousemove.filesSelector focusin.filesSelector", function () {
            /* namespace is optional */
            if (selector.val().length === 0 && !cancelled) {
               cancelled = true; /* prevent double cancel */
               /* that's the point of cancel,   */
            }
         });                    
      }, 1); /* 1 is enough as we just need to delay until first available tick */
   })
   .on("change.filesSelector", function () {
      /* do some magic here, e.g. invoke callback for successful selection */
   })
   .appendTo(yourHolder).end(); /* just for example */

সাধারণত, মাউসমেভ ইভেন্টটি কৌশলটি কার্যকর করে, তবে ব্যবহারকারীরা একটি ক্লিক করেন এবং তার চেয়ে বেশি:

  • এস্কেপ কী (মাউস না সরানো) দ্বারা ফাইল ওপেন ডায়ালগ বাতিল হয়েছে, আবার ফাইল ডায়লগ খোলার জন্য আরও একটি সঠিক ক্লিক করেছে ...
  • ব্রাউজারের ফাইল ওপেন ডায়ালগটিতে ফিরে আসার চেয়ে এন্টার বা স্পেস কী এর মাধ্যমে আবার খোলার চেয়ে অন্য কোনও অ্যাপ্লিকেশনে ফোকাস পরিবর্তন করেছে ...

... আমরা মাউসমেভ ইভেন্টটি পাব না তাই কলব্যাক বাতিল করবেন না। তদুপরি, যদি ব্যবহারকারী দ্বিতীয় কথোপকথন বাতিল করে এবং একটি মাউস পদক্ষেপ নেয়, আমরা 2 টি বাতিল কলব্যাক পাব। ভাগ্যক্রমে, বিশেষ jQuery ফোকাস ইন ইভেন্টটি উভয় ক্ষেত্রেই দস্তাবেজগুলিতে বুদবুদ হয়, আমাদেরকে এ জাতীয় পরিস্থিতি এড়াতে সহায়তা করে। একমাত্র সীমাবদ্ধতা হ'ল যদি কোনও ইভেন্ট ফোকাসইন হয়।


আমি উবুন্টু 16.10 তে ক্রোম 56.0.2924.87 এ ওএস সংলাপে ফাইলগুলি নির্বাচন করার সময় mousemoveইভেন্টটি documentধরেছিলাম। কোনও সমস্যা নেই, যখন মাউসটি সরানো হচ্ছে না, বা ফাইলটি নির্বাচন করতে কেবল কীবোর্ড ব্যবহার করুন। আমি প্রতিস্থাপন করতে ছিল mousemoveদ্বারা keydownযত তাড়াতাড়ি সম্ভব বাতিল সনাক্ত করতে, কিন্তু না "খুব তাড়াতাড়ি", যখন ডায়ালগ এখনও খোলা ছিল।
ফারডিনানড প্রান্টল

1

আমি দেখতে পাচ্ছি যে আমার প্রতিক্রিয়াটি বেশ পুরানো হবে, তবে কখনও কম নয়। আমিও একই সমস্যার মুখোমুখি হয়েছি। সুতরাং এখানে আমার সমাধান। সর্পযুক্ত সবচেয়ে কার্যকর কোডটি ছিল কেজিএর একটি। তবে এটি পুরোপুরি কাজ করছে না এবং কিছুটা জটিল। তবে আমি এটিকে সরল করে দিয়েছি।

এছাড়াও, প্রধান সমস্যা নির্মাতা এই সত্যটি ছিল যে, 'পরিবর্তন' ইভেন্টটি ফোকাসের পরে তাত্ক্ষণিকভাবে আসে না, তাই আমাদের কিছু সময়ের জন্য অপেক্ষা করতে হবে।

"#appendfile" - কোন ব্যবহারকারী কোনও নতুন ফাইল সংযোজন করতে ক্লিক করে। Hrefs ফোকাস ইভেন্ট পান।

$("#appendfile").one("focusin", function () {
    // no matter - user uploaded file or canceled,
    // appendfile gets focus
    // change doesn't come instantly after focus, so we have to wait for some time
    // wrapper represents an element where a new file input is placed into
    setTimeout(function(){
        if (wrapper.find("input.fileinput").val() != "") {
            // user has uploaded some file
            // add your logic for new file here
        }
        else {
            // user canceled file upload
            // you have to remove a fileinput element from DOM
        }
    }, 900);
});

1

আপনি কেবল সীমিত পরিস্থিতিতে এটি সনাক্ত করতে পারেন। বিশেষত, ক্রোমে যদি কোনও ফাইল আগে নির্বাচন করা হয় এবং তারপরে ফাইল ডায়লগ ক্লিক করা হয় এবং ক্লিক করা বাতিল হয়, ক্রোম ফাইলটি সাফ করে এবং অন চেঞ্জ ইভেন্টটিকে আগুন ধরিয়ে দেয়।

https://code.google.com/p/chromium/issues/detail?id=2508

এই দৃশ্যে, আপনি অন চেঞ্জ ইভেন্টটি পরিচালনা করে এবং ফাইলগুলির সম্পত্তি পরীক্ষা করে এটি সনাক্ত করতে পারেন ।


1

নিম্নলিখিতটি আমার জন্য কাজ করছে বলে মনে হচ্ছে (ডেস্কটপ, উইন্ডোতে):

var openFile = function (mimeType, fileExtension) {
    var defer = $q.defer();
    var uploadInput = document.createElement("input");
    uploadInput.type = 'file';
    uploadInput.accept = '.' + fileExtension + ',' + mimeType;

    var hasActivated = false;

    var hasChangedBeenCalled = false;
    var hasFocusBeenCalled = false;
    var focusCallback = function () {
        if (hasActivated) {
            hasFocusBeenCalled = true;
            document.removeEventListener('focus', focusCallback, true);
            setTimeout(function () {
                if (!hasChangedBeenCalled) {
                    uploadInput.removeEventListener('change', changedCallback, true);
                    defer.resolve(null);
                }
            }, 300);
        }
    };

    var changedCallback = function () {
        uploadInput.removeEventListener('change', changedCallback, true);
        if (!hasFocusBeenCalled) {
            document.removeEventListener('focus', focusCallback, true);
        }
        hasChangedBeenCalled = true;
        if (uploadInput.files.length === 1) {
            //File picked
            var reader = new FileReader();
            reader.onload = function (e) {
                defer.resolve(e.target.result);
            };
            reader.readAsText(uploadInput.files[0]);
        }
        else {
            defer.resolve(null);
        }
    };
    document.addEventListener('focus', focusCallback, true); //Detect cancel
    uploadInput.addEventListener('change', changedCallback, true); //Detect when a file is picked
    uploadInput.click();
    hasActivated = true;
    return defer.promise;
}

এটি Angularjs $ q ব্যবহার করে তবে প্রয়োজনে আপনার অন্য প্রতিশ্রুতি কাঠামোর সাথে এটি প্রতিস্থাপন করতে সক্ষম হওয়া উচিত।

আইই ১১, এজ, ক্রোম, ফায়ারফক্সে পরীক্ষিত, তবে ফোকাস ইভেন্টটি চালিত না করায় এটি কোনও অ্যান্ড্রয়েড ট্যাবলেটে ক্রোমে কাজ করবে বলে মনে হচ্ছে না।


1

fileটাইপ ক্ষেত্র, frustratingly, (ব্লার সুদৃশ্য হবে) ঘটনা অনেকটা সাড়া নেই। আমি অনেক লোককে লক্ষ্য changeভিত্তিক সমাধানের পরামর্শ দিচ্ছি এবং সেগুলি নীচে নামছে।

changeকাজ করে, তবে এর একটি বড় ত্রুটি রয়েছে (বনাম যা আমরা ঘটতে চাই তাতে)।

আপনি যখন কোনও ফাইল ক্ষেত্র সমেত একটি পৃষ্ঠা নতুন করে লোড করবেন, বাক্সটি খুলুন এবং বাতিল টিপুন। হতাশার সাথে কিছুই বদলায় না

আমি যা করতে বেছে নিয়েছি তা একটি গেটেড-অবস্থায় লোড করা।

  • section#after-imageআমার ক্ষেত্রে ফর্মটির পরবর্তী অংশটি দৃশ্য থেকে গোপন রয়েছে। আমার file fieldপরিবর্তনগুলি যখন একটি আপলোড বোতাম প্রদর্শিত হয়। সফল আপলোড হওয়ার পরে, section#after-imageপ্রদর্শিত হয়।
  • যদি ব্যবহারকারী লোড করে, ফাইল-সংলাপটি খোলেন, তবে বাতিল হয়ে যায়, তারা কখনও আপলোড বোতামটি দেখতে পায় না।
  • যদি ব্যবহারকারী কোনও ফাইল চয়ন করেন তবে আপলোড বোতামটি প্রদর্শিত হবে। যদি তারা তখন ডায়লগটি খোলেন এবং বাতিল করে দেন, changeইভেন্টটি এই বাতিল দ্বারা ট্রিগার করা হবে এবং সঠিক ফাইল নির্বাচন না করা পর্যন্ত আমি আমার আপলোড বোতামটি পুনরায় আড়াল করতে পারি (এবং কর)।

আমি ভাগ্যবান যে এই গেটেড-রাজ্যটি ইতিমধ্যে আমার ফর্মের নকশা ছিল। আপনার কেবল একই স্টাইলটি ব্যবহার করার দরকার নেই, কেবল আপলোড বোতামটি গোপনে রাখা এবং পরিবর্তনের পরে, কোনও গোপন ক্ষেত্র বা জাভাস্ক্রিপ্ট ভেরিয়েবল সেট করে যা আপনি জমা দিতে পারেন তা নির্ধারণ করতে পারেন।

ফিল্ডের সাথে যোগাযোগের আগে আমি ফাইলগুলির মান [0] পরিবর্তন করার চেষ্টা করেছি। এটি অন্বেষণ সংক্রান্ত কিছু করেনি।

সুতরাং হ্যাঁ, changeকাজ করে, কমপক্ষে যতটা আমরা পেতে চলেছি তত ভাল। ফাইলফিল্ডটি সুস্পষ্ট কারণে সুরক্ষিত তবে সুচিন্তিত বিকাশকারীদের হতাশায়।

এটি আমার উদ্দেশ্য অনুসারে উপযুক্ত নয়, তবে আপনি সম্ভবত onclickএকটি সতর্কতা প্রম্পট লোড করতে সক্ষম হবেন (এটি নয় alert(), কারণ এটি পৃষ্ঠা-প্রক্রিয়াকরণকে স্টল করে) এবং যদি পরিবর্তনটি ট্রিগার করা হয় এবং ফাইলগুলি [0] নਾਲ হয় তবে এটি লুকিয়ে রাখুন। যদি পরিবর্তনটি ট্রিগার না করা হয় তবে ডিভটি তার রাজ্যে থেকে যায়।


0

এটি করার একটি হ্যাকিশ উপায় আছে (কলব্যাক যুক্ত করুন বা alert()কলগুলির পরিবর্তে কিছু পিছিত / প্রতিশ্রুতি বাস্তবায়ন সমাধান করুন ):

var result = null;

$('<input type="file" />')
    .on('change', function () {
        result = this.files[0];
        alert('selected!');
    })
    .click();

setTimeout(function () {
    $(document).one('mousemove', function () {
        if (!result) {
            alert('cancelled');
        }
    });
}, 1000);

এটি কীভাবে কাজ করে: ফাইল নির্বাচন ডায়ালগটি খোলা থাকাকালীন দস্তাবেজটি মাউস পয়েন্টার ইভেন্টগুলি গ্রহণ করে না। ডায়ালগটি প্রকৃতপক্ষে প্রদর্শিত হতে এবং ব্রাউজার উইন্ডোটি ব্লক করার জন্য 1000 মিমি বিলম্ব হয়। ক্রোম এবং ফায়ারফক্সে চেক করা হয়েছে (কেবল উইন্ডোজ)।

তবে অবশ্যই বাতিল ডায়ালগটি সনাক্ত করার জন্য এটি নির্ভরযোগ্য উপায় নয়। যদিও, আপনার জন্য কিছু ইউআই আচরণ উন্নত করতে পারে।


একটি বড় অসুবিধা ফোন এবং ট্যাবলেটগুলিতে রয়েছে, তারা সাধারণত ইঁদুর ব্যবহার করে না!
পিটার

0

ফাইল ইনপুট ফোকাস (কোনও টাইমার ব্যবহার না করে) ব্যবহার করে আমার সমাধান এখানে দেওয়া হয়েছে

var fileInputSelectionInitiated = false;

function fileInputAnimationStart() {
    fileInputSelectionInitiated = true;
    if (!$("#image-selector-area-icon").hasClass("fa-spin"))
        $("#image-selector-area-icon").addClass("fa-spin");
    if (!$("#image-selector-button-icon").hasClass("fa-spin"))
        $("#image-selector-button-icon").addClass("fa-spin");
}

function fileInputAnimationStop() {
    fileInputSelectionInitiated = false;
    if ($("#image-selector-area-icon").hasClass("fa-spin"))
        $("#image-selector-area-icon").removeClass("fa-spin");
    if ($("#image-selector-button-icon").hasClass("fa-spin"))
        $("#image-selector-button-icon").removeClass("fa-spin");
}

$("#image-selector-area-wrapper").click(function (e) {
    $("#fileinput").focus();
    $("#fileinput").click();
});

$("#preview-image-wrapper").click(function (e) {
    $("#fileinput").focus();
    $("#fileinput").click();
});

$("#fileinput").click(function (e) {
    fileInputAnimationStart();
});

$("#fileinput").focus(function (e) {
    fileInputAnimationStop();
});

$("#fileinput").change(function(e) {
    // ...
}


আপনার স্নিপেট চলমান আমাকে দেয়Error: { "message": "Uncaught SyntaxError: missing ) after argument list", "filename": "https://stacksnippets.net/js", "lineno": 51, "colno": 1 }
connexo

0

এটি সর্বোত্তমভাবে হ্যাকি, তবে কোনও ব্যবহারকারী কোনও ফাইল আপলোড করেছেন কিনা তা সনাক্ত করার জন্য এবং আমার সমাধানের একটি কার্যকারী উদাহরণ এখানে রয়েছে এবং কেবলমাত্র তারা কোনও ফাইল আপলোড করেছে তবে তাদের এগিয়ে যাওয়ার অনুমতি দেয়।

মূলত আড়াল Continue, Save, Proceedবা যাই হোক না কেন আপনার বাটন নেই। তারপরে জাভাস্ক্রিপ্টে আপনি ফাইলের নামটি ধরবেন। যদি ফাইলের নামের মান না থাকে তবে Continueবোতামটি প্রদর্শন করবেন না । যদি এর কোনও মান থাকে তবে বোতামটি দেখান। তারা প্রথমে কোনও ফাইল আপলোড করে এবং তারপরে তারা একটি ভিন্ন ফাইল আপলোড করার চেষ্টা করে এবং বাতিল ক্লিক করে This

কোডটি এখানে।

এইচটিএমএল:

<div class="container">
<div class="row">
    <input class="file-input" type="file" accept="image/*" name="fileUpload" id="fileUpload" capture="camera">
    <label for="fileUpload" id="file-upload-btn">Capture or Upload Photo</label>
</div>
<div class="row padding-top-two-em">
    <input class="btn btn-success hidden" id="accept-btn" type="submit" value="Accept & Continue"/>
    <button class="btn btn-danger">Back</button>
</div></div>

javascript:

$('#fileUpload').change(function () {
    var fileName = $('#fileUpload').val();
    if (fileName != "") {
        $('#file-upload-btn').html(fileName);
        $('#accept-btn').removeClass('hidden').addClass('show');
    } else {
        $('#file-upload-btn').html("Upload File");
        $('#accept-btn').addClass('hidden');
    }
});

সিএসএস:

.file-input {
    width: 0.1px;
    height: 0.1px;
    opacity: 0;
    overflow: hidden;
    position: absolute;
    z-index: -1; 
}

.file-input + label {
    font-size: 1.25em;
    font-weight: normal;
    color: white;
    background-color: blue;
    display: inline-block;
    padding: 5px;
}

.file-input:focus + label,
.file-input + label:hover {
    background-color: red;
}

.file-input + label {
    cursor: pointer;
}

.file-input + label * {
    pointer-events: none;
}

সিএসএসের জন্য এর অনেকগুলি হ'ল ওয়েবসাইট এবং বোতামটি সবার জন্য অ্যাক্সেসযোগ্য। আপনার পছন্দ মত যা আপনার বোতাম শৈলী।


0

ঠিক আছে, এটি আপনার প্রশ্নের সঠিক উত্তর দেয় না। আমার ধারনাটি হ'ল, আপনার একটি দৃশ্যাবলী আছে, যখন আপনি কোনও ফাইল ইনপুট যুক্ত করেন এবং ফাইল নির্বাচন করার আবেদন করেন এবং যদি ব্যবহারকারী হিট বাতিল করে দেয় তবে আপনি কেবল ইনপুটটি সরিয়ে ফেলবেন।

যদি এটি হয়, তবে: খালি ফাইল ইনপুট কেন যুক্ত করবেন?

ফ্লাইতে একটি তৈরি করুন, তবে এটি পূর্ণ হলেই এটি ডওমে যুক্ত করুন so

    var fileInput = $("<input type='file' name='files' style='display: none' />");
    fileInput.bind("change", function() {
        if (fileInput.val() !== null) {
            // if has value add it to DOM
            $("#files").append(fileInput);
        }
    }).click();

সুতরাং এখানে আমি ফ্লাইতে <ইনপুট টাইপ = "ফাইল" /> তৈরি করি, এটির পরিবর্তনের ইভেন্টের সাথে আবদ্ধ করুন এবং তারপরে অবিলম্বে ক্লিক শুরু করুন। পরিবর্তনের সময় কেবল তখনই গুলি চলতে পারে যখন ব্যবহারকারী কোনও ফাইল নির্বাচন করে ওকে হিট করে, অন্যথায় ইনপুটটি ডিওমে যুক্ত করা হবে না, সুতরাং জমা দেওয়া হবে না।

এখানে কাজের উদাহরণ: https://jsfiddle.net/69g0Lxno/3/


0

// অস্পষ্টতার পরিবর্তে হোভার ব্যবহার করুন

var fileInput = $("#fileInput");

if (fileInput.is(":hover") { 

    //open
} else {

}

0

আপনার যদি ইতিমধ্যে JQuery এর প্রয়োজন হয় তবে এই সমাধানটি কাজ করতে পারে (এটি আমার ক্ষেত্রে প্রকৃত একই কোডের প্রয়োজন, যদিও একটি প্রতিশ্রুতি ব্যবহার করা কোডটি ফাইল নির্বাচনের সমাধান না হওয়া পর্যন্ত অপেক্ষা করতে বাধ্য করা):

await new Promise(resolve => {
    const input = $("<input type='file'/>");
    input.on('change', function() {
        resolve($(this).val());
    });
    $('body').one('focus', '*', e => {
        resolve(null);
        e.stopPropagation();
    });
    input.click();

});


0

এই থ্রেডে বেশ কয়েকটি প্রস্তাবিত সমাধান রয়েছে এবং ব্যবহারকারী যখন ফাইল নির্বাচন বাক্সে "বাতিল" বোতামটি ক্লিক করেন তখন এটি সনাক্ত করতে সমস্যা হয় যা অনেক লোককে প্রভাবিত করে।

আসল বিষয়টি হ'ল ব্যবহারকারী যদি ফাইল নির্বাচন বাক্সে "বাতিল" বোতামটি ক্লিক করেন তা সনাক্ত করার জন্য কোনও 100% নির্ভরযোগ্য উপায় নেই । তবে ব্যবহারকারীরা ইনপুট ফাইলটিতে কোনও ফাইল যুক্ত করেছে কিনা তা নির্ভরযোগ্যভাবে সনাক্ত করার উপায় রয়েছে । সুতরাং এই এই উত্তর এর মৌলিক কৌশল!

আমি এই উত্তরটি যুক্ত করার সিদ্ধান্ত নিয়েছি কারণ স্পষ্টতই অন্যান্য উত্তরগুলি বেশিরভাগ ব্রাউজারগুলিতে কাজ করে না বা মোবাইল ডিভাইসে গ্যারান্টিযুক্ত।

সংক্ষেপে কোডটি 3 পয়েন্টের উপর ভিত্তি করে:

  1. ইনপুট ফাইলটি প্রাথমিকভাবে জেএস-এর "মেমরি" এ গতিশীলভাবে তৈরি হয়েছিল (আমরা এই মুহুর্তে এটি "এইচটিএমএল" এ যুক্ত করি না);
  2. ফাইল যুক্ত করার পরে ইনপুট ফাইলটি এইচটিএমএলে যুক্ত করা হয়, অন্যথায় কিছুই ঘটে না;
  3. কোনও নির্দিষ্ট ইভেন্টের মাধ্যমে এইচটিএমএল থেকে ইনপুট ফাইলটি সরিয়ে ফাইলটি অপসারণ করা হয় যার অর্থ পুরানো ইনপুট ফাইলটি সরিয়ে একটি নতুন ফাইল তৈরি করে ফাইলটির "সম্পাদনা" / "পরিবর্তন" করা হয়।

আরও ভাল বোঝার জন্য নীচের কোড এবং নোটগুলিও দেখুন।

[...]
<button type="button" onclick="addIptFl();">ADD INPUT FILE!</button>
<span id="ipt_fl_parent"></span>
[...]
function dynIptFl(jqElInst, funcsObj) {
    if (typeof funcsObj === "undefined" || funcsObj === "") {
        funcsObj = {};
    }
    if (funcsObj.hasOwnProperty("before")) {
        if (!funcsObj["before"].hasOwnProperty("args")) {
            funcsObj["before"]["args"] = [];
        }
        funcsObj["before"]["func"].apply(this, funcsObj["before"]["args"]);
    }
    var jqElInstFl = jqElInst.find("input[type=file]");

    // NOTE: Open the file selection box via js. By Questor
    jqElInstFl.trigger("click");

    // NOTE: This event is triggered if the user selects a file. By Questor
    jqElInstFl.on("change", {funcsObj: funcsObj}, function(e) {

        // NOTE: With the strategy below we avoid problems with other unwanted events
        // that may be associated with the DOM element. By Questor
        e.preventDefault();

        var funcsObj = e.data.funcsObj;
        if (funcsObj.hasOwnProperty("after")) {
            if (!funcsObj["after"].hasOwnProperty("args")) {
                funcsObj["after"]["args"] = [];
            }
            funcsObj["after"]["func"].apply(this, funcsObj["after"]["args"]);
        }
    });

}

function remIptFl() {

    // NOTE: Remove the input file. By Questor
    $("#ipt_fl_parent").empty();

}

function addIptFl() {

    function addBefore(someArgs0, someArgs1) {
    // NOTE: All the logic here happens just before the file selection box opens.
    // By Questor

        // SOME CODE HERE!

    }

    function addAfter(someArgs0, someArgs1) {
    // NOTE: All the logic here happens only if the user adds a file. By Questor

        // SOME CODE HERE!

        $("#ipt_fl_parent").prepend(jqElInst);

    }

    // NOTE: The input file is hidden as all manipulation must be done via js.
    // By Questor
    var jqElInst = $('\
<span>\
    <button type="button" onclick="remIptFl();">REMOVE INPUT FILE!</button>\
    <input type="file" name="input_fl_nm" style="display: block;">\
</span>\
');

    var funcsObj = {
        before: {
            func: addBefore,
            args: [someArgs0, someArgs1]
        },
        after: {
            func: addAfter,

            // NOTE: The instance with the input file ("jqElInst") could be passed
            // here instead of using the context of the "addIptFl()" function. That
            // way "addBefore()" and "addAfter()" will not need to be inside "addIptFl()",
            // for example. By Questor
            args: [someArgs0, someArgs1]

        }
    };
    dynIptFl(jqElInst, funcsObj);

}

ধন্যবাদ! = D:


0

আমরা নীচের মত কৌণিক অর্জন।

    1. ইনপুট টাইপ ফাইলটিতে বাইন্ড ক্লিক ইভেন্ট ind
      1. উইন্ডোটির সাথে ফোকাস ইভেন্ট সংযুক্ত করুন এবং শর্ত যুক্ত করুন যদি আপলোডপ্যানেলটি সত্য হয় তবে কনসোল দেখান।
      2. ইনপুট টাইপ ফাইলে ক্লিক করার সময় বুলিয়ান আপলোডপ্যানেল মানটি সত্য। এবং সংলাপ বাক্স উপস্থিত হবে।
      3. বাতিল বা এসসি বাটন ক্লিক করার পরে ডায়লগ বক্স ডিসপেনসারী এবং কনসোল উপস্থিত হবে।

এইচটিএমএল

 <input type="file" formControlName="FileUpload" click)="handleFileInput($event.target.files)" />
          />

হিজড়া

this.uploadPanel = false;
handleFileInput(files: FileList) {
    this.fileToUpload = files.item(0);
    console.log("ggg" + files);
    this.uploadPanel = true;
  }



@HostListener("window:focus", ["$event"])
  onFocus(event: FocusEvent): void {
    if (this.uploadPanel == true) {
        console.log("cancel clicked")
        this.addSlot
        .get("FileUpload")
        .setValidators([
          Validators.required,
          FileValidator.validate,
          requiredFileType("png")
        ]);
      this.addSlot.get("FileUpload").updateValueAndValidity();
    }
  }

0

আপনার ইনপুটটিতে কেবল 'পরিবর্তন' শ্রোতা যুক্ত করুন যার টাইপ ফাইল। অর্থাত

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

আমি jQuery ব্যবহার করে করেছি এবং স্পষ্টতই যে কেউ ভ্যালিনা জেএস ব্যবহার করতে পারে (প্রয়োজনীয়তা অনুযায়ী)।

$("#file_to_upload").change(function() {

            if (this.files.length) {

            alert('file choosen');

            } else {

            alert('file NOT choosen');

            }

    });

.change()যদি ব্যবহারকারী ফাইল বাছাইকারীটিতে "বাতিল" ক্লিক করে তবে নির্ভরযোগ্যভাবে বলা হয় না।
বেন হুইলার

@ বেইনহিলার, আমি এটি ক্রোম এবং ফায়ারফক্স উভয় ক্ষেত্রেই পরীক্ষা করে দেখেছি এবং এটি আমার কাজ করেছে তবে অন্যান্য ব্রাউজারগুলিতে পরীক্ষা করা হয়নি।
নাভেদ আলী

0
    enter code here
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Document</title>
  </head>
  <body>
    <h1>Hello</h1>
    <div id="cancel01">
      <button>Cancel</button>
    </div>

    <div id="cancel02">
      <button>Cancel</button>
    </div>

    <div id="cancel03">
      <button>Cancel</button>
    </div>

    <form>
      <input type="file" name="name" placeholder="Name" />
    </form>

    <script>
      const nameInput = document.querySelector('input[type="file"]');

      /******
       *The below code if for How to detect when cancel is clicked on file input
       ******/
      nameInput.addEventListener('keydown', e => {
        /******
         *If the cancel button is clicked,then you should change the input file value to empty
         ******/

        if (e.key == 'Backspace' || e.code == 'Backspace' || e.keyCode == 8) {
          console.log(e);

          /******
           *The below code will delete the file path
           ******/
          nameInput.value = '';
        }
      });
    </script>
  </body>
</html>

কোড-কেবলমাত্র উত্তরগুলি নিম্ন মানের হিসাবে বিবেচিত হয়: আপনার কোডটি কী করে এবং কীভাবে এটি সমস্যার সমাধান করে তা একটি ব্যাখ্যা সরবরাহ করে তা নিশ্চিত করুন। আপনি যদি আপনার পোস্টে আরও তথ্য যুক্ত করতে পারেন তবে এটি প্রশ্নকারী এবং ভবিষ্যতের পাঠকদের উভয়কেই সহায়তা করবে। সম্পূর্ণ কোড ভিত্তিক উত্তরগুলি ব্যাখ্যা করে
ক্যালোস

0

লুকানো ইনপুট সহ ফাইল নির্বাচনের সমাধান

দ্রষ্টব্য: এই কোডটি বাতিলকরণ শনাক্ত করে না, এটি একটি সাধারণ ক্ষেত্রে এটি সনাক্ত করার প্রয়োজনীয়তাকে বাধা দেওয়ার একটি উপায় সরবরাহ করে যেখানে লোকেরা এটি সনাক্ত করার চেষ্টা করে।

একটি লুকানো ইনপুট ব্যবহার করে ফাইল আপলোডগুলির সমাধানের সন্ধান করার জন্য আমি এখানে পৌঁছেছি, আমি বিশ্বাস করি যে ফাইল ইনপুট বাতিলকরণ সনাক্তকরণের উপায় অনুসন্ধান করার জন্য এটি সর্বাধিক সাধারণ কারণ (ফাইলটি ডায়ালগ খুলুন -> যদি কোনও ফাইল নির্বাচন করা থাকে তবে কিছু চালান কোড, অন্যথায় কিছুই করবেন না), এখানে আমার সমাধানটি দেওয়া হয়েছে:

var fileSelectorResolve;
var fileSelector = document.createElement('input');
fileSelector.setAttribute('type', 'file');

fileSelector.addEventListener('input', function(){
   fileSelectorResolve(this.files[0]);
   fileSelectorResolve = null;
   fileSelector.value = '';
});

function selectFile(){
   if(fileSelectorResolve){
      fileSelectorResolve();
      fileSelectorResolve = null;
   }
   return new Promise(function(resolve){
      fileSelectorResolve = resolve;
      fileSelector.dispatchEvent(new MouseEvent('click'));
   });
}

ব্যবহারের উদাহরণ:

মনে রাখবেন যে কোনও ফাইল বাছাই না করা থাকলে প্রথম লাইনটি একবারে selectFile()আবার ডাকা হবে (বা fileSelectorResolve()অন্য কোথাও থেকে ফোন করলে )।

async function logFileName(){
   const file = await selectFile();
   if(!file) return;
   console.log(file.name);
}

আরেকটি উদাহরণ:

async function uploadFile(){
   const file = await selectFile();
   if(!file) return;

   // ... make an ajax call here to upload the file ...
}

ক্রোম ৮৩.০-তে, যখন ব্যবহারকারী বাতিল করে দেয় তখন আমি ইনপুট ইভেন্টের জন্য কোনও কলব্যাক পাই না, এবং ২ য়-তে চেষ্টাও করি না
Soylent গ্রাহাম

1
@ সোলেলেটগ্রাহাম হ্যাঁ, কারণ এই কোডটি বাতিলকরণ সনাক্ত করে না, এটি এটি একটি সাধারণ ক্ষেত্রে এটি সনাক্ত করার প্রয়োজনীয়তাকে রোধ করার একটি উপায় সরবরাহ করে যাতে লোকেরা এটি সনাক্ত করার চেষ্টা করে। যেহেতু আমি এটি সম্পর্কে পরিষ্কার ছিলাম না, তাই আমি আমার মন্তব্যে এই মন্তব্যটি যুক্ত করছি।
আলু

আমার খারাপ আমি মনে করি, আমি আপনার উত্তরটি ভুল হিসাবে ভুল হিসাবে লিখেছি "এটি আপনাকে ২ য় বার ব্যবহারকারীর দ্বারা বাতিল হওয়া ব্যবহারকারী বলেছে"
সাইলেন্ট গ্রাহাম

-1

আপনি ইনপুট ক্ষেত্রে একটি jquery পরিবর্তন শ্রোতা করতে পারেন এবং ক্ষেত্রের মান দ্বারা ব্যবহারকারী বাতিল বা আপলোড উইন্ডো সনাক্ত করতে পারেন।

এখানে একটি উদাহরণ:

//when upload button change
$('#upload_btn').change(function(){
    //get uploaded file
    var file = this.files[0];

    //if user choosed a file
    if(file){
        //upload file or perform your desired functiuonality
    }else{
        //user click cancel or close the upload window
    }
});

কেন এটিকে নিম্নমানের করা যায় তা ধারণা নেই - এটিই আমি খুঁজছিলাম। ধন্যবাদ! 🙂
ব্যবহারকারী 1274820
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.