কীভাবে আমি কোনও ইনপুটে প্রোগ্রামের ভিত্তিতে একটি অনভিজ্ঞ ইভেন্ট জোর করব?


123

কীভাবে আমি কোনও ইনপুটে প্রোগ্রামের ভিত্তিতে একটি অনভিজ্ঞ ইভেন্ট জোর করব?

আমি এরকম কিছু চেষ্টা করেছি:

var code = ele.getAttribute('onchange');
eval(code);

তবে আমার শেষ লক্ষ্যটি হ'ল যে কোনও শ্রোতার ফাংশনকে সরিয়ে দেওয়া এবং এটি কার্যকর হবে বলে মনে হয় না। উভয়ই কেবল 'মান' গুণটি আপডেট করে না।

উত্তর:


142

একটি Eventঅবজেক্ট তৈরি করুন এবং এটিকে dispatchEventউপাদানটির পদ্ধতিতে দিন:

var element = document.getElementById('just_an_example');
var event = new Event('change');
element.dispatchEvent(event);

এটি ইভেন্ট শ্রোতাদের addEventListenerপদ্ধতিতে কল করে বা onchangeউপাদানটির সম্পত্তি নির্ধারণ করে নিবন্ধিত হয়েছিল তা নির্বিশেষে ট্রিগার করবে ।


আপনি যদি ইভেন্টটি বুদ্বুদ করতে চান তবে আপনার Eventকনস্ট্রাক্টরের কাছে দ্বিতীয় যুক্তিটি পাস করতে হবে :

var event = new Event('change', { bubbles: true });

ব্রাউজারের সামর্থ্য সম্পর্কে তথ্য:


2
হ্যাঁ, MDN ইভেন্টগুলি তৈরি এবং ট্রিগার করা একটি ভাল সংস্থান!
জাকুব হলি

1
স্থানীয়ভাবে সঠিকভাবে এটি কীভাবে করা যায়। এখন সমস্ত ব্রাউজারগুলিতে সমর্থিত: caniuse.com/#feat=dispatchevent
উইলেম মুল্ডার

1
এটি এই প্রশ্নের সঠিক উত্তর। আমাদের অবশ্যই এটি আধুনিক উপায়ে অর্জন করতে হবে।
Ван Ван

1
আমি আইই ১১ এর সমতুল্য করার চেষ্টা করছি কিন্তু যখন একটি রিএকটিজ ইনপুট ক্ষেত্র পরিবর্তন করার চেষ্টা করছে তখন এটি কাজ করছে না। var evt = document.createEvent('CustomEvent'); evt.initCustomEvent('input', true, false, { }); elem.dispatchEvent(evt);
বোডোস্কো

3
সবাই কেন এটি বলছে সর্বোত্তম উত্তর? লিঙ্কযুক্ত ইভেন্ট ডক অনুসারে এখনও আইই এর বর্তমান সংস্করণ এটি সমর্থন করে না।
জেফ-এইচ

96

JQuery এ আমি বেশিরভাগ ব্যবহার করি:

$("#element").trigger("change");

2
টিহস আমাকে সাহায্য করেছিল! আমি কোড ব্যবহার করে একটি চেকবাক্সের (চেক করা বা না) মান নির্ধারণ করছিলাম এবং আমি যা কিছু করি না কেন ঘটনাটি IE তে গুলি চালাচ্ছে না। আমি অস্পষ্ট () ফোকাস () এবং কয়েকটি অন্যান্য বিষয় চেষ্টা করেছি। আমি মান সেট করার পরে আমি ট্রিগার বলেছিলাম এবং আমি ট্রিগার কল করতে একটি ইভেন্ট ইভেন্ট যুক্ত করেছি। এটি একাধিক অগ্নিকাণ্ডের কারণ ঘটায় তবে এটি আমার কাছে গুরুত্বপূর্ণ নয়। আইই-তে আমি কোডের মাধ্যমে চেকবক্সগুলি যুক্ত করি এবং পরিবর্তিত ইভেন্টের আগুনের আগে আপনাকে তাদের উপর দুবার ক্লিক করতে হবে। এই টিপ জন্য ধন্যবাদ।
ডাস্টিন ডেভিস

6
আপডেট হিসাবে, $ ("# উপাদান") change পরিবর্তন (); jquery 1.0 থেকে একই কাজ করে।
কুকি অফফোর্টুন

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

এখানে কোন সাহায্য দয়া করে? এই সমাধানগুলির কোনওটিই
গ্যাবে

61

ugh কোনও কিছুর জন্য eval ব্যবহার করবেন না । ঠিক আছে, কিছু জিনিস আছে তবে সেগুলি অত্যন্ত বিরল। বরং আপনি এটি করবেন:

document.getElementById("test").onchange()

আরও বিকল্পের জন্য এখানে দেখুন: http://jehiah.cz/archive/firing-javascript-events-properly


3
আপত্তিজনকভাবে JSON;)
অ্যারন পাওয়েল

3
JSON আপত্তিজনক জন্য json2.js! JSON.parse ইতোমধ্যে আধুনিক ব্রাউজারগুলিতে উপলভ্য রয়েছে
জিংস্টেস্টুলা

12
এই কৌশলটি কেবল তখনই কাজ করে যদি পরিবর্তন হ্যান্ডলারটি "চালু" স্থাপন করে সংযুক্ত করা হয়। এটি 'রিয়েল' ইভেন্ট তৈরি করে না যা ডাব্লু 3 সি বা মাইক্রোসফ্ট ইভেন্ট হ্যান্ডলারদের ট্রিগার করে। আরো বিস্তারিত জানার জন্য লিঙ্কটি দেখুন।
স্টিফেন নেলসন

6
আমি মনে করি এই উত্তরটি এখন পুরানো, মিসক্রেন্টের উত্তরটি ব্যবহার করা new Event(...)এবং dispatchEventএটি আজকাল সঠিক সমাধান, মনে হয়।
জাকুব হলি

4
এই উত্তরটি অপ্রচলিত ; উপরের কোডটি যদি আপনি Element.addEventListenerইভেন্টগুলি পরিচালনা করতে ব্যবহার করেন তবে কাজ করবে না । এটি আধুনিক উপায়ে অর্জন করতে, @ মিসক্রেন্টের উত্তর দেখুন।
Ван

23

কিছু কারণে ele.onchange জন্য () একটি নিক্ষেপ করা হয় expception আমার জন্য আই ই আমার পৃষ্ঠায়, "পদ্ধতি not found" তাই আমি লিঙ্ক থেকে এই ফাংশন ব্যবহার করে শেষ পর্যন্ত Kolten দেওয়া হয় না এবং (Ele, 'পরিবর্তন') fireEvent কলিং, যা কাজ :

function fireEvent(element,event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on'+event,evt)
    }
    else{
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true ); // event type,bubbling,cancelable
        return !element.dispatchEvent(evt);
    }
}

যাইহোক, আমি একটি পরীক্ষা পৃষ্ঠা তৈরি করেছি যা নিশ্চিত করেছে যে কলিংয়ের কাজটি অন্বেষণ করা উচিত:

<input id="test1" name="test1" value="Hello" onchange="alert(this.value);"/>
<input type="button" onclick="document.getElementById('test1').onchange();" value="Say Hello"/>

সম্পাদনা করুন: এলি.অনচেঞ্জ () কাজ না করার কারণটি ছিল কারণ আমি প্রকৃতপক্ষে মুদ্রার অনুষ্ঠানের জন্য আসলে কিছু ঘোষণা করিনি। তবে ফায়ার ইভেন্ট এখনও কাজ করে।


2
আমি যে উদাহরণটি দিয়েছি তার চেয়ে ব্রাউজার সনাক্তকরণের এই পদ্ধতিটি (অবজেক্ট সনাক্তকরণ দ্বারা) ভাল।
ক্রিস ম্যাকডোনাল্ড

ফায়ারফক্স 23 এর জন্য এটি আর কাজ করে না: "এলিমেন্ট.ডিস্পপ্যাচেন্ট কোনও ফাংশন নয়"
অলিভার

4
হাই হাই গুগলার্স এটা 2016! আজকাল আমরা মত কোড লিখতে element.dispatchEvent(new Event('change', true, true))যে সব রহস্যময় এবং বেশিরভাগ অবচিত পরিবর্তে createEventএবং initEventস্টাফ।
এরিকোসো

3

এটি IE এবং Chrome এর জন্য সবচেয়ে সঠিক উত্তর:

javascript=>

var element = document.getElementById('xxxx');
var evt = document.createEvent('HTMLEvents');
evt.initEvent('change', false, true);
element.dispatchEvent(evt);

2

কুইনাইটের নীচ থেকে নেওয়া

function triggerEvent( elem, type, event ) {
    if ( $.browser.mozilla || $.browser.opera ) {
        event = document.createEvent("MouseEvents");
        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView,
            0, 0, 0, 0, 0, false, false, false, false, 0, null);
        elem.dispatchEvent( event );
    } else if ( $.browser.msie ) {
        elem.fireEvent("on"+type);
    }
}

আপনি অবশ্যই অবশ্যই Qu। ব্রাউজার স্টাফটিকে আপনার নিজের ব্রাউজার সনাক্তকরণের পদ্ধতিতে jQuery স্বাধীন করতে প্রতিস্থাপন করতে পারেন।

এই ফাংশনটি ব্যবহার করতে:

var event;
triggerEvent(ele, "change", event);

এটি মূলত আসল DOM ইভেন্টটিকে আগুন ধরিয়ে দেবে যেন কিছু পরিবর্তন হয়ে গেছে।


1

আপনি যদি কোডটির এই স্নিপেটের সাথে আপনার সমস্ত ইভেন্ট যুক্ত করেন:

//put this somewhere in your JavaScript:
HTMLElement.prototype.addEvent = function(event, callback){
  if(!this.events)this.events = {};
  if(!this.events[event]){
    this.events[event] = [];
    var element = this;
    this['on'+event] = function(e){
      var events = element.events[event];
      for(var i=0;i<events.length;i++){
        events[i](e||event);
      }
    }
  }
  this.events[event].push(callback);
}
//use like this:
element.addEvent('change', function(e){...});

তারপরে আপনি কেবলমাত্র আপনার ইভেন্টের নাম element.on<EVENTNAME>()কোথায় <EVENTNAME>তা ব্যবহার করতে পারবেন এবং এটি সমস্ত ইভেন্টকে কল করবে<EVENTNAME>



-4

আপনি যদি jQuery ব্যবহার করে থাকেন তবে আপনার তা হবে:

$('#elementId').change(function() { alert('Do Stuff'); });

বা এমএস আজাজ:

$addHandler($get('elementId'), 'change', function(){ alert('Do Stuff'); });

অথবা উপাদানটির কাঁচা এইচটিএমএল:

<input type="text" onchange="alert('Do Stuff');" id="myElement" />

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

$addHandler($get('elementId'), 'change', elementChanged);
function elementChanged(){
  alert('Do Stuff!');
}
function editElement(){
  var el = $get('elementId');
  el.value = 'something new';
  elementChanged();
}

যেহেতু আপনি ইতিমধ্যে একটি জাভাস্ক্রিপ্ট পদ্ধতি লিখেছেন যা এটি পরিবর্তন করবে এটি কল করার জন্য এটি কেবল 1 টি অতিরিক্ত লাইন।

অথবা, যদি আপনি হয় মাইক্রোসফট AJAX এর পরিকাঠামোকে ব্যবহার করে আপনি মাধ্যমে সব ইভেন্ট হ্যান্ডলার অ্যাক্সেস করতে পারে:

$get('elementId')._events

সঠিক ইভেন্ট হ্যান্ডলার (গুলি) চালানোর জন্য এটি আপনাকে কিছু প্রতিবিম্ব শৈলীর কাজ করার অনুমতি দেয়।


1
আমি বিশ্বাস করি যে তিনি আসল ঘটনাটি চালিত করতে চান, ইভেন্টটি চালিত হওয়ার পরে কোনও অনুষ্ঠান চালাবেন না ... আমার মনে হয় । lol
কল্টেন

-5

JQuery ব্যবহার করে আপনি নিম্নলিখিতটি করতে পারেন:

// for the element which uses ID
$("#id").trigger("change");

// for the element which uses class name
$(".class_name").trigger("change");

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