我正在测试一个来自网络的应用程序,试图在jquery mobile中学习使用json数据。在原始应用程序中,json数据在javascript文件中明确列出。我提取了数据并将其保存在本地驱动器的目录中(与html文件和javascript文件相同的位置)。更改后,由于文件访问问题,页面停止工作。我搜索谷歌一整天,但没有找到解决方案。
HTML文件:
<!DOCTYPE html>
<html>
<head>
<meta name=viewport content="user-scalable=no,width=device-width" />
<title>Test data listview</title>
<link rel="stylesheet" href="../download18Dec13/jquery.mobile-1.3.2.min.css" />
<script src="../download18Dec13/jquery-1.9.1.min.js"></script>
<script src="../download18Dec13/jquery.mobile-1.3.2.min.js"></script>
<script src="test.js"></script>
<link rel="stylesheet" href="test.css"/>
</head>
<!--first page -->
<div data-role="page" id="info-page">
<div data-role="header" data-theme="b">
<h1> Information</h1>
</div>
<div data-role="content">
<ul data-role="listview" id="prof-list" data-divider-theme="a" data- inset="true">
<li data-role="list-divider" data-theme="b" role="heading">Names</li>
</ul>
</div>
</div>
<!--second page -->
<div data-role="page" id="details-page">
<div data-role="header" data-theme="b"><a href="#" data-rel="back" data- role="button">Go back</a>
<h1>Employee Details</h1>
</div>
<div data-role="content"></div>
</div>
</html>
Javascript文件:
//assuming this comes from an ajax call
//alert(window.location.href);
response.setHeader("Access-Control-Allow-Origin", "data.js");
var info=$.getJSON('data.js',function(data){
//alert( "JSON Data: " + data[ 3 ].name );
//var info=data;
});
//var info=data;
//.done(function() {
//alert( "second success" );
//})
//.fail(function() {
//alert( "error" );
//})
//.always(function() {
//alert( "complete" );
//});
//alert(info.always());
//alert($.document.url());
//pageinit event for first page
//triggers only once
//write all your on-load functions and event handlers pertaining to page1
//var info = new Spry.Data.JSONDataSet("data.js");
//alert(infor[3].name);
//alert("ffff");
$(document).on("pageinit", "#info-page", function () {
//set up string for adding <li/>
var li = "";
//container for $li to be added
$.each(info, function (i, name) {
//add the <li> to "li" variable
//note the use of += in the variable
//meaning I'm adding to the existing data. not replacing it.
//store index value in array as id of the <a> tag
li += '<li><a href="#" id="' + i + '" class="info-go">' + name.name + '</a> </li>';
});
//append list to ul
$("#prof-list").append(li).promise().done(function () {
//wait for append to finish - thats why you use a promise()
//done() will run after append is done
//add the click event for the redirection to happen to #details-page
$(this).on("click", ".info-go", function (e) {
e.preventDefault();
//store the information in the next page's data
$("#details-page").data("info", info[this.id]);
//change the page # to second page.
//Now the URL in the address bar will read index.html#details-page
//where #details-page is the "id" of the second page
//we're gonna redirect to that now using changePage() method
$.mobile.changePage("#details-page");
});
//refresh list to enhance its styling.
$(this).listview("refresh");
});
});
//use pagebeforeshow
//DONT USE PAGEINIT!
//the reason is you want this to happen every single time
//pageinit will happen only once
$(document).on("pagebeforeshow", "#details-page", function () {
//get from data - you put this here when the "a" wa clicked in the previous page
var info = $(this).data("info");
//string to put HTML in
var info_view = "";
//use for..in to iterate through object
for (var key in info) {
//Im using grid layout here.
//use any kind of layout you want.
//key is the key of the property in the object
//if obj = {name: 'k'}
//key = name, value = k
info_view += '<div class="ui-grid-a"><div class="ui-block-a"><div class="ui-bar field" style="font-weight : bold; text-align: left;">' + key + '</div></div><div class="ui- block-b">
<div class="ui-bar value" style="width : 75%">' + info[key] + '</div></div></div>';
}
//add this to html
$(this).find("[data-role=content]").html(info_view);
});
Json data (To save space, only three items listed):
{
{
"id": 0,
"age": 31,
"name": "Avis Greene",
"gender": "female",
"company": "Handshake",
"email": "avisgreene@handshake.com",
"phone": "+1 (845) 575-2978",
"address": "518 Forrest Street, Washington, New York, 3579"
}, {
"id": 1,
"age": 31,
"name": "Dunn Haynes",
"gender": "male",
"company": "Signity",
"email": "dunnhaynes@signity.com",
"phone": "+1 (829) 454-3806",
"address": "293 Dean Street, Dante, Oregon, 5864"
}, {
"id": 2,
"age": 20,
"name": "Contreras Keith",
"gender": "male",
"company": "Overfork",
"email": "contreraskeith@overfork.com",
"phone": "+1 (941) 412-2874",
"address": "166 Broome Street, Norris, Kentucky, 2163"
}, {
"id": 3,
"age": 27,
"name": "Hays Schneider",
"gender": "male",
"company": "Orbean",
"email": "haysschneider@orbean.com",
"phone": "+1 (896) 599-2026",
"address": "889 Engert Avenue, Staples, Illinois, 9927"
}
}
答案 0 :(得分:0)
这不是JavaScript问题,也不是您遇到的JSON问题 这是一个浏览器安全问题。
长话短说,你想在你的计算机/设备上运行网页(即:直接从你的驱动器到你的浏览器),然后从该文件到你的硬盘驱动器进行AJAX调用以获得JSON。 / p>
浏览器制造商认为这是一个非常糟糕的主意,让你继续这样做 推理非常简单......如果有人可以在你的系统上运行.html文件,那么它要求的任何JS都可以访问你计算机上的任何文件并将数据发送到任何其他计算机......那就是好的。
无论如何,这个特殊故事的寓意是你需要一台服务器 您可以在本地计算机上运行服务器,从浏览器连接到该服务器,然后服务器可以加载页面/ JSON并将其发送回浏览器,每个人都很高兴。然后是服务器的工作,以确保它不会放弃一切。
如果您使用的是PC,那么现在可以非常轻松地启动并运行PHP服务器 Python也有一个简单的服务器。
答案 1 :(得分:0)
你的json格式不合理。现在它很好了。
dada.json文件
{
"data":[{
"id": 0,
"age": 31,
"name": "Avis Greene",
"gender": "female",
"company": "Handshake",
"email": "avisgreene@handshake.com",
"phone": "+1 (845) 575-2978",
"address": "518 Forrest Street, Washington, New York, 3579"
}, {
"id": 1,
"age": 31,
"name": "Dunn Haynes",
"gender": "male",
"company": "Signity",
"email": "dunnhaynes@signity.com",
"phone": "+1 (829) 454-3806",
"address": "293 Dean Street, Dante, Oregon, 5864"
}, {
"id": 2,
"age": 20,
"name": "Contreras Keith",
"gender": "male",
"company": "Overfork",
"email": "contreraskeith@overfork.com",
"phone": "+1 (941) 412-2874",
"address": "166 Broome Street, Norris, Kentucky, 2163"
}, {
"id": 3,
"age": 27,
"name": "Hays Schneider",
"gender": "male",
"company": "Orbean",
"email": "haysschneider@orbean.com",
"phone": "+1 (896) 599-2026",
"address": "889 Engert Avenue, Staples, Illinois, 9927"
}]
}
<script>
$(document).on("pageinit", "#info-page", function () {
var li = '<li data-role="list-divider" data-theme="b" role="heading">Names</li>';
$.getJSON("data.json", function (json, status){
var data = json.data;
$.each(data, function(key, value){
$.each(value, function(key, value){
if(key == 'name'){
li += '<li><a href="#" id="' + key + '" class="info-go">' + value + '</a> </li>';
}
})
})
$("#prof-list").append(li).trigger('create');
$("#prof-list").listview('refresh');
})
.success(function(result) {})
.fail(function(jqXHR, textStatus, errorThrown) {})
.complete(function() {});
})
</script>