Why is return function different after click
在下面的代码 $(‘body’).delegate(‘.submit’,… passed = search && passed; … 中单击表单中的按钮后,我在 var passed 中输出为 true,以防函数搜索中的 var result 是 false,因为数据是 \\’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 () { |
- 请澄清你的问题。目前还不清楚你在问什么。另外,变量 search 在哪里声明或设置?
- 在这里 passed = search && passed; 搜索是相同的功能搜索。
- 这就解释了。您必须使用 search(e) 实际调用搜索函数,而不仅仅是搜索。
- @jfriend00 也不起作用。看我的回答和评论。我发布了一个 jsFiddle 演示。
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; } }); |
- 我改变但不工作,仍然输出 alert(passed); 是真的,!?
- if (data == 0) { 应该是 if (data ==”0″) {
尝试更改此行:
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); $(‘body’).delegate(‘.submit’, ‘click’, function(e) { if (!(searchResult && passed)) { // <– NOTICE THIS |
设置一个全局变量 searchResult 并在 search() 函数中修改它意味着你不必从它返回任何东西。您现在可以在提交按钮的单击事件中检查 searchResult。您将 search() 函数作为回调附加到 .myclass_1 的 click 事件和 .myclass_2 的 keyup 和 change 事件,所以现在 search() 函数将触发并根据ajax 响应。
- 是的,那是因为在 search() 中,您试图从事件过程中返回一个布尔值。如果您在 e.preventDefault(); 之后添加 return false;,那么当调用 alert() 时您将看到”false”。
- 好的,我改变了,但是如果函数搜索中的输出为真,这里 passed = search() && passed; var passed 的警报总是为假,我该怎么办?
- 问题是您的代码逻辑根本上是错误的。我会尽量让它按照我认为你想要的方式工作。
- 这个问题怎么办?我等了吗?
这里有几个问题。
首先,您的方法 search 在 keyup/etc. 上设置了一个额外的 .live 处理程序,我不明白。如果您的目标是在这些事件上运行 search,请不要再次绑定 search 中的事件。
二、委托函数中的search变量是什么?这应该代表 search() 函数的返回值,还是别的什么?如果它应该是 search() 的返回值,那么它不是——为了让它成为你应该设置一个全局(或命名空间的全局),如上一个问题中所讨论的那样。
我建议在深入学习之前先阅读一些 JavaScript 和 jQuery 教程;从长远来看,它将节省一些时间。在问题上投入大量代码而不了解其工作原理/方式最终会适得其反。
来源:https://www.codenong.com/8282009/