javascript - 如何使用 Handlebars 让 HTML 使用 JSON 文件中的内容填充自身?

标签 javascript html json http handlebars.js

我需要使用 Mustache 或 Handlebars 让 HTML 用 JSON 文件中的内容填充自身。

我创建了两个简单的 HTML 模板用于测试(使用 Handlebars),并用外部 JavaScript 文件中的内容填充它们。 http://codepen.io/MaxVelichkin/pen/qNgxpB

现在我需要将内容最初放置在 JSON 文件中。

我遇到了两个问题,但它们都是同一主要问题解决方案的核心 - 在 JSON 文件和 HTML 中的内容之间创建链接,所以我决定询问他们在同一个问题中。

  1. 如何连接 JSONHTML?据我所知,有一种方法是使用AJAX,还有一种方法是使用服务器AJAX 对我来说是一门新语言,因此我将不胜感激地解释如何使用我使用 Node 创建的本地 HTTP 服务器来做到这一点.JS.

  2. JSON 文件中的语法应该是什么? JSON 文件 中的脚本必须与 JavaScript 文件中的脚本相同,但是应该借助 JSON.parse 函数对其进行处理,是否正确?或者 JSON 文件 中的语法应该不同?

    例如,如果我们考虑我的示例(上面的链接),JSON 文件中第一个模板的代码必须与 JavaScript 文件中的相同,但在最后一行 document.getElementById('quoteData').innerHTML += quoteData;,我必须编写以下行var contentJS = JSON.parse(quoteData);,然后更改名称最后一行中的变量,因此它将是: document.getElementById('quoteData').innerHTML += contentJS;,是吗?

最佳答案

试试这个:

HTML:

<!-- template-1 -->
<div id="testData"></div>
<script id="date-template" type="text/x-handlebars-template">
  Date:<span> <b>{{date}}</b> </span> <br/> Time: <span><b>{{time}}</b></span>
</script>

JS:

function sendGet(callback) {
    /* create an AJAX request using XMLHttpRequest*/
    var xhr = new XMLHttpRequest();
    /*reference json url taken from: http://www.jsontest.com/*/

    /* Specify the type of request by using XMLHttpRequest "open", 
       here 'GET'(argument one) refers to request type
       "http://date.jsontest.com/" (argument two) refers to JSON file location*/
    xhr.open('GET', "http://date.jsontest.com/");

    /*Using onload event handler you can check status of your request*/
    xhr.onload = function () {
        if (xhr.status === 200) {
            callback(JSON.parse(xhr.responseText));
        } else {
            alert(xhr.statusText);
        }
    };

    /*Using onerror event handler you can check error state, if your request failed to get the data*/
    xhr.onerror = function () {
        alert("Network Error");
    };

    /*send the request to server*/
    xhr.send();
}

//For template-1
var dateTemplate = document.getElementById("date-template").innerHTML;
var template = Handlebars.compile(dateTemplate);

sendGet(function (response) {
    document.getElementById('testData').innerHTML += template(response);
})

JSON:

JSON 数据格式源自 JavaScript,因此它更像 JavaScript 对象,Douglas Crockford 最初指定了 JSON 格式,请查看 here

JavaScript 对象表示法有一套规则。

  1. 以左大括号 ( { ) 开头,以右大括号 ( } ) 结束 例如:{}

  2. 在 baces 中,您可以添加“键”及其“值”,例如 { "title": "hello json"} 这里“title”是键,“hello json”是该键的值。

  3. “key”应该是字符串

  4. “值”可以是:
    number
    string
    Boolean
    array
    object

  5. 无法在 JSON 中添加 JavaScript 注释(例如//或/**/)

有很多在线 JSON 验证器,你可以检查你的 JSON 是否有效,检查 here

<小时/>

当谈到将 JSON 链接到 js 文件时,它更像是提供一个接口(interface)来获取 JSON 数据并在 JavaScript 中使用它。

这里是我们的XMLHttpRequest接口(interface)。我们通常调用XMLHttpRequest API。

在给定的 js 代码中,使用 REST API ( http://date.jsontest.com/ ) 从服务器获取 JSON

有关 REST API 的更多信息,您可以查看 here

从 url: http://date.jsontest.com/ 你可以得到像下面这样的 JSON 对象。

{
   "time": "03:47:36 PM",
   "milliseconds_since_epoch": 1471794456318,
   "date": "08-21-2016"
}
Note: data is dynamic; values change on each request.

因此,通过使用外部 API,您可以获得 JSON,要在 JavaScript 文件/代码库中使用它,您需要将 JSON 转换为 JavaScript 对象,
JSON.parse(/* 您的 JSON 对象在这里*/) 将 JSON 转换为 js 对象

`var responseObject = JSON.parse(xhr.responseText)`

通过使用点(.) 或方括号([]) 表示法,您可以访问JavaScript 对象属性或键;像下面这样。

console.log(responseObject.time) //"03:47:36 PM"
console.log(responseObject["time"]) //"03:47:36 PM"

console.log(responseObject.milliseconds_since_epoch) //1471794456318
console.log(responseObject["milliseconds_since_epoch"])//1471794456318

console.log(responseObject.date) //"08-21-2016"
console.log(responseObject["date"]) //"08-21-2016"

因此,要链接本地 JSON 文件(来自本地目录)或 JavaScript 文件中的外部 API,您可以使用“XMLHttpRequest”。

上面的 js block 中更新了“sendGet”函数,并附有注释,请检查。

简单来说:

  1. 创建 XMLHttpRequest 实例
    例如:var xhr = new XMLHttpRequest();
  2. 开放请求类型
    例如:xhr.open('GET', "http://date.jsontest.com/");
  3. 向服务器发送“GET”请求
    例如:xhr.send();
  4. 如果响应的状态代码为 200,则注册加载事件处理程序以保存 JSON 对象。 例如:xhr.onload = function () {

有关更多信息,请检查 here

<小时/>

了解这些:

  • 对象字面量表示法
  • 原始数据类型和非原始数据类型之间的差异

现有参​​考文献:

关于javascript - 如何使用 Handlebars 让 HTML 使用 JSON 文件中的内容填充自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38947646/

相关文章:

javascript - 为商业版的谷歌自定义搜索框提供占位符或值?

javascript - 将一个 div 在另一个具有绝对位置状态的 div 内水平居中

ios - 尝试解析 json 时出现错误 : use of undeclared type 'Foundation'

javascript - 如何使用 `Backbone.View.events`定义监听自定义 subview 事件?

javascript - 防止二级容器中的自动模态

javascript - 用 json 对象替换动态字符串模板变量

php - 在 PHP 中运行 C++ 脚本

php - 从表中提取随机数据然后显示它

html - 跨浏览器 margin

javascript - 创建 JSON 对象的层次结构数组