سؤال

أحتاج إلى اختبار ما إذا كانت قيمة النموذج onsubmit هي وظيفة. الشكل هو عادة onsubmit="return valid();". وبعد هل هناك طريقة لمعرفة ما إذا كانت هذه وظيفة، وإذا كان ذلك ممكنا؟ باستخدام TypeOf إرجاع فقط أنها سلسلة، والتي لا تساعدني كثيرا.

تعديل: بالطبع، أنا أفهم أن "العودة صالحة ()؛" هي سلسلة. لقد قمت replaceD قديم إلى "صالح ()؛"، وحتى "صالح ()". أريد أن أعرف ما إذا كان أي من هذه الوظائف.

تعديل: إليك بعض الكود، والتي قد تساعد في شرح مشكلتي:

$("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.: إليك الرمز الجديد. يبدو أنه لا يزال يتعين علي استخدام Eval، لأن استدعاء Form.Submit () لا أطلق النار على Onsubmits الموجودة.

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;
    }
} );

اقتراحات حول ربما كيف تفعل هذا أفضل؟

هل كانت مفيدة؟

المحلول

أنا استبدال زر إرسال مع رابط مرساة. نظرا لأن Calling Form.Submit () لا يقوم بتنشيط Onsubmit، فأنا أجد ذلك، و eval () Ing IT بنفسي. ولكن أود التحقق مما إذا كانت الوظيفة موجودة قبل التقييم () جي ما هو هناك. - 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>

تحرير: المعلمة المفقودة F في وظيفة TestOnsubMitandsubmit

يجب أن تعمل أعلاه بغض النظر عما إذا كنت تعين onsubmit سمة HTML أو تعيينها في جافا سكريبت:

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

نصائح أخرى

يحاول

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

يمكنك ببساطة استخدام typeof المشغل جنبا إلى جنب مع مشغل ternary لفترة قصيرة:

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

إذا كانت وظيفة نسميها وإرجاع قيمة الإرجاع، وإلا عاد فقط true

يحرر:

لست متأكدا تماما ما تريد فعله حقا، لكنني سأحاول شرح ما قد يحدث.

عندما تعلن onsubmit الرمز داخل HTML الخاص بك، يتم تحويله إلى وظيفة وبالتالي استعادة من جافا سكريبت "العالم". هذا يعني أن هاتين الطريقتين تعادل:

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

ستكون هذين الوظائف وكلاهما سيكون قابل للاستدعاء. يمكنك اختبار أي من أولئك الذين يستخدمون typeof المشغل الذي يجب أن يلغي بنفس النتيجة: "function".

الآن إذا قمت بتعيين سلسلة إلى خاصية "Onsubmit" عبر JavaScript، فستظل سلسلة، وبالتالي غير قابل للاستدعاء. لاحظ أنه إذا قمت بتطبيق typeof المشغل ضدها، سوف تحصل "string" بدلا من "function".

آمل أن يكون هذا قد يوضح بعض الأشياء. ثم مرة أخرى، إذا كنت ترغب في معرفة ما إذا كانت هذه الخاصية (أو أي معرف للمسألة) هي وظيفة وقابلة للاستدعاء typeof يجب أن يفعل المشغل الحيلة. على الرغم من أنني لست متأكدا مما إذا كان يعمل بشكل صحيح عبر إطارات متعددة.

هتافات

ما المتصفح الذي تستخدمه؟

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

هذا يعطيني "function"في IE7 و Firefox.

تأكد من أنك تستدعي TypeOf في الوظيفة الفعلية، وليس سلسلة حرفية:

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

typeof "x"; // returns "string"

typeof x; // returns "function"

باستخدام متغير على أساس سلسلة كمثال واستخدام instanceof Function قمت بتسجيل الوظيفة .. passign المتغير ... تحقق من المتغير هو اسم الوظيفة ... قم بمعالجة ما قبل ... قم بتعيين الوظيفة إلى New Var ... ثم استدعاء الوظيفة.

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();
}

يمكنك محاولة تعديل هذه التقنية لتناسب احتياجاتك:

 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.');
 }

Form.ONSUBMIT سيكون دائما وظيفة عند تعريفها كسمية من HTML عنصر النموذج. إنه نوع من الوظيفة المجهولة المرفقة بعنصر HTML، والذي لديه هذه مؤشر ملزمة لعنصر النموذج هذا وكذلك معلمة اسمه event والتي سوف تحتوي على بيانات حول حدث تقديم.

في ظل هذه الظروف، لا أفهم كيف حصلت على سلسلة نتيجة تشغيل من النوع. يجب أن تعطي المزيد من التفاصيل، وأفضل بعض الكود.

يحرر (كإعادة استجابة للتحرير الثاني الخاص بك):

أعتقد أن المعالج المرفقة لسمة HTML ستنفذ بغض النظر عن التعليمات البرمجية أعلاه. علا الوقت، يمكنك محاولة إيقافها بطريقة أو بأخرى، ولكن يبدو أن FF 3، IE 8، Chrome 2 والأوبرا 9 تقوم بتنفيذ معالج سمة HTML في المقام الأول ثم المرفق (لم يتم اختباره باستخدام JQuery رغم ذلك، ولكن مع addeventlistener و stopelevent). لذلك ... ماذا تحاول إنجاز بالضبط؟

بالمناسبة، لا يعمل الكود الخاص بك لأن تعبيرك العادي سوف يستخرج السلسلة "صالح ()؛"، وهذا ليس بالتأكيد وظيفة.

إذا كانت سلسلة، فيمكنك أن تفترض / آمل أن تكون دائما من النموذج

return SomeFunction(arguments);

تحليل اسم الوظيفة، ثم معرفة ما إذا كانت هذه الوظيفة محددة باستخدام

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

نحن سوف، "return valid();" يكون سلسلة، لذلك هذا صحيح.

إذا كنت ترغب في التحقق مما إذا كان لديه وظيفة متصلة بدلا من ذلك، فيمكنك تجربة هذا:

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

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

أعتقد أن مصدر الارتباك هو التمييز بين العقدة ينسب و المقابلة خاصية.

أنت تستخدم:

$("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 خاصية Onsubmit: (وظيفة) وظيفة Onsubmit (الحدث) {الرجوع صالح ()؛ } سمة Form1 Onsubmit: (سلسلة) العودة صالحة ()
  if ( window.onsubmit ) {
     //
  } else {
     alert("Function does not exist.");
  }

يمكنك دائما استخدام واحدة من وظائف TypeOf على مدونات JavaScript مثل كريس ويست. وبعد باستخدام تعريف مثل ما يلي ل typeOf() وظيفة ستعمل:

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

هذه الوظيفة (التي تم الإعلان عنها في مساحة الاسم العالمية، يمكن استخدامها مثل هذا:

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

إذا كانت وظيفة، فسيتم إرجاع "الوظيفة". إذا كانت سلسلة، فسيتم إرجاع "سلسلة". وتظهر القيم المحتملة الأخرى هنا.

// 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
    }
}

سيخليك شيك بسيط مثل هذا معرفة ما إذا كان موجودا / محدد:

if (this.onsubmit)
{
  // do stuff;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top