【问题标题】:Why does the content of the function load, but not the function when it is called?为什么调用时加载的是函数的内容,而不加载函数?
【发布时间】:2011-05-18 23:13:34
【问题描述】:

我正在调用的函数(使用 jQuery)有问题。 我的问题是,当我尝试在另一个函数中调用一个函数时,第一个函数没有被调用。但是,当我将失败函数的内容放入调用所述失败函数的那个​​时,代码执行得很好。我会告诉你我在说什么:

$('form.register .submit').click(validateRegister);

function submitStart() {

    var $this = $(this);
    $this.parent().addClass('processing');

    var $processing = $('#processing');
    $processing.show();

    var $endNote = $this.parent().find('#endNote')
    $endNote.slideDown();

}

function validateRegister(){

    submitStart();

}

看,当 submitStart() 的内容放入 validateRegister() 时,它们的代码就会执行。但是,当调用此代码中显示的函数时,它无法工作。我考虑过范围(至少据我所知)无济于事。

非常感谢任何帮助,谢谢!

【问题讨论】:

  • 你试过$('form.register .submit').click(submitStart);
  • 这很奇怪,我用我制作的表单尝试了你在这里的确切代码,它可以工作并执行 submitStart()

标签: javascript jquery function scope call


【解决方案1】:

您正在失去预期的 this 值,因此 submitStart 可能会被调用,但无法正常工作。

这样做:

function validateRegister(){

    submitStart.call( this );

}

在这里,您通过 .call() 方法调用 submitStart 方法,该方法可用于函数实例。

.call() 方法可让您在所调用的函数中手动设置this 的值。

因此,因为您已将 validateRegister 指定为处理程序,所以 jQuery 确保 this 的值是您的元素。但由于validateRegister 正在调用另一个函数,它负责确保该函数具有正确的this 值。


请记住,当您调用这样的任何函数时:

someFunction();

...该函数中this 的值将是window,除非您手动将其设置为其他值。

【讨论】:

    【解决方案2】:

    var $this = $(this); 正在返回窗口。

    【讨论】:

      【解决方案3】:

      this 将不再引用单击的元素,而是表示window。您可以更改submitStart 使其接受参数并将this 传递给它。

      【讨论】:

        【解决方案4】:

        我认为您可能对this 不是您认为的那样有疑问。

        试试这个:

        submitStart.call(this)

        【讨论】:

          【解决方案5】:

          这里的问题是this。当您使用 validateRegister 作为事件处理程序时,jQuery 会自动确保 this 引用调度事件的 DOM 元素。但是当您调用单独的函数时,范围设置不正确,因此 this 可能指的是 window 对象(这是您在全局范围内引用 this 时的默认值)。要修复它,最简单的方法是将元素作为参数传递:

          function submitStart(element) {
          
              var $this = $(element);
              $this.parent().addClass('processing');
          
              var $processing = $('#processing');
              $processing.show();
          
              var $endNote = $this.parent().find('#endNote')
              $endNote.slideDown();
          
          }
          
          function validateRegister(){
              // "this" is the DOM element
              submitStart(this);
          }
          

          正如@Andrew 所说,您还可以使用submitStart 函数的the .apply() methodsubmitStart 中设置this 的值。

          【讨论】:

            猜你喜欢
            • 2012-04-12
            • 1970-01-01
            • 1970-01-01
            • 2017-03-10
            • 1970-01-01
            • 2022-01-19
            • 1970-01-01
            • 2014-10-19
            • 2023-03-29
            相关资源
            最近更新 更多