Тестирование, если значение является функцией

str.format() изменяет строку на месте, вам все еще нужно сохранить ее в переменную, попробуйте добавить str =:

str = str.format(prim_ident,country_ident,final[0],final[1],final[2],final[3])
85
задан Phil H 4 May 2012 в 13:03
поделиться

12 ответов

Я заменяю кнопку отправки на якорная ссылка. С звонка form.submit () не активируется я нахожу это, и eval () сам. Но я бы хотел проверьте, существует ли функция раньше просто eval (), что там. - 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

Вышеуказанное должно работать независимо от того, назначаете ли вы HTML-атрибут onsubmit или назначаете его в JavaScript:

document.forms['theForm'].onsubmit = onsubmitHandler;
80
ответ дан 24 November 2019 в 08:17
поделиться

Простая проверка, подобная этой, позволит вам узнать, существует ли она / определена:

if (this.onsubmit)
{
  // do stuff;
}
-3
ответ дан 24 November 2019 в 08:17
поделиться
  if ( window.onsubmit ) {
     //
  } else {
     alert("Function does not exist.");
  }
1
ответ дан 24 November 2019 в 08:17
поделиться

I think the source of confusion is the distinction between a node's attribute and the corresponding property.

You're using:

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

You're directly reading the onsubmit attribute's value (which must be a string). Instead, you should access the onsubmit property of the node:

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

Here's a quick test:

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

This yields:

form1 onsubmit property: (function) function onsubmit(event) { return valid(); }
form1 onsubmit attribute: (string) return valid()
1
ответ дан 24 November 2019 в 08:17
поделиться

Что ж, «return valid ();» - это строка, так что это правильно.

Если вы хотите проверить, есть ли к нему прикрепленная функция, вы можете попробовать это :

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

if(typeof formId.onsubmit == "function"){
  alert("it's a function!");
}
1
ответ дан 24 November 2019 в 08:17
поделиться

Если это строка, вы можете предположить / надеяться, что она всегда имеет форму

return SomeFunction(arguments);

, анализировать имя функции, а затем посмотреть, определена ли эта функция с помощью

if (window[functionName]) { 
    // do stuff
}
2
ответ дан 24 November 2019 в 08:17
поделиться

Вы можете попробовать модифицировать этот метод в соответствии с вашими потребностями:

 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.');
 }
3
ответ дан 24 November 2019 в 08:17
поделиться

Убедитесь, что вы вызываете typeof для фактической функции, а не строкового литерала:

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

typeof "x"; // returns "string"

typeof x; // returns "function"
3
ответ дан 24 November 2019 в 08:17
поделиться

Какой браузер вы используете?

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

Это дает me " function " в IE7 и FireFox.

5
ответ дан 24 November 2019 в 08:17
поделиться

Вы можете просто использовать оператор typeof вместе с троичным оператором для краткости:

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

Если это функция, мы вызываем ее и возвращаем ее возвращаемое значение, в противном случае просто return true

Редактировать:

Я не совсем уверен, что вы действительно хотите сделать, но я постараюсь объяснить, что может происходить.

Когда вы объявляете onsubmit кода внутри вашего html, он превращается в функцию и, следовательно, вызывается из JavaScript-мира. Это означает, что эти два метода эквивалентны:

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

Эти два будут обе функциями, и оба будут вызываться. Вы можете протестировать любого из них, используя оператор typeof , который должен дать тот же результат: "function" .

Теперь, если вы назначите строку для "onsubmit" свойство через JavaScript, он останется строкой, следовательно, не вызывается. Обратите внимание, что если вы примените к нему оператор typeof , вы получите «string» вместо «1143981]« function ».

Я надеюсь, что это может прояснить несколько вещей. Опять же, если вы хотите знать, является ли такое свойство (или какой-либо идентификатор для данного вопроса) функцией и вызываемой функцией, оператор typeof типа должен сработать. Хотя я не уверен, работает ли он правильно в нескольких кадрах.

Cheers

если вы хотите знать, является ли такое свойство (или какой-либо идентификатор для данного вопроса) функцией и возможностью вызова, оператор typeof
типа должен решить эту проблему. Хотя я не уверен, работает ли он правильно в нескольких кадрах.

Cheers

если вы хотите знать, является ли такое свойство (или какой-либо идентификатор для данного вопроса) функцией и возможностью вызова, оператор typeof
типа должен решить эту проблему. Хотя я не уверен, работает ли он правильно в нескольких кадрах.

Cheers

12
ответ дан 24 November 2019 в 08:17
поделиться

Попробуйте

if (this.onsubmit instanceof Function) {
    // do stuff;
}
55
ответ дан 24 November 2019 в 08:17
поделиться

form.onsubmit всегда будет функцией, если она определена как атрибут HTML элемента формы. Это какая-то анонимная функция, прикрепленная к элементу HTML, которая имеет указатель this , связанный с этим элементом FORM, а также имеет параметр с именем event , который будет содержать данные о событии submit.

В этих условиях я не понимаю, как вы получили строку в результате операции typeof. Вы должны дать больше деталей, а лучше немного кода.

Редактировать (в ответ на ваше второе редактирование):

Я считаю, что обработчик, прикрепленный к атрибуту HTML, будет выполняться независимо от кода выше. Более того, вы можете попытаться как-то остановить это, но, похоже, что FF 3, IE 8, Chrome 2 и Opera 9 вначале выполняют обработчик атрибута HTML, а затем присоединенный (хотя я не тестировал с jQuery, но с addEventListener и attachEvent). Итак ... что именно вы пытаетесь выполнить?

Кстати, ваш код не работает, потому что ваше регулярное выражение извлекает строку «valid ();», которая определенно не является функцией.

2
ответ дан 24 November 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: