মান একটি ফাংশন কিনা তা পরীক্ষা করা হচ্ছে


88

কোনও ফর্মের মান onsubmitএকটি ফাংশন কিনা তা আমাকে পরীক্ষা করতে হবে। ফর্ম্যাটটি সাধারণত হয় onsubmit="return valid();"। এটি কোনও ফাংশন কিনা তা বলার উপায় আছে এবং এটি কলযোগ্য কিনা? টাইপফ ব্যবহার করে কেবল ফিরে আসে যে এটি একটি স্ট্রিং, যা আমাকে খুব বেশি সহায়তা করে না।

সম্পাদনা : অবশ্যই, আমি বুঝতে পারি যে "রিটার্ন বৈধ ();" একটি স্ট্রিং। আমি replaceএটিকে "বৈধ ();" এবং "বৈধ ()" এ নামিয়ে রেখেছি । আমি জানতে চাই যে এগুলির কোনওটি একটি ফাংশন কিনা।

সম্পাদনা : এখানে কিছু কোড রয়েছে যা আমার সমস্যাটি ব্যাখ্যা করতে সহায়তা করতে পারে:

$("a.button").parents("form").submit(function() {
    var submit_function = $("a.button").parents("form").attr("onsubmit");
    if ( submit_function && typeof( submit_function.replace(/return /,"") ) == 'function' ) {
        return eval(submit_function.replace(/return /,""));
    } else {
        alert("onSubmit is not a function.\n\nIs the script included?"); return false;
    }
} );

সম্পাদনা 2 : এখানে নতুন কোড। দেখে মনে হচ্ছে আমাকে এখনও একটি evল ব্যবহার করতে হবে, কারণ কলিং ফর্ম.সাম্বিট () বিদ্যমান অনসামিতগুলিকে আগুন জ্বালিয়ে দেয় না।

var formObj = $("a.button").parents("form");
formObj.submit(function() {
    if ( formObj[0].onsubmit && typeof( formObj.onsubmit ) == 'function' ) {
        return eval(formObj.attr("onsubmit").replace(/return /,""));
    } else {
        alert("onSubmit is not a function.\n\nIs the script included?");
        return false;
    }
} );

সম্ভবত এটি আরও কীভাবে করা যায় সে সম্পর্কে পরামর্শগুলি?

উত্তর:


85

আমি অ্যাঙ্কর লিঙ্কটি দিয়ে একটি জমা বোতামটি প্রতিস্থাপন করছি। যেহেতু form.submit () কে কল করা অনস্মিতগুলিকে সক্রিয় করে না, তাই আমি এটি সন্ধান করছি এবং নিজেই এটি আবিষ্কার করছি। তবে আমি যাচাই করে দেখতে চাই ফাংশনটি উপস্থিত রয়েছে কিনা তা আগেই দেখানোর আগে (সেখানে) রয়েছে ing - gms8994

<script type="text/javascript">
function onsubmitHandler() {
    alert('running onsubmit handler');
    return true;
}
function testOnsubmitAndSubmit(f) {
    if (typeof f.onsubmit === 'function') {
        // onsubmit is executable, test the return value
        if (f.onsubmit()) {
            // onsubmit returns true, submit the form
            f.submit();
        }
    }
}
</script>

<form name="theForm" onsubmit="return onsubmitHandler();">
<a href="#" onclick="
    testOnsubmitAndSubmit(document.forms['theForm']);
    return false;
"></a>
</form>

সম্পাদনা: ফাংশন টেস্টঅনুবমিটঅ্যান্ডসবমিটে প্যারামিটারটি অনুপস্থিত

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

document.forms['theForm'].onsubmit = onsubmitHandler;

4
f.onsubmit এফ কোথা থেকে আসে?
আর্ট

fএকটি ফর্ম উদাহরণ। আপনি এটি একটি আর্গুমেন্ট হিসাবে testOnsubmitAndSubmit ফাংশনে পাস করুন। (আমি জানি এই প্রশ্নটি বেশ পুরানো, তবে সম্ভবত আমার উত্তর
কারওর জন্য

63

চেষ্টা করুন

if (this.onsubmit instanceof Function) {
    // do stuff;
}

7
এটি কেবল একটি নমুনা। আপনি instanceof ফাংশন button.onsubmit তা পরিবর্তন করতে পারেন
artemb

13

আপনি কেবল typeofসংক্ষিপ্তসার জন্য একটি টার্নারি অপারেটরের সাথে অপারেটরটি সহজেই ব্যবহার করতে পারেন :

onsubmit="return typeof valid =='function' ? valid() : true;"

যদি এটি কোনও ফাংশন হয় তবে আমরা এটিকে কল করব এবং এটির ফেরতের মান ফিরিয়ে দেব, অন্যথায় কেবল ফিরে আসুন true

সম্পাদনা করুন:

আপনি সত্যিই কী করতে চান তা সম্পর্কে আমি নিশ্চিত নই, তবে কী ঘটতে পারে তা আমি ব্যাখ্যা করার চেষ্টা করব।

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

HTML: <form onsubmit="return valid();" />
JavaScript: myForm.onsubmit = function() { return valid(); };

এই দুটি উভয় ফাংশন হবে এবং উভয় কলযোগ্য হবে। আপনি ব্যবহার করছেন তাদের কোন পরীক্ষা করতে পারেন typeof: অপারেটর যা একই ফলাফল yeld উচিত "function"

এখন আপনি যদি জাভাস্ক্রিপ্টের মাধ্যমে "অনসামিত" সম্পত্তিটিতে একটি স্ট্রিং অর্পণ করেন তবে এটি স্ট্রিং থাকবে, সুতরাং কলযোগ্য নয়। লক্ষ্য করুন যে আপনি যদি typeofঅপারেটরের বিরুদ্ধে এটি প্রয়োগ করেন তবে আপনি তার "string"পরিবর্তে পেয়ে যাবেন "function"

আমি আশা করি এটি কিছু বিষয় স্পষ্ট করে দিতে পারে। তারপরে আবারও যদি আপনি জানতে চান যে এই জাতীয় সম্পত্তি (বা বিষয়টির জন্য কোনও সনাক্তকারী) কোনও ফাংশন এবং কলযোগ্য, typeofঅপারেটরটিকে কৌশলটি করা উচিত। যদিও আমি নিশ্চিত নই যে এটি একাধিক ফ্রেম জুড়ে সঠিকভাবে কাজ করে।

চিয়ার্স


যদিও অনস্মিটের বাইরে আমার এটি পরীক্ষা করা দরকার।
গ্লেন সলসবেরি

5

আপনি কোন ব্রাউজার ব্যবহার করছেন?

alert(typeof document.getElementById('myform').onsubmit);

এটি আমাকে functionআই 7 এবং ফায়ারফক্সে " " দেয় ।


এমনকি যদি আপনার অনস্মিটটি "রিটার্ন বৈধ ();" হয়?
গ্লেন সলসবেরি

4
হ্যাঁ - ভুলবেন না যে কোনও ফাংশনের বাইরে আপনার "রিটার্ন" থাকতে পারে না।
গ্রেগ

form.onsubmit যতক্ষণ এটি এইচটিএমএল বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত হয় ততক্ষণ একটি ফাংশন থাকবে। আমার উত্তর দেখুন।
আয়নু জি স্টান

4

স্ট্রিং ভিত্তিক ভেরিয়েবলটিকে উদাহরণ হিসাবে ব্যবহার করা এবং ব্যবহার করা instanceof Function আপনি ফাংশনটি নিবন্ধভুক্ত করুন ... ভেরিয়েবলটি সাইন ইন করুন ... ভেরিয়েবলটি ফাংশনের নামটি পরীক্ষা করুন ... প্রাক-প্রক্রিয়া করুন ... ফাংশনটি নতুন ভারে নির্ধারণ করুন ... তারপরে ফাংশন কল।

function callMe(){
   alert('You rang?');
}

var value = 'callMe';

if (window[value] instanceof Function) { 
    // do pre-process stuff
    // FYI the function has not actually been called yet
    console.log('callable function');
    //now call function
   var fn = window[value];
   fn();
}

4
আপনার আসলে এফএন ভেরিয়েবলের দরকার নেই, আপনি কেবল উইন্ডো [মান] () ব্যবহার করতে পারেন;
লাজোস মেসারোস

4
হ্যাঁ আমি জানি কিন্তু আমি এও বুঝতে পারি যে সাধারণভাবে একটি দীর্ঘ বিন্যাসে বুঝতে সহজ এবং এই প্রাথমিকভাবে আপনার ইনপুট শেখার জন্য একটি সাইট যে কোন ক্ষেত্রে @LajosMeszaros মধ্যে মূল্যবান হয়
CrandellWS

3

নিশ্চিত করুন যে আপনি টাইপফোনটি প্রকৃত ফাংশনে কল করছেন, স্ট্রিং আক্ষরিক নয়:

function x() { 
    console.log("hi"); 
}

typeof "x"; // returns "string"

typeof x; // returns "function"

3

আপনার প্রয়োজন অনুসারে আপনি এই কৌশলটি পরিবর্তন করার চেষ্টা করতে পারেন:

 function isFunction() {
   var functionName = window.prompt('Function name: ');
   var isDefined = eval('(typeof ' + functionName + '==\'function\');');
   if (isDefined)
     eval(functionName + '();');
   else
     alert('Function ' + functionName + ' does not exist');
 }
 function anotherFunction() {
   alert('message from another function.');
 }

2

ফর্ম উপাদানগুলির HTML হিসাবে একটি বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করা হলে form.onsubmit সর্বদা একটি ফাংশন হবে। এটি এইচটিএমএল উপাদানগুলির সাথে সংযুক্ত কিছু ধরণের বেনামি ফাংশন, যার এই পয়েন্টারটি সেই ফর্ম উপাদানটির সাথে আবদ্ধ এবং এর সাথে একটি প্যারামিটার eventরয়েছে যা জমা দেওয়ার ইভেন্টের ডেটা ধারণ করবে।

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

সম্পাদনা করুন (আপনার দ্বিতীয় সম্পাদনের প্রতিক্রিয়া হিসাবে):

আমি বিশ্বাস করি যে এইচটিএমএল বৈশিষ্ট্যের সাথে সংযুক্ত হ্যান্ডলারটি উপরের কোড নির্বিশেষে নির্বাহ করবে। আরও আরও, আপনি এটি কোনওভাবে বন্ধ করার চেষ্টা করতে পারেন, তবে, এটি উপস্থিত হয় যে এফএফ 3, আই 8, ক্রোম 2 এবং অপেরা 9 প্রথমে এইচটিএমএল বৈশিষ্ট্য হ্যান্ডলারটি কার্যকর করছে এবং তারপরে সংযুক্ত একটি (আমি jQuery দিয়ে পরীক্ষা করিনি) যদিও, তবে addEventListener এবং AttEvent সহ) with সুতরাং ... আপনি ঠিক কি অর্জন করতে চেষ্টা করছেন?

যাইহোক, আপনার কোডটি কাজ করছে না কারণ আপনার নিয়মিত প্রকাশটি "বৈধ ();" স্ট্রিংটি বের করবে, যা অবশ্যই কোনও ফাংশন নয়।


2

যদি এটি একটি স্ট্রিং হয় তবে আপনি ধরে নিতে পারেন / আশা করতে পারেন এটি সর্বদা ফর্মের

return SomeFunction(arguments);

ফাংশনটির নামটি বিশ্লেষণ করুন এবং তারপরে দেখুন যদি সেই ফাংশনটি ব্যবহার করে সংজ্ঞায়িত করা হয়

if (window[functionName]) { 
    // do stuff
}

আমি এই রেজোলিউশনটিও যুক্ত করতে যাচ্ছিলাম ... কেবলমাত্র ডকুমেন্ট / উইন্ডো স্তরে ফাংশনটি নিবন্ধ করার জন্য মনে রাখবেন
CrandellWS

1

ঠিক আছে, "return valid();" এটি একটি স্ট্রিং, তাই এটি সঠিক।

পরিবর্তে এটির কোনও ফাংশন সংযুক্ত রয়েছে কিনা তা যদি আপনি পরীক্ষা করতে চান তবে আপনি এটি চেষ্টা করতে পারেন:

formId.onsubmit = function (){ /* */ }

if(typeof formId.onsubmit == "function"){
  alert("it's a function!");
}

1

আমি মনে করি বিভ্রান্তির উত্স হ'ল নোডের গুণাবলী এবং সংশ্লিষ্ট সম্পত্তির মধ্যে পার্থক্য

আপনি ব্যবহার করছেন:

$("a.button").parents("form").attr("onsubmit")

আপনি সরাসরি পড়ি onsubmit অ্যাট্রিবিউট এর মান (যা উচিত নয় একটি স্ট্রিং হতে)। পরিবর্তে, আপনার নোডের onsubmit সম্পত্তি অ্যাক্সেস করা উচিত :

$("a.button").parents("form").prop("onsubmit")

এখানে একটি দ্রুত পরীক্ষা:

<form id="form1" action="foo1.htm" onsubmit="return valid()"></form>
<script>
window.onload = function () {
    var form1 = document.getElementById("form1");

    function log(s) {
        document.write("<div>" + s + "</div>");
    }

    function info(v) {
        return "(" + typeof v + ") " + v;
    }

    log("form1 onsubmit property: " + info(form1.onsubmit));
    log("form1 onsubmit attribute: " + info(form1.getAttribute("onsubmit")));
};
</script> 

এই ফলন:

form1 অনসামিত সম্পত্তি: (ফাংশন) ফাংশন অনসমিট (ইভেন্ট) valid বৈধ () ফেরত; }
form1 অনসামিত বৈশিষ্ট্য: (স্ট্রিং) বৈধ ()


1

হয় না typeof xxx === 'function' সবচেয়ে ভাল এবং দ্রুততম?

উদাহরণস্বরূপ এবং বাইরের তুলনায় আপনি এটি চেষ্টা করতে পারেন এমন একটি বেঞ্চ তৈরি করেছি

  1. এটি কেবল উদাহরণের চেয়ে দ্রুত বলে মনে হচ্ছে (ক্রোম ব্যবহার করে)
  2. ভেরিয়েবল সংজ্ঞায়িত না হলে এটি ত্রুটি টানবে না

এখানে একটি বেঞ্চ: https://jsbench.me/qnkf076cqb/1


0

আপনি সবসময় ক্রিস ওয়েস্টের মতো জাভাস্ক্রিপ্ট ব্লগে টাইপ অফ ফাংশনগুলির একটি ব্যবহার করতে পারেন । typeOf()ফাংশনটির জন্য নিম্নলিখিতগুলির মতো সংজ্ঞা ব্যবহার করা কাজ করবে:

function typeOf(o){return {}.toString.call(o).slice(8,-1)}

এই ফাংশনটি (যা বিশ্বব্যাপী নেমস্পেসে ঘোষিত হয়েছে) এটি ব্যবহার করা যেতে পারে:

alert("onsubmit is a " + typeOf(elem.onsubmit));

যদি এটি কোনও ফাংশন হয় তবে "ফাংশন" ফিরিয়ে দেওয়া হবে। এটি যদি স্ট্রিং হয় তবে "স্ট্রিং" ফিরিয়ে দেওয়া হবে। অন্যান্য সম্ভাব্য মানগুলি এখানে দেখানো হয়েছে


0
// This should be a function, because in certain JavaScript engines (V8, for
// example, try block kills many optimizations).
function isFunction(func) {
    // For some reason, function constructor doesn't accept anonymous functions.
    // Also, this check finds callable objects that aren't function (such as,
    // regular expressions in old WebKit versions), as according to EcmaScript
    // specification, any callable object should have typeof set to function.
    if (typeof func === 'function')
        return true

    // If the function isn't a string, it's probably good idea to return false,
    // as eval cannot process values that aren't strings.
    if (typeof func !== 'string')
        return false

    // So, the value is a string. Try creating a function, in order to detect
    // syntax error.
    try {
        // Create a function with string func, in order to detect whatever it's
        // an actual function. Unlike examples with eval, it should be actually
        // safe to use with any string (provided you don't call returned value).
        Function(func)
        return true
    }
    catch (e) {
        // While usually only SyntaxError could be thrown (unless somebody
        // modified definition of something used in this function, like
        // SyntaxError or Function, it's better to prepare for unexpected.
        if (!(e instanceof SyntaxError)) {
            throw e
        }

        return false
    }
}

-3

এর মতো একটি সাধারণ চেক আপনাকে জানায় যে এটি বিদ্যমান / সংজ্ঞায়িত হয়েছে:

if (this.onsubmit)
{
  // do stuff;
}

6
এটি কাজ করবে না। অনসামিতটি যদি একটি খালি-খালি স্ট্রিংও হয় তবে if টি সত্যের প্রতি জোড় করে।
Seb

4
কিছু যদি কোনও ফাংশন হয় তবে পরীক্ষার একটি ভয়াবহ উপায় - যেমনটি ইঙ্গিত করা হয়েছে, এবং আরও স্পষ্ট করে বলা যেতে পারে: "সত্যবাদী" যে কোনও কিছুই এই কোডটিকে "স্টাফ" করতে পারে এবং এটি প্রত্যাশিত যা হতে পারে তা নাও হতে পারে। এটি.সনমিটটি যদি 5 বা "হ্যালো" বা জাভাস্ক্রিপ্টের অন্য যে কোনও কিছুর মান সেট করা থাকে যা সত্যকে মূল্যায়ন করে, আপনি অপ্রত্যাশিত আচরণ পেতে চলেছেন।
জেসন বুটিং

প্রশ্নের বিষয় জিজ্ঞাসা করে যে কিছু উপস্থিত রয়েছে কিনা তা পরীক্ষা করে দেখুন। এটাই আমি পরামর্শ দিচ্ছিলাম - আর নেই, কমও নয়।
কন

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