我遇到了这个特殊问题,我需要在通过 ajax 调用保存数据之前验证数据。 save_ass_rub
当用户导航到不同的 URL 时调用该函数。
在我的应用程序中,我有一个自定义窗口,允许用户输入数据。我能够捕获此步骤中的所有数据:var data = $('form').serialize(true);
。但我需要循环遍历并检查某些特定元素的数据是否为空。当用户位于自定义窗口中时我无法执行此操作。自定义窗口对于用户来说是可选的。我想要的只是警告用户,以防他在提交数据之前将元素留空。
我们正在使用 Prototype.js 和 ajax。
<script>
function save_ass_rub() {
var url = 'xxxx';
var data = $('form').serialize(true);
var result;
new Ajax.Request( url, {
method: 'post',
parameters: data,
asynchronous: false, // suspends JS until request done
onSuccess: function (response) {
var responseText = response.responseText || '';
if (responseText.length > 0) {
result = eval('(' + responseText + ')');
}
}
});
if (result && result.success) {
return;
}
else {
var error = 'Your_changes_could_not_be_saved_period';
if (window.opener) { // ie undocked
//Show alert in the main window
window.opener.alert(error);
return;
}
return error;
}
}
// Set up auto save of rubric when window is closed
Event.observe(window, 'unload', function() {
return save_ass_rub();
});
</script>
这样的事情可以做吗?
行后
var data = $('form').serialize(true);
var split_data = data.split("&");
for (i = 0; i < split_data.length; i++) {
var elem = split_data[i];
var split_elem = elem.split('=');
if( split_elem[0].search(/key/) && split_elem[0] == '' ){
console.log( split_elem );
var error = 'Not all the elements are inputted';
window.opener.alert(error);
return;
}
}
最佳答案
我不会使用序列化的表单字符串,而是使用表单本身来进行验证。如果 $('form')
是您的表单元素,则创建一个单独的函数来检查表单元素,以便对其进行分隔。
function checkform(form)
{
var emptytexts = form.down('input[type="text"]').filter(function(input){
if(input.value.length == 0)
{
return true;
}
});
if(emptytexts.length > 0)
{
return false;
}
return true;
}
以及在save_ass_rub()
函数中
//..snip
if(checkform($('form') == false)
{
var error = 'Not all the elements are inputted';
window.opener.alert(error);
return;
}
var data = $('form').serialize(true);
var result;
我只在 checkform()
函数中添加了文本输入,您可以添加其余的输入类型以及您想要对该函数进行的任何其他奇怪处理。只要返回false就会显示错误并且js停止,否则继续
关于javascript - 如何在 Ajax 中验证序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25868568/