从外部 URL 获取 JSON 数据并将其显示在 div 中作为纯文本

IT技术 javascript html json
2021-01-21 01:35:05

我有一个类似于https://www.googleapis.com/freebase/v1/text/en/bob_dylan的外部资源,它返回一个 JSON。我想在 html 的 div 中显示结果键的值(假设 div 的名称是“摘要”)。此外,结果键的值应以纯文本形式显示。
URL 返回 json:

{ "result": "鲍勃·迪伦 (Bob Dylan),本名罗伯特·艾伦·齐默尔曼 (Robert Allen Zimmerman),是美国创作歌手、作家、诗人和画家,五十年来一直是流行音乐界的重要人物。迪伦最著名的大部分作品都可以追溯到1960 年代,当他成为......”}

JSON 只有结果键,没有其他键
基本上我不想使用纯 HTML 和 JavaScript 以外的任何东西。我是 JavaScript 的相对初学者,因此我要求注释代码。

6个回答

这是一个不使用纯 JavaScript 的 JQuery。我使用了 javascript promises 和 XMLHttpRequest 你可以在这个fiddle上试试

HTML

<div id="result" style="color:red"></div>

JavaScript

var getJSON = function(url) {
  return new Promise(function(resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open('get', url, true);
    xhr.responseType = 'json';
    xhr.onload = function() {
      var status = xhr.status;
      if (status == 200) {
        resolve(xhr.response);
      } else {
        reject(status);
      }
    };
    xhr.send();
  });
};

getJSON('https://www.googleapis.com/freebase/v1/text/en/bob_dylan').then(function(data) {
    alert('Your Json result is:  ' + data.result); //you can comment this, i used it to debug

    result.innerText = data.result; //display the result in an HTML element
}, function(status) { //error detection....
  alert('Something went wrong.');
});
是的,但现在 Edge 是支持 Promises 的新浏览器。你可能不需要 Promises 但它是执行异步 JS 的新标准方式,那么为什么不编写简洁的脚本呢?
2021-03-15 01:35:05
在最新版本的 Chrome 中,“then”函数的第一部分起作用,如果 url 正确,我会得到结果。但是,如果 url 不正确,我永远不会收到“出现问题”警报。也许它与 Fiddler 的工作方式有关?
2021-03-31 01:35:05
任何版本的 Internet Explorer caniuse.com/#feat=promises都不支持Promise,并且您不需要Promise来进行简单的 HTTP 请求......
2021-04-01 01:35:05
旧浏览器不支持 Promise。
2021-04-05 01:35:05
@Abderrahim 抱歉找不到页面。你删除了问题吗?
2021-04-12 01:35:05

你可以像这样用 JSONP 做到这一点:

function insertReply(content) {
    document.getElementById('output').innerHTML = content;
}

// create script element
var script = document.createElement('script');
// assing src with callback name
script.src = 'http://url.to.json?callback=insertReply';
// insert script to document and load content
document.body.appendChild(script);

但是源必须知道您希望它调用作为回调参数传递给它的函数。

使用 google API,它看起来像这样:

function insertReply(content) {
    document.getElementById('output').innerHTML = content;
}

// create script element
var script = document.createElement('script');
// assing src with callback name
script.src = 'https://www.googleapis.com/freebase/v1/text/en/bob_dylan?callback=insertReply';
// insert script to document and load content
document.body.appendChild(script);

检查将回调传递给 google api 时数据的样子:https : //www.googleapis.com/freebase/v1/text/en/bob_dylan? callback =insertReply

这是对 JSONP 的很好的解释:http : //en.wikipedia.org/wiki/JSONP

由于它是外部资源,因此您需要使用 JSONP,因为Same origin policy
为此,您需要添加查询字符串参数callback

$.getJSON("http://myjsonsource?callback=?", function(data) {
    // Get the element with id summary and set the inner text to the result.
    $('#summary').text(data.result);
});
OP 要求“纯 HTML 和 JavaScript”
2021-03-17 01:35:05
先决条件是资源必须知道回调并调用它
2021-04-01 01:35:05

如果你想使用普通的 javascript,但避免Promise,你可以使用 Rami Sarieddine 的解决方案,但用这样的回调函数代替Promise:

var getJSON = function(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('get', url, true);
    xhr.responseType = 'json';
    xhr.onload = function() {
      var status = xhr.status;
      if (status == 200) {
        callback(null, xhr.response);
      } else {
        callback(status);
      }
    };
    xhr.send();
};

你会这样称呼它:

getJSON('https://www.googleapis.com/freebase/v1/text/en/bob_dylan', function(err, data) {
  if (err != null) {
    alert('Something went wrong: ' + err);
  } else {
    alert('Your Json result is:  ' + data.result);
    result.innerText = data.result;
  }
});
使用此解决方案,我在 Chrome 中收到“No 'Access-Control-Allow-Origin' header”错误。没有为我工作。
2021-04-01 01:35:05
你说得对。这仅在服务器声明“Access-Control-Allow-Origin”标头并允许其他人访问其资源时才有效。否则,您将不得不使用 JSONP(如果服务器支持它)或 CORS 代理服务器,它会下载数据并为您设置标头。
2021-04-05 01:35:05

您可以使用 $.ajax 调用来获取该值,然后将其放入您想要的 div 中。您必须知道的一件事是您无法接收 JSON 数据。你必须使用 JSONP。

代码将是这样的:

function CallURL()  {
    $.ajax({
        url: 'https://www.googleapis.com/freebase/v1/text/en/bob_dylan',
        type: "GET",
        dataType: "jsonp",
        async: false,
        success: function(msg)  {
            JsonpCallback(msg);
        },
        error: function()  {
            ErrorFunction();
        }
    });
}

function JsonpCallback(json)  {
    document.getElementById('summary').innerHTML = json.result;
}
它要显示在 div 中,但是要创建 json 对象
2021-03-17 01:35:05