是否可以调用嵌套在另一个函数中的函数?

时间:2013-08-16 22:49:27

标签: javascript jquery

我创建了一个包含以下内容的javascript文件:

(function ($) {
  //Define a Drupal behaviour with a custom name
  Drupal.behaviors.jarrowDynamicTextfieldValidator = {
    attach: function (context) {
        //Add an eventlistener to the document reacting on the
        //'clientsideValidationAddCustomRules' event.
        $(document).bind('clientsideValidationAddCustomRules', function(event){
            //Add your custom method with the 'addMethod' function of jQuery.validator
            //http://docs.jquery.com/Plugins/Validation/Validator/addMethod#namemethodmessage
            jQuery.validator.addMethod("typeValidator", function(value, element, param) {

             ...bunch of code here...

           }, jQuery.format('Field can not be empty'));
        });
      }
   };
})(jQuery);

我想要做的是在选择框中添加一个更改侦听器,以便在选择更改时调用此验证函数。我不确定我是否可以这样做,因为验证代码被隐藏在几个函数中。这可能吗?

2 个答案:

答案 0 :(得分:1)

您的原始代码显示它的方式,不,您将无法调用任何这些函数,因为它们是anonymous并且在父级的范围内功能

如果要为调用它的函数之外的函数声明一个变量,那么你将能够重用该函数,因为它将全局到该范围其他功能。注意:如果您希望变量完全是全局变量,或者更确切地说,无论您在代码中的哪个位置都可以访问它,只需不要在变量前面写var,它就会“ global“,实际上相当于将变量放在window命名空间中。

以下是使用您的代码的示例:

(function ($) {

    var customCallback = function(event){
        //Add your custom method with the 'addMethod' function of jQuery.validator
        //http://docs.jquery.com/Plugins/Validation/Validator/addMethod#namemethodmessage
        jQuery.validator.addMethod("typeValidator", function(value, element, param) {

         ...bunch of code here...

       }, jQuery.format('Field can not be empty'));
    };

   //Define a Drupal behaviour with a custom name
   Drupal.behaviors.jarrowDynamicTextfieldValidator = {
      attach: function (context) {
         //Add an eventlistener to the document reacting on the
         //'clientsideValidationAddCustomRules' event.
         $(document).bind('clientsideValidationAddCustomRules', customCallback);
      }
   };

   //now you can use that function again...
   $('#something').on('someEvent', customCallback );

})(jQuery);

请注意,您必须对该功能进行一些调整,以确保所有变量都可用,以及由于范围可变而导致的变量。因此,这可能需要进行一些调整才能使其适用于您的场景。

答案 1 :(得分:1)

通常你不能在不修改代码的情况下调用那个匿名函数,但这似乎是为jQuery Validation Plugin注册自定义验证规则的方式,一旦注册,你绝对可以使用该自定义规则通过插件的API。

例如,以下代码添加了自定义规则:

jQuery.validator.addMethod("typeValidator", function(value, element, param) {

 ...bunch of code here...

}, jQuery.format('Field can not be empty'));

现在,您可以在表单上初始化插件并调用valid函数来验证表单。

$('#someForm').validate({
    rules: {
        someField: {
            typeValidator: true //use the custom validation rule
        }
    } 
});

现在,您可以使用$('#someForm').valid()检查表单是否有效。

有关更多信息,请查看plugin's API