জাভাস্ক্রিপ্টে আমি কীভাবে গতিশীল নামকরণের পদ্ধতিটি কল করব?


113

আমি গতিশীলভাবে এমন কিছু জাভাস্ক্রিপ্ট তৈরির জন্য কাজ করছি যা এটি নির্মাণের সাথে সাথে একটি ওয়েব পৃষ্ঠায় প্রবেশ করানো হবে।

জাভাস্ক্রিপ্ট listboxঅন্যটিতে নির্বাচনের উপর ভিত্তি করে পপুলেট করতে ব্যবহৃত হবে listbox। যখন একটির নির্বাচনটি listboxপরিবর্তন করা হয় এটি এর নির্বাচিত মানের উপর ভিত্তি করে একটি পদ্ধতির নাম কল করবে listbox

উদাহরণ স্বরূপ:

Listbox1 রয়েছে:

  • Colours
  • Shapes

যদি Coloursনির্বাচিত হয় তবে এটি এমন একটি populate_Coloursপদ্ধতির কল করবে যা অন্যকে পপুলেট করে listbox

আমার প্রশ্নটি স্পষ্ট করতে: আমি কীভাবে populate_Coloursজাভাস্ক্রিপ্টে কল করব?


আমি এর বিরুদ্ধে একটি একক 'জনবহুল' পদ্ধতিতে স্থানীয় শাখা রাখার পক্ষে প্রস্তাব দেব recommend এটি এটিকে আরও পরীক্ষামূলক করে তুলবে এবং "হ্যাকি" কম দেখবে
অ্যারন পাওয়েল

আমার উত্তর এখানে দেখুন। জাভাস্ক্রিপ্টে নাম ধরে কল করুন
হুগো আর

উত্তর:


208

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

var method_name = "Colours";
var method_prefix = "populate_";

// Call function:
window[method_prefix + method_name](arg1, arg2);

9
উত্তরের জন্য ধন্যবাদ. 'উইন্ডো' বিটটি সত্যিই আমাকে ছুঁড়েছিল যতক্ষণ না আমি এটি গুগল করেছিলাম এবং খুঁজে পাই না যে বিশ্বব্যাপী অবজেক্টগুলি উইন্ডো অবজেক্টের অংশ। এখন তা বোঝা যায়! ধন্যবাদ. এফওয়াইআই আমি এটি সম্পর্কে একটি ভাল পৃষ্ঠা পেয়েছি এখানে devlicio.us/blogs/sergio_pereira/archive/2009/02/09/…
ক্রিস বি

3
আমি যে ফাংশনগুলি লক্ষ্য করেছিলাম তা বাদ দিয়ে আমি অনুরূপ কিছু করেছি jQuery "fn" নেমস্পেসে। উদাহরণস্বরূপ,$.fn[method_prefix + method_name](arg1, arg2);
16:25 এ কোডেক্রেইগ

1
খুশী হলাম। সম্ভবত একটি ব্লক try/ যোগ করার উপযুক্ত catch
লিগি

এটি কারও কাছে সুস্পষ্ট হতে পারে, তবে যাঁরা এটি কাজ করতে পারেন না তাদের জন্য: ফাংশনটি আপনার কোড $(function () {এবং window.loadকোডের বাইরে ফেলে দিন :)
স্ট্যান স্মুল্ডার

1
@ পিটার কারণ বর্গাকার বন্ধনীগুলি এই প্রসঙ্গে সম্পত্তি অ্যাক্সেসর নয়, তবে একটি অ্যারে চিহ্নিত করে। অ্যারেগুলি ফাংশন নয়, সুতরাং আপনি তাদের কল করতে পারবেন না।
ব্যবহারকারী4642212

39

ট্রিপটিচ যেমন উল্লেখ করেছেন, আপনি হোস্ট অবজেক্টের সামগ্রীতে এটি আবিষ্কার করে যে কোনও বৈশ্বিক স্কোপ ফাংশনটি কল করতে পারেন।

একটি ক্লিনার পদ্ধতি যা গ্লোবাল নেমস্পেসকে অনেক কম দূষিত করে, স্পষ্টভাবে ফাংশনগুলিকে সরাসরি অ্যারেতে রেখে দেয়:

var dyn_functions = [];
dyn_functions['populate_Colours'] = function (arg1, arg2) { 
                // function body
           };
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
                // function body
           };
// calling one of the functions
var result = dyn_functions['populate_Shapes'](1, 2);
// this works as well due to the similarity between arrays and objects
var result2 = dyn_functions.populate_Shapes(1, 2);

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

আপনি এর মতো কোনও বস্তুও ব্যবহার করতে পারেন, যা আপনি ক্লিনারটি দেখতে পাবেন:

var dyn_functions = {};
dyn_functions.populate_Colours = function (arg1, arg2) { 
                // function body
           };
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
                // function body
           };
// calling one of the functions
var result = dyn_functions.populate_Shapes(1, 2);
// this works as well due to the similarity between arrays and objects
var result2 = dyn_functions['populate_Shapes'](1, 2);

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

var dyn_functions = {
           populate_Colours:function (arg1, arg2) { 
                // function body
           };
         , populate_Shapes:function (arg1, arg2) { 
                // function body
           };
};

সম্পাদনা করুন: অবশ্যই কার্যকারিতার বৃহত ব্লকের জন্য আপনি উপরেরটিকে খুব সাধারণ "মডিউল প্যাটার্ন" এ প্রসারিত করতে পারেন যা একটি সংগঠিত পদ্ধতিতে কোড বৈশিষ্ট্যগুলিকে সজ্জিত করার একটি জনপ্রিয় উপায়।


এটি পরিষ্কার রাখার একটি দুর্দান্ত উপায়। যদিও আমি পদ্ধতিটি কল করব? উইন্ডো [ডিন_ফিউশনস ['পপুলেট_ক্লোরস'] (আরজি 1, আরজি 2) কাজ করবে?
ক্রিস বি

আমার নিজের প্রশ্নের উত্তরে - আমি সবেমাত্র উইন্ডো পরীক্ষা করেছি [ডিন_ফিউশনস ['পপুলেট_ক্লোরস'] (আরজি 1, আরজি 2)]; এবং এটি সত্যিই কাজ করে।
ক্রিস বি

4
এপাসকেলো যেমন উল্লেখ করেছেন, আপনার সাধারণত "উইন্ডো" - "ডাইন_ফিউশনস ['পপুলেট_ক্লোরস']] (আরজি 1, আরজি 2) প্রয়োজন হয় না;" কাজ করবে. বাস্তবে গ্লোবাল অবজেক্টের নাম অন্তর্ভুক্ত না করা কোডকে আরও পোর্টেবল করে তুলবে যদি আপনি রুটিনগুলি লিখছেন যা ওয়েব ব্রাউজার ছাড়া অন্য কোনও জেএস পরিবেশে ব্যবহৃত হতে পারে used যদিও এটির ব্যতিক্রম আছে: যদি কোনও ফাংশনে আপনার যদি ডায়ন_ফিউশনস নামে পরিচিত একটি স্থানীয় ভেরিয়েবল থাকে তবে আপনি যেটি উল্লেখ করছেন সেটি আরও নির্দিষ্ট হওয়া দরকার তবে এই পরিস্থিতিটি সর্বোত্তমভাবে এড়ানো (বুদ্ধিমান নামকরণ কনভেনশন করে) যাইহোক।
ডেভিড স্পিললেট

1
যেহেতু এই পোস্টটি '09 এর থেকে আপনি সম্ভবত এখনই এটি জানেন তবে আপনি একটি অ্যারে তৈরি করছেন, তারপরে অ্যারের বৈশিষ্ট্যগুলি (সূচি নয়) বরাদ্দ করছেন। আপনি var dyn_functions = {};সম্ভবত এটি করতে পারেন যাতে আপনি অযথা একটি অ্যারে তৈরি করবেন না ... যদিও এটি কোনও বিশাল সমস্যা নয়।
ডেভিড শেরেট

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

30

আমি এই উদ্দেশ্যে / / ব্যবহার না করার পরামর্শ দেব । পরিবর্তে, এটি এইভাবে করুন: globalwindoweval

সমস্ত পদ্ধতি হ্যান্ডলারের বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করুন:

var Handler={};

Handler.application_run = function (name) {
console.log(name)
}

এখন এটি কল করুন

var somefunc = "application_run";
Handler[somefunc]('jerry');

আউটপুট: জেরি


17

আপনি এটি এইভাবে করতে পারেন:

function MyClass() {
    this.abc = function() {
        alert("abc");
    }
}

var myObject = new MyClass();
myObject["abc"]();

5

একটি মধ্যে ServiceWorkerবা Worker, প্রতিস্থাপন windowসঙ্গে self:

self[method_prefix + method_name](arg1, arg2);

কর্মীদের ডিওমে অ্যাক্সেস নেই, সুতরাং windowএটি একটি অবৈধ রেফারেন্স। এই উদ্দেশ্যে সমতুল্য গ্লোবাল স্কোপ শনাক্তকারী self


2

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

this['yourDynamicFcnName'](arguments);

আরেকটি ঝরঝরে কৌশল বিভিন্ন স্কোপের মধ্যে কল করে এবং উত্তরাধিকারের জন্য এটি ব্যবহার করছে। ধরা যাক আপনি ফাংশনটি বাসা বেঁধেছিলেন এবং বিশ্ব উইন্ডো অবজেক্টে অ্যাক্সেস চান আপনি এটি করতে পারেন:

this['yourDynamicFcnName'].call(window, arguments);

1

হাই এই চেষ্টা,

 var callback_function = new Function(functionName);
 callback_function();

এটি পরামিতিগুলি নিজেই পরিচালনা করবে।


প্রশিক্ষিত রেফারেন্স ত্রুটি -
ফাংশননাম

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

দেখে মনে হচ্ছে নতুন ফাংশন () এই উদ্দেশ্যে ব্যবহার করা যায় না।
JCH77

-1

এখানে কোনও ফাংশনের অস্তিত্ব যাচাই করার জন্য একটি কার্যকরী এবং সহজ সমাধান এবং সেই ফাংশনটিকে গতিশীলভাবে ট্রাইজেড করার জন্য অন্য ক্রিয়াকলাপের দ্বারা ;

ট্রিগার ফাংশন

function runDynmicFunction(functionname){ 

    if (typeof window[functionname] == "function"  ) { //check availability

        window[functionname]("this is from the function it "); //run function and pass a parameter to it
    }
}

এবং আপনি এখন এই জাতীয় পিএইচপি ব্যবহার করে গতিশীলভাবে ফাংশন তৈরি করতে পারেন

function runThis_func(my_Parameter){

    alert(my_Parameter +" triggerd");
}

এখন আপনি গতিশীলভাবে উত্পন্ন ইভেন্টটি ব্যবহার করে ফাংশনটি কল করতে পারেন

<?php

$name_frm_somware ="runThis_func";

echo "<input type='button' value='Button' onclick='runDynmicFunction(\"".$name_frm_somware."\");'>";

?>

আপনার সঠিক HTML কোডটি দরকার

<input type="button" value="Button" onclick="runDynmicFunction('runThis_func');">

-3

এটি দিয়ে চেষ্টা করুন:

var fn_name = "Colours",
fn = eval("populate_"+fn_name);
fn(args1,argsN);

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