javascript - JavaScript设置元素属性数据返回json数据为空
问题描述
我是一个新手 JQuery/JavaScript 用户,遇到问题并且无法理解为什么我的 div 数据属性在保存/检索 DOM 数据后为空。如果可能的话,我需要一些帮助来解释我做错了什么。我花了几个小时在这上面看不到光。
// HTML
<div id="outer">
<div id="mydiv" data-myval=""></div>
</div>
// JS file body
function getSomeData(){
var url = "http://ip-api.com/json";
$.ajax({
url: url,
dataType: "json",
cache: false,
}).done(function(data) {
//var myjson = data;
var myjson = JSON.stringify(data);
$("#mydiv").attr("myval", data); // setter
}, "json");
}
$(document).ready(function()
{
getSomeData();
// get json data from attr data-myval
//var object = JSON.parse(myjson);
var myjson = $("#mydiv").data(); //getter
alert(myjson);
if(typeof object === 'undefined')
{
alert('No data found!');
}
else
{
// do something
var lat = object.lat;
var lng = object.lon;
// more codes
}
}
解决方案
首先,了解 AJAX 请求异步运行很重要。这意味着当您的浏览器等待响应时,JavaScript 将继续执行您的代码。可视化:
JS execution
|
| getSomeData() runs, sends AJAX request to -------> server
| | |
| V |
| var myjson = $("#mydiv").data(); //not yet set |
| |
| |
| |
| |
| V
| .done(function(data) {}); //executes upon response <--response
V
因此,如果您想检索 .js 中的数据data-myval
,则只能在 AJAX 调用完成后进行。调用后立即获取这些数据是没有意义的getSomeData()
。例如,您可以在用户单击某些内容后获取数据。
其次,您必须使用.data()
函数设置数据属性,而不是.attr()
函数。
示例解决方案:
// HTML
<div id="outer">
<div id="mydiv" data-myval=""></div>
</div>
<button id="clicker">Click me!</button>
// JS file body
function getSomeData(){
var url = "http://ip-api.com/json";
$.ajax({
url: url,
dataType: "json",
cache: false,
}).done(function(data) {
$("#mydiv").data("myval", data); // setter
}, "json");
}
$(document).ready(function()
{
getSomeData();
$("#clicker").click(function(e) {
var data = $("#mydiv").data("myval"); //getter
alert(data.exampleItem);
});
推荐阅读
- vba - Visual Basic - 使用名称中的变量引用组合框
- r - 3D plot tick labels do not match with axis values (R lattice)
- javascript - 检测消息是否为回复
- django - 在 django 项目中,我应该在 .gitignore 中添加哪些文件?
- swift - 为什么 indexingIterator.next() 使用动态调度?
- macos - 如何使用 VSCode 和 CodeLLDB 调试 Rust 和 WebAssembly 程序?
- python - 使用 sklearn 计算 LedoitWolf 收缩协方差矩阵
- tensorflow - tf.layers.conv2d 的掩码操作
- python - 训练中的 TensorFlow 错误:tensorflow.python.framework.errors_impl.InvalidArgumentError
- python - 通过 crontab 运行 python 脚本不接受包含 % 的参数