2017-01-03 226 views
0

我有一个HTML表单,如果输入文本的值为www,用户可以输入url。在它中,我将创建一个变量并将其返回给函数,然后将其传递给ajax,但似乎当我在控制台中检查它(ajaxData var)时,它说未定义。函数的返回值返回undefined

<form action="" id="defaultForm"> 
    <input type="text" id="url"> 
    <button id="submit">Submit</button> 
</form> 

JS:

$(function() { 
    function myreturnValue() { 
     $('#defaultForm').submit(function() { 

     var w = 'www.'; 
     var current = $('#url').val(); 
     var appendW = w + current; 

     if (current.match('www.')) { 
      console.log('it already consists of www'); 
      var returnValue = 'site_url:' + current; //site_url:www.domain.com or http:// 
      console.log(typeof returnValue); 
      return returnValue; 
     } else { 
      var returnValue = 'site_url:' + appendW; //www+url 
      console.log(current); 
      console.log(appendW); 
      console.log(returnValue); 
      return returnValue; 
     } 
     }); //end submit 
    } 
    var ajaxData = myreturnValue(); 
    console.log(typeof ajaxData); 
    var data = 'data:{' + ajaxData + '}'; 
}); 

然后在AJAX我将通过数据变量。我希望我的解释很清楚。

+0

看来你正在呼吁该行的函数(VAR ... = ajaxData myreturnValue(); ...),它调用父功能,但该功能内变量正在等待表单提交 - 所以变量还不存在。应该重新调用函数调用和操作顺序。 – gavgrif

+0

感谢提示@gavgrif我会尝试调整它。它也是有意义的! – camdev

回答

0
在你的代码

目前,myreturnValue函数只执行代码,注册一个事件监听到你的形式,没有返回值(您return语句只能在submit事件触发),所以这就是为什么它会返回undefined在第一时间。

试试这个:

  • 把你的网址检测功能myreturnValue
  • 逻辑然后把一个代码,以防止默认提交事件被解雇
  • 最后注册一个事件侦听器提交按钮。

而你的原始正则表达式www.的意思是将www与另一个字符如wwww匹配。和www0。将是有效的。您可以考虑将其更改为其他正则表达式像this one

$(function() { 
 
    function myreturnValue() { 
 
    var w = 'www.'; 
 
    var current = $('#url').val(); 
 
    var appendW = w + current; 
 
    if (current.match(w)) { 
 
     console.log('it already consists of www'); 
 
     var returnValue = 'site_url:' + current; //site_url:www.domain.com or http:// 
 
     console.log(typeof returnValue); 
 
     return returnValue; 
 
    } else { 
 
     var returnValue = 'site_url:' + appendW; //www+url 
 
     console.log(current); 
 
     console.log(appendW); 
 
     console.log(returnValue); 
 
     return returnValue; 
 
    } 
 
    } 
 
    $('#defaultForm').submit(function(e) { 
 
    e.preventDefault(); 
 
    }); 
 
    $('#submit').on('click', function() { 
 
    var data = 'data:{' + myreturnValue() + '}'; 
 
    console.log(data); 
 
    }); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<form action="" id="defaultForm"> 
 
    <input type="text" id="url"> 
 
    <button id="submit">Submit</button> 
 
</form>

+0

哦!我也有防止默认,但我没有在这里包括它,因为它不能在我的工作之前,感谢正则表达式! – camdev

0

这里有一些问题。

调用$('#defaultForm').submit(function() {将提交处理程序绑定到表单。它不提交表单也不执行函数。请熟悉with the documentation

您的myreturnValue()不会返回任何内容。您只有一个顶级行,即上面的提交绑定。不仅它不被执行,而且该函数中的return不会像你所期望的那样传播。在事件处理程序内部返回将不会在任何情况下执行任何操作。

请不要在if分支内部声明vars

下面是重组此代码的快速尝试,但有了这些问题,更正后的代码可能取决于您的特定需求。

(function() { 
    $('#defaultForm').submit(function (event) { 

     // prevent default form submit 
     event.preventDefault(); 

     var w = 'www.'; 
     var current = $('#url').val(); 
     var appendW = w + current; 
     var value; 

     if (current.match('www.')) { 
      console.log('it already consists of www'); 
      value = 'site_url:' + current; //site_url:www.domain.com or http:// 
      console.log(typeof returnValue); 
     } else { 
      value = 'site_url:' + appendW; //www+url 
      console.log(current); 
      console.log(appendW); 
      console.log(returnValue); 
     } 

     var data = 'data:{' + ajaxData + '}'; 

     // Do whatever you want with data here 

    }); 

    // If you want to now submit the form by hand... 
    $('#defaultForm').submit(); 

}); 
+0

感谢您的提示,但我可以问,在if语句中声明变量是否是一种不好的做法? – camdev

0

在你的代码中,myreturnValue()只返回函数的returnValue中提交。 'myreturnValue'函数返回任何东西,因为它没有任何返回值。

您执行了不必要的函数来获取ajaxData。 要获得ajaxData,你只需要

$('#defaultForm').submit(function() { 
    contents 
} 

如果修复代码简单...

$('#defaultForm').submit(function() { 
    var returnValue; 
    var w = 'www.'; 
    var current = $('#url').val(); 
    var appendW = w + current; 

    if (current.match('www.')) { 
    console.log('it already consists of www'); 
    returnValue = 'site_url:' + current; //site_url:www.domain.com or http:// 
    console.log(typeof returnValue); 
    } else { 
    returnValue = 'site_url:' + appendW; //www+url 
    console.log(current); 
    console.log(appendW); 
    console.log(returnValue); 
    } 
    console.log(typeof returnValue); 
    var data = 'data:{' + ajaxData + '}'; 
    console.log('data : ', data) 
}); 

请注意:http://codepen.io/onyoon7/pen/mRdJJV