关于javascript:为什么点击后返回功能不同

Why is return function different after click

在下面的代码 $('body').delegate('.submit',... passed = search && passed; ... 中单击表单中的按钮后,我在 var passed 中输出为 true,以防函数搜索中的 var resultfalse,因为数据是 \\'0\\'。怎么解决?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
   function search(e) {
       e.preventDefault();
       $('input').live('keyup change', function () {
           var result = true;
           $.ajax({
               type: 'POST',
               dataType: 'json',
               url: 'myUrl',
               data: myData,
               async: false,
               cache: false,
               success: function (data) {
                   //in the here data is 0
                   if (data == 0) {
                       alert('data is 0')
                       result = false;
                   } else {
                       alert('data is not 0')
                   }
               }
           })
           alert(result) // Output this alert is 'false' because data is '0'
           return result;
       })
   }
   $('.myclass_1').live('click', search);
   $('.myclass_2').live('keyup change', search);

   $('body').delegate('.submit', 'submit', function () {
       var passed = true;
       //passed = required_selectbox() && passed;
       //passed = required_rediuses() && passed;
       passed = search && passed;
       alert(passed); // This output is always 'true' !!!!!!!!!!!!!?
       if (!passed) {
           $('#loadingDiv, #overlay').hide();
           return false;
       }
   });


1
 passed = search && passed;// this line is missing something

它总是返回 true,因为您不是在测试 search 的返回值,而是在测试它是否在那个范围(它所在的范围内)上定义

试试这个

1
2
3
4
5
6
7
8
9
10
11
12
   $('body').delegate('.submit', 'submit', function (event) /* USE the event obj to pass it to search() */
      {
       var passed = true;
       //passed = required_selectbox() && passed;
       //passed = required_rediuses() && passed;
       passed = search(event) && passed;// CHANGES ARE HERE
       alert(passed); // This output is always 'true' !!!!!!!!!!!!!?
       if (!passed) {
           $('#loadingDiv, #overlay').hide();
           return false;
       }
   });


尝试更改此行:

1
passed = search && passed;

收件人:

1
passed = search() && passed;

编辑

在仔细考虑了您似乎希望代码执行的操作后,我将其逻辑重写为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var searchResult = false;
var search = function(e) {
    e.preventDefault();
    $.ajax({
        type: 'POST',
        url: 'myURL',
        data: myData,
        async: false,
        success: function(data) {
            if (data == '0') {
                searchResult = false;
            } else {
                searchResult = true;
            }
        }
    });
};

$('.myclass_1').live('click', search);
$('.myclass_2').live('keyup change', search);

$('body').delegate('.submit', 'click', function(e) {
    var passed = true;

    if (!(searchResult && passed)) { // <-- NOTICE THIS
        $('#loadingDiv, #overlay').hide();
        return false;
    }
});

设置一个全局变量 searchResult 并在 search() 函数中修改它意味着你不必从它返回任何东西。您现在可以在提交按钮的单击事件中检查 searchResult。您将 search() 函数作为回调附加到 .myclass_1 的 click 事件和 .myclass_2 的 keyup 和 change 事件,所以现在 search() 函数将触发并根据ajax 响应。


这里有几个问题。

首先,您的方法 searchkeyup/etc. 上设置了一个额外的 .live 处理程序,我不明白。如果您的目标是在这些事件上运行 search,请不要再次绑定 search 中的事件。

二、委托函数中的search变量是什么?这应该代表 search() 函数的返回值,还是别的什么?如果它应该是 search() 的返回值,那么它不是——为了让它成为你应该设置一个全局(或命名空间的全局),如上一个问题中所讨论的那样。

我建议在深入学习之前先阅读一些 JavaScript 和 jQuery 教程;从长远来看,它将节省一些时间。在问题上投入大量代码而不了解其工作原理/方式最终会适得其反。