ইন্টারনেট এক্সপ্লোরার 9, 10 এবং 11 ইভেন্ট কনস্ট্রাক্টর কাজ করে না


129

আমি একটি ইভেন্ট তৈরি করছি, সুতরাং DOM ইভেন্ট নির্মাণকারী ব্যবহার করুন:

new Event('change');

এটি আধুনিক ব্রাউজারগুলিতে দুর্দান্ত কাজ করে, তবে ইন্টারনেট এক্সপ্লোরার 9, 10 এবং 11 এ এটি ব্যর্থ হয়:

Object doesn't support this action

কীভাবে আমি ইন্টারনেট এক্সপ্লোরার (আদর্শভাবে একটি পলিফিলের মাধ্যমে) ঠিক করতে পারি? যদি আমি না পারি, আমি কি ব্যবহার করতে পারি এমন কোনও কর্মপদ্ধতি আছে?


55
"আমি কীভাবে ইন্টারনেট এক্সপ্লোরার ঠিক করতে পারি?" এক্সডি
কন্টাক্টমেট

উত্তর:


176

এমডিএন-তে কাস্টমসেন্ট কনস্ট্রাক্টরের জন্য একটি আইই পলফিল রয়েছে । আইইতে কাস্টম ইভেন্ট যুক্ত করা এবং এটি পরিবর্তে কাজ করে।

(function () {
  if ( typeof window.CustomEvent === "function" ) return false; //If not IE

  function CustomEvent ( event, params ) {
    params = params || { bubbles: false, cancelable: false, detail: undefined };
    var evt = document.createEvent( 'CustomEvent' );
    evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
    return evt;
   }

  CustomEvent.prototype = window.Event.prototype;

  window.CustomEvent = CustomEvent;
})();

14
আপনি স্যার আমার জীবন বাঁচালেন। একটি সম্পূর্ণ প্রতিস্থাপন করা কি নিরাপদ হবে? মানে, window.Event= CustomEventশেষ লাইনে কাজ করছি।
tfrascaroli

7
আইই 11 এ উইন্ডোটি সেট করা নিরাপদ বলে মনে হচ্ছে E ইভেনটি = কাস্টম ইভেন্ট, হ্যাঁ।
কোরি অ্যালিক্স

10
আগ্রহী যে কারও জন্য মনে হয় যে আপনি আইইতে রয়েছেন (এই ক্ষেত্রে) টাইপফ (ইভেন্ট) যা আইটি যেখানে 'অবজেক্ট' রয়েছে তা বাদ দিয়ে সকলের জন্য 'ফাংশন' যাচাই করে আপনি (IE এই ক্ষেত্রে) রয়েছেন detect তারপরে আপনি উপরের পদ্ধতির ব্যবহার করে ইভেন্ট কনস্ট্রাক্টরকে নিরাপদে পলিফিল করতে পারবেন।
ইউয়ান স্মিথ

আমি কেবল একই ধরণের জন্য তদন্ত করছি StorageEventএবং typeof(StorageEvent)এমএস এজ তে কাজ করে না। এই কাজ করে: try { new StorageEvent(); } catch (e) { /* polyfill */ }
কমিটুয়েল

1
উইন্ডোটির বিকল্প স্থাপন করা নিরাপদ নাও হতে পারে ustustustustE you you you you you you you you you you।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।।
সেন জ্যাকব

55

আমি মনে করি যে ক্রস ব্রাউজার ইভেন্ট তৈরির সাথে আপনার সমস্যা সমাধানের এবং ডিল করার সর্বোত্তম সমাধান হ'ল:

function createNewEvent(eventName) {
    var event;
    if (typeof(Event) === 'function') {
        event = new Event(eventName);
    } else {
        event = document.createEvent('Event');
        event.initEvent(eventName, true, true);
    }
    return event;
}

3
এটি কাজ করে! আমি কেবল মনে করি এটি করা উচিত return eventতাই আমি এটি পাস করতে পারি dispatchEvent()
নওমেনন

initEventপুরানো এবং অবহেলিত , আপনার কমপক্ষে আধুনিক পদ্ধতি এবং ফ্যালব্যাক হিসাবে অবহিত উপায় ব্যবহার করা দরকার।
vsync

2
@vsync এটা অবচিত করা যেতে পারে, কিন্তু ডক্স আপনাকে থেকে, বলে "এর পরিবর্তে ইভেন্ট () মত, নির্দিষ্ট ইভেন্ট কনস্ট্রাকটর ব্যবহার করুন" যা সংযুক্ত ঠিক কি এই polyfill করার চেষ্টা করছে, তাই কোন উপায় সত্যিই।
হ্রাস পেয়েছে

1
CustomEventdetailবিকল্পের মাধ্যমে কাস্টম ডেটা পাস করার অনুমতি দেয় এবং Eventদেয় না। আমি কি ভূল?
পিটিএসকি

1
আইসি 9, 10 বা 11 এর জন্য আমার নিজের অভিজ্ঞতা অনুযায়ী কাস্টম এভেন্ট সমর্থিত নয়। একমাত্র ভাল উত্তরটি গ্রহণযোগ্য বলে মনে হচ্ছে।
আনডিইং জেলিফিশ

5

এই প্যাকেজটি যাদু করে:

https://www.npmjs.com/package/custom-event-polyfill

প্যাকেজ অন্তর্ভুক্ত করুন এবং ইভেন্টটি নিম্নলিখিত হিসাবে প্রেরণ করুন:

window.dispatchEvent(new window.CustomEvent('some-event'))

95 নির্ভরতা?
ড্যামিয়েন রোচে

4
@ ডামিয়েনরোচে আপনি কি "নির্ভরশীল" "নির্ভরতা" হিসাবে মিসরড হতে পারেন? কারণ প্যাকেজের আসলে 0 নির্ভরতা এবং (লেখার সময় দ্বারা) 102 নির্ভরশীল (অর্থাত্ প্যাকেজগুলি যা এর উপর নির্ভর করে)। যে 102 নির্ভরশীল প্যাকেজ সম্ভবত জুলাইয়ে 95 ফিরে ছিল।
ফ্লু

2
আমি রক্তাক্ত ভাল করেছি! : পি
ড্যামিয়েন রোচে

3

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

let toggle_event = null;
try {
    toggle_event = new Event("toggle");
}
catch (error) {
    toggle_event = document.createEvent("Event");
    let doesnt_bubble = false;
    let isnt_cancelable = false;
    toggle_event.initEvent("toggle", doesnt_bubble, isnt_cancelable);
}
// disclosure_control is a details element.
disclosure_control.dispatchEvent(toggle_event);

5
আপনি দেখতে পাচ্ছেন না কেন আপনি পুরানো IE তে চালিত কোড হিসাবে মিশ্রণ করছেন es6 let(এবং ব্যবহার করছেন না var) .. এটি প্রাথমিকভাবে বিভ্রান্ত হতে পারে যারা এটিকে অনুলিপি করবে
vsync

1
@vsync অসহায়তা আমি করেনি উল্লেখ সংস্করণ সংখ্যা। আমার ব্যক্তিগত ওয়েবসাইটটি কেবলমাত্র গত বছরই আইই 11 কে টার্গেট করেছিল, তাই পুরানো সংস্করণগুলিতে সমর্থন চেক করার জন্য এটি আমার কাছে কখনও ঘটেনি। (আজ অবধি, আমি স্টাইলশিট বা স্ক্রিপ্ট ছাড়াই আইই ১১ প্লেইন এইচটিএমএল পরিবেশন করি People লোকেরা এগিয়ে চলতে হবে)) যাইহোক, 2017 এপ্রিল পর্যন্ত মাইক্রোসফ্ট দ্বারা সমর্থিত ইন্টারনেট এক্সপ্লোরারের একমাত্র সংস্করণ 11 সংস্করণ, সুতরাং এটি কিছুটা সামান্য তর্ক করা বিন্দু. আমি কাউকে টার্গেট করে একটি অসমর্থিত ব্রাউজার ব্যবহার করতে উত্সাহিত করব না। ওয়েব একটি বিপজ্জনক জায়গা হতে পারে।
প্যাট্রিক ডার্ক

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

3

একটি পলিফিল পরিষেবা রয়েছে যা এটি আপনার এবং অন্যদের জন্য প্যাচ করতে পারে

https://polyfill.io/v3/url-builder/

 <script crossorigin="anonymous" src="https://polyfill.io/v3/polyfill.min.js"></script>

2

custom-eventnpm প্যাকেজ আমার জন্য সুন্দর কাজ

https://www.npmjs.com/package/custom-event

var CustomEvent = require('custom-event');

// add an appropriate event listener
target.addEventListener('cat', function(e) { process(e.detail) });

// create and dispatch the event
var event = new CustomEvent('cat', {
  detail: {
    hazcheeseburger: true
  }
});
target.dispatchEvent(event);

এটি একটি ভাল উত্তর, তবে ইতিমধ্যে উত্তর হিসাবে উল্লিখিত আরও একটি এনপিএম প্যাকেজ রয়েছে।
মাইকমেকানা

2
ব্যবহারকারীদের বিভিন্ন ধরণের বিকল্প দেওয়ার ক্ষেত্রে কী ভুল?
লিরান এইচ

আরও জেনেরিক প্যাকেজ হল এনপিএমজেএস
মার্কাস জারদারট

1

আমি ব্যক্তিগতভাবে তৈরি ইভেন্টগুলি পরিচালনা করতে ব্যক্তিগতভাবে একটি মোড়ক ফাংশন ব্যবহার করি। নিম্নলিখিত কোডটি সমস্ত Eventইন্টারফেসে একটি স্থিতিশীল পদ্ধতি যুক্ত করবে (সমস্ত বৈশ্বিক চলকগুলি Eventএকটি ইভেন্ট ইন্টারফেস হিসাবে শেষ হবে) এবং আপনাকে element.dispatchEvent(MouseEvent.create('click'));IE9 + এর মতো ফাংশনগুলিতে কল করার অনুমতি দেবে ।

(function eventCreatorWrapper(eventClassNames){
    eventClassNames.forEach(function(eventClassName){
        window[eventClassName].createEvent = function(type,bubbles,cancelable){
            var evt
            try{
                evt = new window[eventClassName](type,{
                    bubbles: bubbles,
                    cancelable: cancelable
                });
            } catch (e){
                evt = document.createEvent(eventClassName);
                evt.initEvent(type,bubbles,cancelable);
            } finally {
                return evt;
            }
        }
    });
}(function(root){
    return Object.getOwnPropertyNames(root).filter(function(propertyName){
        return /Event$/.test(propertyName)
    });
}(window)));

সম্পাদনা: সমস্ত Eventইন্টারফেসের সন্ধানের ফাংশনটি আপনাকে প্রয়োজন ইভেন্ট ইন্টারফেসগুলি ( ['Event', 'MouseEvent', 'KeyboardEvent', 'UIEvent' /*, etc... */]) এর পরিবর্তনের জন্য একটি অ্যারের দ্বারাও প্রতিস্থাপন করা যেতে পারে ।

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