আমি যখন ভাল () ব্যবহার করে কোনও নির্বাচনের মান সেট করি তখন কেন jquery পরিবর্তন ইভেন্টটি ট্রিগার করে না?


377

change()ইভেন্ট হ্যান্ডলারটিতে যুক্তিটি চালিত হচ্ছে না যখন মানটি সেট করা হয় val(), তবে ব্যবহারকারী যখন তাদের মাউস দিয়ে কোনও মান নির্বাচন করেন তখন তা চালানো হয়। কেন?

<select id="single">
    <option>Single</option>
    <option>Single2</option>
</select>

<script>
    $(function() {
        $(":input#single").change(function() {
           /* Logic here does not execute when val() is used */
        });
    });

    $("#single").val("Single2");
</script>

উত্তর:


589

কারণ changeইভেন্টটির জাভাস্ক্রিপ্ট কোডের পরিবর্তে ব্যবহারকারী দ্বারা শুরু করা একটি প্রকৃত ব্রাউজার ইভেন্ট প্রয়োজন।

পরিবর্তে এটি করুন:

$("#single").val("Single2").trigger('change');

অথবা

$("#single").val("Single2").change();

1
হাই, এই আপডেটটি ডাউন ডাউন করে নিচ্ছেন। তবে অন চেঞ্জ () পুনরাবৃত্তভাবে কল করা হচ্ছে।
পঙ্কজ

3
আমি এই উত্তর খনন। এটি কাজ করে তবে jQuery এর সাথে আরও ভাল কোনও উপায় নেই? আমি নিশ্চিত যে আমরা যখনই কোনও মান পরিবর্তন করি যা পরিবর্তনের হ্যান্ডলার সেটআপ করে থাকে (কটাক্ষ) তখন আমরা এটি করার কথা মনে করব। ডেটা বাঁধাই করা ফ্রেমওয়ার্কগুলি কি এটি আরও ভাল সমাধান করতে পারে?
জেস

@ user113716 আপনি কীভাবে কোনও মান না জেনে এটি টাইগার করতে জানেন?
বিকেএসপুরজন

4
আমি সম্মত হলাম এটি সঠিক উত্তর তবে এটি আমি যা করার চেষ্টা করছি তা একেবারে স্তন্যপান এবং নষ্ট করে দেয়।
ডাস্টিন পোয়েসান্ট

ব্যবহার করে দেখুন $ ( "# একক") ট্রিগার ({ "Single2" টাইপ: "পরিবর্তন", Val})।
user2901633

44

আমি বিশ্বাস করি আপনি পরিবর্তিত ইভেন্টটিকে ম্যানুয়ালি এর সাথে ট্রিগার করতে পারেন trigger():

$("#single").val("Single2").trigger('change');

যদিও এটি স্বয়ংক্রিয়ভাবে আগুন দেয় না, আমার কোনও ধারণা নেই।


আমি এটিতেও কাজ করতে সক্ষম নই $ ("# একক")। ভাল ("সিঙ্গল 2")। পরিবর্তন (); আমি গতিশীলভাবে ড্রপডাউন তৈরি করছি এবং এর মান পরিবর্তন করছি (এটি আমার পক্ষে ভাল কাজ করে) তবে যখন আমি ট্রিগার করার চেষ্টা করছি তখন এটি আমার জন্য কাজ করছে না।
মনীশ কুমার

4
একটি "বিট" বিলেটেড তবে এটি স্বয়ংক্রিয়ভাবে আগুন দেয় না কারণ এটি অসীম লুপগুলিতে নিয়ে যায়। ভাবুন$('#foo').change(function() { $( this ).val( 'whatever' ); });
জেজেজে

@ জুহানা আমি মনে করি একটি অসীম লুপ লক্ষ্য করা, নির্ণয় করা এবং ভাল () এর চেয়ে স্থির করা রহস্যজনকভাবে "পরিবর্তন" বাইন্ডিংগুলিকে ট্রিগার করতে ব্যর্থ।
আয়নো

.Trigger ('পরিবর্তন') কল করার জন্য কল করা। পরিবর্তন () শর্টহ্যান্ড।
ট্রায়ঙ্কো

9

ভাল () এর পরে কোডটির এই অংশটি যুক্ত করা মনে হচ্ছে:

$(":input#single").trigger('change');

6
হ্যাঁ, তবে এর জন্য আপনার আলাদা ডিওএম নির্বাচন করার দরকার নেই $(":input#single")। আসলে আপনার উচিত হবে না। শুধু পরে এটি চেইন .val()। আপনি ব্যবহার করতে পারেন .trigger('change')বা .change()। তারা ঠিক একই।
ব্যবহারকারী 113716

8

যতদূর আমি এপিআই এর মধ্যে পড়তে পারি। ইভেন্টটি কেবল তখনই বরখাস্ত করা হয় যখন ব্যবহারকারী কোনও বিকল্পে ক্লিক করে।

http://api.jquery.com/change/

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


অন্যান্য উপাদান ধরণের বিকল্পগুলি কী কী? আমি inputউপাদানগুলির জন্য 'পরিবর্তন' ইভেন্টটি তাত্ক্ষণিকভাবে জ্বলতে চাই , যখন উপাদান ফোকাস হারাবে না। তুমি কি জানো?
ড্যান নিসেনবাউম

1
যদি "তাত্ক্ষণিকভাবে" যদি আপনি বোঝায় "যখনই ইনপুটটিতে একটি কী টিপানো হয়" আপনি অনকিপ, অন্ক্রিপ্স এবং অনকিডাউন ইভেন্টগুলি সন্ধান করছেন, অন্বেষণ নয়।
ব্যবহারকারী 2867288

6

এটিকে আরও সহজ করার জন্য একটি কাস্টম ফাংশন যুক্ত করুন এবং যখনই আপনি চান যে মানটি পরিবর্তন করাও পরিবর্তন পরিবর্তন করে

$.fn.valAndTrigger = function (element) {
    return $(this).val(element).trigger('change');
}

এবং

$("#sample").valAndTirgger("NewValue");

অথবা আপনি যখন ভাল কল করা হয় তখন সর্বদা পরিবর্তনটি কল করতে ভাল ফাংশনটি ওভাররাইড করতে পারেন

(function ($) {
    var originalVal = $.fn.val;
    $.fn.val = function (value) {
        this.trigger("change");
        return originalVal.call(this, value);
    };
})(jQuery);

Http://jsfiddle.net/r60bfkub/ এ নমুনা


আমার ব্রাউজারটি খুব বেশি পুনরাবৃত্তির অভিযোগ করে, এর জন্য কোনও সমাধান?
ভার্গব নানেকালভা

আপনি changeনিয়ন্ত্রণের উপরে- শুনছেন এবং একটি কলব্যাক কার্যকর করছেন যা (প্রত্যক্ষ বা অপ্রত্যক্ষভাবে) আবার changeএকই নিয়ন্ত্রণের উপর দিয়ে আসে। আমি আপনাকে সেই ইভেন্টটির জন্য অন্য নাম ব্যবহার করার পরামর্শ দিচ্ছি যা আপনি ম্যানুয়ালি ট্রিগার করেন (উদাঃ explicit.change), যাতে এটি changeআগমনকে পুনরায় ট্রিগার না করে, লুপটিকে বাধা দেয় এবং এখনও আপনাকে ইভেন্টটিতে প্রতিক্রিয়া জানাতে দেয়।
কামাফেদার

3

আপনি যদি ডিফল্ট পরিবর্তন ইভেন্টের সাথে মিশতে না চান তবে আপনি নিজের কাস্টম ইভেন্টটি সরবরাহ করতে পারেন

$('input.test').on('value_changed', function(e){
    console.log('value changed to '+$(this).val());
});

মান সেট এ ইভেন্ট ট্রিগার করতে, আপনি করতে পারেন

$('input.test').val('I am a new value').trigger('value_changed');

3

ওয়ার্ডপ্রেসের সাথে সিএমবি 2 ব্যবহার করার সময় আমি একই সমস্যায় পড়েছি এবং একটি ফাইল আপলোড মেটাবক্সের পরিবর্তনের ইভেন্টটি দেখতে চাই।

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

আমি যে কোডটি ব্যবহার করি তা এখানে:

(function ($) {
    var originalVal = $.fn.val;
    $.fn.val = function (value) {
        if (arguments.length >= 1) {
            // setter invoked, do processing
            return originalVal.call(this, value).trigger('change');
        }
        //getter invoked do processing
        return originalVal.call(this);
    };
})(jQuery);

এটি ভাল, তবে আপনি কীভাবে এটি কেবল একটি নির্দিষ্ট ইনপুটটিতে সীমাবদ্ধ রাখবেন তা প্রদর্শন করতে পারেন?
jwebb

@jwebb আপনি কি বোঝাতে চাইছেন তা নিশ্চিত নয়? আমরা jQuery ভাল () ফাংশনটি ওভাররাইড করছি। আপনি কোনও পরিবর্তন ইনপুট হ্যান্ডলারের একটি নির্দিষ্ট ইনপুটকে আবদ্ধ করেন।
ব্যবহারকারী2075039

আমার অর্থ, @ ব্যবহারকারী2075039, যদি jQuery ভাল () ফাংশনটি ব্যবহার করে পৃষ্ঠায় একাধিক ইনপুট থাকে এবং আপনি কাস্টম পরিবর্তন ইভেন্ট হ্যান্ডলারটি তাদের সকলের সাথে আবদ্ধ করতে চান না তবে কেবল একটি?
jwebb

@ jwebb আপনি একটি নির্দিষ্ট নির্বাচকের জন্য this.selectorওভাররাইডিং $.fn.valফাংশনটির ভিতরে যাচাই করতে পারেন (নির্বাচকটির জন্য কী ব্যবহৃত হয় তার উপর নির্ভরশীল)। এটি সুনির্দিষ্ট ক্ষেত্রগুলির জন্য এটি করার জন্য আমি সবচেয়ে সেরা খুঁজে পেয়েছি, কেবলমাত্র সমস্যা হল তারা অবশ্যই নির্বাচিতদের জন্য কী ব্যবহার করছে তা আপনার অবশ্যই জানা উচিত
sMyles

1
$(":input#single").trigger('change');

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

$('#machineMake').val('<?php echo $_GET['headMake']; ?>').trigger('change');

এবং প্রথম ইভেন্টটি কাজ করেছিল।


10
আমি আশা করি, আপনি সত্যিকারের বিশ্বে এটি কখনও করবেন না। To _GET ['যাই হোক না কেন'] বিশ্বাস করা যায় না তা বলা বাহুল্য।
ডেনিস ভি

1

আপনি যদি কেবল কোনও ফর্মটিতে নির্বাচিত বিকল্পটি যুক্ত করেছেন এবং আপনি পরিবর্তনের ইভেন্টটি ট্রিগার করতে চান তবে আমি একটি সেটটাইমআউট খুঁজে পেয়েছি অন্যথায় jQuery সদ্য যুক্ত হওয়া নির্বাচন করা বাক্সটি বাছাই করে না:

window.setTimeout(function() { jQuery('.languagedisplay').change();}, 1);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.