迹忆客 专注技术分享

当前位置:主页 > 学无止境 > WEB前端 > JavaScript >

JavaScript 序列化表单

作者:迹忆客 最近更新:2024/03/20 浏览次数:

想知道一个解决方案,让你可以在使用和不使用 jQuery 的情况下在 JavaScript 中序列化表单?本教程将指导你使用/不使用 jQuery 的 JavaScript 序列化表单。

但在此之前,了解 JavaScript Serialize 是很好的。序列化是将数据结构或对象转换为合适的格式以通过网络传输的过程。

我们可以通过调用方法 JSON.stringify() 将对象序列化为 JSON 字符串,同时调用 CSSStyleDeclaration.getPropertyValue() 方法来序列化我们的 CSS 值。

在本教程中,我们将序列化表单和对象。我们将使用 JSON.stringify()XMLSerializer()FormData 接口在 JavaScript 中进行序列化。

JSON.stringify() 将 JavaScript 值或对象转换为 JSON 字符串。它可以有至少一个,最多三个参数。

这里,value 参数是必需的,而 replacerspace 是可选的。你可以在此处找到有关这些参数的更多信息。

我们将使用 XMLSerializer()serializeToString() 方法将我们的文档对象模型 (DOM) 树转换为 XML 字符串。FormData 接口有助于创建键值对的集合,该集合描述了具有相应值的表单字段。

然后,这些很容易使用 XMLHttpRequest.send() 方法发送。

让我们从使用 JSON.stringify() 方法序列化对象开始,因为我们将在序列化表单时连接到这个概念。


使用 JSON.stringify() 方法序列化 JavaScript 对象

HTML 代码:

<!DOCTYPE html>
<html>
 	<head>
 		<title> Serialize Object using JSON</title>
 	</head>
 	<body>
        Type of Resulting String: <span id="resultType"></span><br />
        JSON String: <span id="serialized"></span><br >
        From JSON to JS Object: <span id="object"></span>
 	</body>
</html>

JavaScript 代码:

let student = {
  firstname: 'John',
  lastname: 'Christopher',
  semester: 4,
  courses: ['Python', 'JavaScript', 'Java']
};

let jsonString = JSON.stringify(student);
resultType.innerHTML = typeof jsonString;
serialized.innerHTML = jsonString;

let jsonToObject = JSON.parse(jsonString.replace(/&quot;/g, ' '));
object.innerHTML = '{firstname:' + jsonToObject.firstname + ',' +
    'lastname:' + jsonToObject.lastname + ',' +
    'semester: ' + jsonToObject.semester + ',' +
    'courses: [' + jsonToObject.courses + ']}';

输出:

Type of Resulting String:
string

JSON String:
{"firstname":"John","lastname":"Christopher","semester":4,"courses":["Python","JavaScript","Java"]}

From JSON to JS Object:
{firstname:John,lastname:Christopher,semester: 4,courses: [Python,JavaScript,Java]}

在上面的代码中,JSON.stringify() 采用名为 student 的对象并将其转换为序列化或字符串化字符串。

我们可以使用 typeof 检查结果字符串的数据类型。

replace() 方法查找&quote; (这些在双引号编码时可见,你可以在控制台上打印 jsonString 时看到)在一个字符串中(这里的字符串是 jsonString)并用空格替换它。

JSON.parse() 方法将字符串转换回对象。

此外,JSON.stringify() 也与原语一起使用。请参阅以下代码。

alert(JSON.stringify(3))  // Output: 3
// a string in JSON is still a string, but double-quoted
alert(JSON.stringify('Mehvish'))      // Output: "Mehvish"
alert(JSON.stringify(false));         // Output: false
alert(JSON.stringify([5, 3, 6, 4]));  // Output: [5,3,6,4]

在 JavaScript 中使用 FormData() 序列化表单

让我们从使用 FormData()XMLHttpRequest.send() 方法序列化数据的最简单方法开始。

HTML 代码:

<!DOCTYPE html>
<html>
	 <head>
 		<title>Serialize Form</title>
 	 </head>
 	<body>
 		<form id="form">
 			<label for="firstname">FirstName:</label>
 			<input type="text" name="firstname" id="firstname">
 			<label for="lastname">LastName:</label>
 			<input type="text" name="lastname" id="lastname">
 			<label for="age">Age:</label>
 			<input type="text" name="age" id="age">

          	<button>Submit</button>
 		</form>
 	</body>
</html>

JavaScript 代码:

var form = document.querySelector('form');
var data = new FormData(form);

document.addEventListener('submit', function(event) {
  event.preventDefault();
  let url = 'https://jsonplaceholder.typicode.com/posts';
  var xmlhr = new XMLHttpRequest();
  xmlhr.open('POST', url);
  xmlhr.send(data);

  xmlhr.onreadystatechange = function() {
    if (xmlhr.readyState === 4) {
      var response = JSON.parse(xmlhr.responseText);
      if (xmlhr.status === 201) {
        console.log('successful');
      } else {
        console.log('failed');
      }
    }
  }
});

输出:

successful

如果数据通过网络成功发送,上面的示例显示 successful;否则 failedevent.preventDefault() 阻止表单提交到服务器。

XMLHttpRequest() 用于与网络服务器交换数据。open() 方法指定请求,而 send()POST 请求发送到服务器。

onreadystatechange 用于定义 readyState(保持 XMLHttpRequest 状态)属性何时更改。

我们有 HTML 表单,并且希望在每次提交表单时获取值。在下面的示例中,我们使用 JSONPlaceholder API 的 fetch() 方法查看名为 FormData() 的本机方法。

HTML 代码:(对于下面给出的所有示例,此 HTML 代码保持不变)

<!DOCTYPE html>
<html>
 	<head>
 		<title>Serialize Form</title>
 	</head>
 	<body>
 		<form id="form">
 			<label for="firstname">FirstName:</label>
 			<input type="text" name="firstname" id="firstname">
 			<label for="lastname">LastName:</label>
 			<input type="text" name="lastname" id="lastname">
 			<label for="age">Age:</label>
 			<input type="text" name="age" id="age">

			<button>Submit</button>
 		</form>
 	</body>
</html>

JavaScript 代码:

var form = document.querySelector('form');
var formData = new FormData(form);

document.addEventListener('submit', function(event) {
  event.preventDefault();
  let url = 'https://jsonplaceholder.typicode.com/posts';

  fetch(url, {
    method: 'POST',
    body: new FormData(event.target),
  })
      .then(function(response) {
        if (response.ok) {
          return response.json();
        }
        return Promise.reject(response);
      })
      .then(function(formData) {
        console.log(formData);
      })
      .catch(function(error) {
        console.warn(error);
      });
});

输出:

//you get the following Output each time you submit the form
{
  id: 101
}

在上面的示例中,我们使用 fetch() 方法将数据发送到 JSONPlaceholder API。

为此,我们将 event.target(提交的表单)传递给 FormData() 构造函数并将其用作 body 属性。

fetch() 方法从网络中获取资源并返回一个 promise,一旦响应准备好/可用,该承诺就会得到满足。你可以在此处找到有关此方法的更多信息。

你可能已经在上面的输出中注意到,我们获取的不是实际数据而是数字。JSONPlaceholder 接受 JSON 对象,但不接受 FormData

我们需要使用 for 循环将其转换为对象。因此,新的 JavaScript 代码如下所示。

var form = document.querySelector('form');
var data = new FormData(form);

// convert FormData to Object
var serializeFormToObject = function(form) {
  var objForm = {};
  var formData = new FormData(form);
  for (var key of formData.keys()) {
    objForm[key] = formData.get(key);
  }
  return objForm;
};

document.addEventListener('submit', function(event) {
  event.preventDefault();
  let url = 'https://jsonplaceholder.typicode.com/posts';

  fetch(url, {
    method: 'POST',
    body: JSON.stringify(serializeFormToObject(event.target)),
    headers: {'Content-type': 'application/json; charset=UTF-8'}
  })
      .then(function(response) {
        if (response.ok) {
          return response.json();
        }
        return Promise.reject(response);
      })
      .then(function(data) {
        console.log(data);
      })
      .catch(function(error) {
        console.warn(error);
      });
});

输出:

{
  age: "30",
  firstname: "mehvish",
  id: 101,
  lastname: "ashiq"
}

我们还可以使用 formEntries()FormData 转换为 Object 而无需任何循环。

请参阅以下 JavaScript 代码块。

var form = document.querySelector('form');
var formData = new FormData(form);

document.addEventListener('submit', function(event) {
  event.preventDefault();
  let url = 'https://jsonplaceholder.typicode.com/posts';

  fetch(url, {
    method: 'POST',
    body: JSON.stringify(Object.fromEntries(new FormData(event.target))),
    headers: {'Content-type': 'application/json; charset=UTF-8'}
  })
      .then(function(response) {
        if (response.ok) {
          return response.json();
        }
        return Promise.reject(response);
      })
      .then(function(formData) {
        console.log(formData);
      })
      .catch(function(error) {
        console.warn(error);
      });
});

输出:

{
  age: "30",
  firstname: "mehvish",
  id: 101,
  lastname: "ashiq"
}

FormData 构造函数在所有现代浏览器中都能完美运行,包括 IE 10 或更高版本。但是,Object.formEntries() 在 IE 中不起作用。

现在让我们在下面给出的示例中使用 FormData() 练习 URLSearchParamsURLSearchParams 用于定义处理 URL 查询字符串的实用函数。

Array.from() 是用于从可迭代对象创建新实例的静态方法。

JavaScript 代码:

var form = document.querySelector('form');

document.addEventListener('submit', function(event) {
  event.preventDefault();
  let url = 'https://jsonplaceholder.typicode.com/posts';

  fetch(url, {
    method: 'POST',
    body: new URLSearchParams(Array.from(new FormData(form))),
  })
      .then(function(response) {
        if (response.ok) {
          return response.json();
        }
        return Promise.reject(response);
      })
      .then(function(formData) {
        console.log(formData);
      })
      .catch(function(error) {
        console.warn(error);
      });
});

输出:

{
  age: "30",
  firstname: "mehvish",
  id: 101,
  lastname: "ashiq"
}

在 JavaScript 中使用 XMLSerializer() 序列化表单

我们已经学习了如何使用对象序列化表单。但是,如果我们想将表单序列化为数据结构怎么办。

为此,我们可以使用 XMLSerializer()serializeToString() 方法。

JavaScript 代码:

var form = document.querySelector('form');
document.addEventListener('submit', function() {
  if (window.XMLSerializer) {
    var serializer = new XMLSerializer();
    var str = serializer.serializeToString(form);
    alert(str);
  } else {
    alert(document.body.outerHTML);
  }
});

输出:


在 JavaScript 中使用 jQuery 序列化表单

如果你对使用 jQuery 没问题,下面的代码很好。但是不要忘记在你的 <head> 标签中包含 jQuery。

JavaScript 代码:

var form = document.querySelector('form');

document.addEventListener('submit', function() {
  event.preventDefault();
  let url = 'https://jsonplaceholder.typicode.com/posts';

  fetch(url, {
    method: 'POST',
    body: $('form').text($('#form').serialize()),
  })
      .then(function(response) {
        if (response.ok) {
          return response.json();
        }
        return Promise.reject(response);
      })
      .then(function(formData) {
        console.log(formData);
      })
      .catch(function(error) {
        console.warn(error);
      });
});

输出:

firstname=mehvish&lastname=ashiq&age=30

上一篇:在 JavaScript 中 use strict

下一篇:没有了

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 JavaScript 中 use strict

发布时间:2024/03/20 浏览次数:56 分类:JavaScript

在本文中,学习 JavaScript 中的 use strict 特性。我们将通过不同的示例了解如何在 JavaScript 代码语句中创建和执行 use strict 关键字。

JavaScript 清除输入

发布时间:2024/03/20 浏览次数:125 分类:JavaScript

输入字段可以重置或与空值相关联。onfocus 属性可以触发一个函数,起到清除输入的作用。此外,使用 value 属性获取输入条目和清除输入的 reset 方法非常容易掌握。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便