-2
Моя цель - создать страницу, которая будет либо принимать встроенные json-данные на самой странице html; или предоставить кнопку загрузки, чтобы пользователь мог выбрать файл json по своему выбору. Я перешел из YUI3 в JQuery, и для меня это немного сложно. Я попытался, но это не освежает, когда я загружаю файл «details.txt».Невозможно проанализировать загрузку вручную Json-файла
"Обновленные Комментарии:"
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<script type='text/javascript' src='https://code.jquery.com/jquery-1.9.1.js' dataTables></script>
<link rel="stylesheet" type="text/css" href="https://fiddle.jshell.net/css/normalize.css">
<script type="text/javascript" src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css">
<link rel="stylesheet" type="text/css" href="https://fiddle.jshell.net/css/result-light.css">
<link rel="stylesheet" type="text/css" href="https://cdn.dataTables.net/1.10.0/css/jquery.dataTables.css">
<script type='text/javascript' src="https://cdn.dataTables.net/1.10.9/js/jquery.dataTables.js"></script>
\t
</head>
<body>
<script id="data" type="application/json">
{
"sEcho": 1,
\t "iTotalRecords": "11",
\t "iTotalDisplayRecords": "11",
\t "aaData": [
{
"0": "<img src='details_open.png'>",
"1": "Other browsers",
"2": "All others",
"3": "-",
"4": "-",
"5": "U",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Trident",
"2": "AOL browser (AOL desktop)",
"3": "Win XP",
"4": "6",
"5": "A",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Gecko",
"2": "Camino 1.0",
"3": "OSX.2+",
"4": "1.8",
"5": "A",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Gecko",
"2": "Camino 1.5",
"3": "OSX.3+",
"4": "1.8",
"5": "A",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Misc",
"2": "Dillo 0.8",
"3": "Embedded devices",
"4": "-",
"5": "X",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Gecko",
"2": "Epiphany 2.20",
"3": "Gnome",
"4": "1.8",
"5": "A",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Gecko",
"2": "Firefox 1.0",
"3": "Win 98+/OSX.2+",
"4": "1.7",
"5": "A",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Gecko",
"2": "Firefox 1.5",
"3": "Win 98+/OSX.2+",
"4": "1.8",
"5": "A",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Gecko",
"2": "Firefox 2.0",
"3": "Win 98+/OSX.2+",
"4": "1.8",
"5": "A",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Gecko",
"2": "Firefox 3.0",
"3": "Win 2k+/OSX.3+",
"4": "1.9",
"5": "A",
"extra": "hrmll"
},
{
"0": "<img src='details_open.png'>",
"1": "Misc",
"2": "IE Mobile",
"3": "Windows Mobile 6",
"4": "-",
"5": "C",
"extra": "hrmll"
}
]
}
</script>
<script id="output" type="application/json"></script>
<div class="custom-file">
<span class="button">Choose a file</span>
<input type="file" id="file" />
</div>
<table cellpadding="0" cellspacing="0" border="0" class="display" id="example">
\t <thead>
\t \t <tr>
\t \t \t <th width="4%"></th>
\t \t \t <th width="25%">Rendering engine</th>
\t \t \t <th width="20%">Browser</th>
\t \t \t <th width="25%">Platform(s)</th>
\t \t \t <th width="16%">Engine version</th>
\t \t \t <th width="10%">CSS grade</th>
\t \t </tr>
\t </thead>
\t <tbody>
\t \t <tr>
\t \t \t <td colspan="5" class="dataTables_empty">Loading data from server</td>
\t \t </tr>
\t </tbody>
\t <tfoot>
\t \t <tr>
\t \t \t <th></th>
\t \t \t <th>Rendering engine</th>
\t \t \t <th>Browser</th>
\t \t \t <th>Platform(s)</th>
\t \t \t <th>Engine version</th>
\t \t \t <th>CSS grade</th>
\t \t </tr>
\t </tfoot>
</table>
<div id="meta"></div><br>
<input id="file-select" type="file" name="files[]" />
<hr>
<button id="read">Read</button>
<hr>
<!--button id="search-beginning">Find first</button>
<input type="text" id="find-first-pattern" placeholder="Regexp pattern" />
<button id="search-next">Find next</button>
-->
<hr>
<button id="searchAll">Find all</button>
<input type="text" id="find-all-pattern" placeholder="Regexp pattern" />
<hr>
<script type='text/javascript'>//<![CDATA[
var ajax="";
var fileselected="";
var olderfile="";
var data="";
var oTable="";
var firstDivContent="";
var secondDivContent="" ;
\t
\t
\t
$(document).ready(function() {
alert("ready");
data=JSON.parse($("#data").text());
oTable = $('#example').dataTable({
destroy: true,
data : data.aaData
});
function fnFormatDetails (nTr) {
var aData = oTable.fnGetData(nTr);
var sOut = '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">';
sOut += '<tr><td>Rendering engine:</td><td>'+aData[2]+' '+aData[5]+'</td></tr>';
sOut += '<tr><td>Link to source:</td><td>Could provide a link here</td></tr>';
sOut += '<tr><td>Extra info:</td><td>And any further details here (images etc)</td></tr>';
sOut += '</table>';
return sOut;
}
//live is deprcated
$('#example tbody td img').on('click', function() {
var nTr = $(this).parents('tr')[0];
if (oTable.fnIsOpen(nTr))
{
/* This row is already open - close it */
this.src = "../examples_support/details_open.png";
//this.src = "http://l.yimg.com/rz/d/yahoo_news_en-US_s_f_p_168x21_news.png";
oTable.fnClose(nTr);
}
else
{
/* Open this row */
this.src = "../examples_support/details_close.png";
oTable.fnOpen(nTr, fnFormatDetails(nTr), 'details');
}
});
$('#file').change(function(){
\t \t //data=JSON.parse($("#output").html()) ;
\t \t olderfile=fileselected;
\t \t alert("We: "+olderfile);
\t \t fileselected =$(this).siblings('.text').text(this.value);
$(this).siblings('.text').text(this.value || 'Nothing selected');
\t \t fileselected = $('input[type=file]').val().replace(/.*(\/|\\)/, '');
\t \t if (olderfile!=fileselected && fileselected!="") {
\t \t \t alert("We: "+fileselected);
\t \t \t } else {
\t \t \t alert("No Changes Made ");
\t \t \t }
}); \t \t
\t \t
oTable.fnDraw(); \t \t
}); \t
\t
$("#searchAll").click(function() {
//Destroy the added Data
oTable.dataTable().fnClearTable();
oTable.dataTable().fnDestroy();
alert("Destroyed");
data=JSON.parse(JSON.stringify($("#output").text()));
\t \t oTable = $('#example').dataTable({
\t destroy: false, \t
\t data : data.aaData
\t \t });
alert("Reinitialize Data");
oTable.fnDraw();
alert("Draw Data.aadata"); \t \t
//oTable.api().ajax.reload(); \t \t \t
//alert("Reload Data"); \t \t
}); \t
\t
$(function() {
function LineNavigator(readChunk, decode, options) {
var self = this;
// verification
if (typeof (readChunk) != 'function') throw 'readChunk argument must be function(offset, length, callback)'
if (typeof (decode) != 'function') throw 'decode argument must be function(buffer, callback)'
// private
options = options ? options : {};
var milestones = options.milestones ? options.milestones : []; // { firstLine, lastLine, offset, length }
var chunkSize = options.chunkSize ? options.chunkSize : 1024 * 4;
var newLineCode = '\n'.charCodeAt(0);
var splitPattern = /\r?\n/;
// Searches for milestone
var getPlaceToStart = function (index) {
for (var i = milestones.length - 1; i >= 0; i--) {
if (milestones[i].lastLine < index)
return { firstLine: milestones[i].lastLine + 1, offset: milestones[i].offset + milestones[i].length };
}
return { firstLine: 0, offset: 0 };
}
// Count lines in chunk and offset of last line, saves milestones
var examineChunk = function(buffer, offset, bytesRead, firstLine) {
var saveMilestone = milestones.length == 0 || milestones[milestones.length - 1].offset < offset;
var lastLine = firstLine - 1;
var length = 0;
// Search for delimiters
for (var i = 0; i < bytesRead; i++) {
if (buffer[i] == newLineCode) {
lastLine++;
length = i + 1;
}
}
// Describe milestone
var milestone = {
firstLine: firstLine,
lastLine: lastLine,
offset: offset,
length: length
};
if (saveMilestone)
milestones.push(milestone);
// Describe beginning of next milestone
var milestoneClone = Object.create(milestone);
milestoneClone.place = { firstLine: lastLine + 1, offset: offset + length };
return milestoneClone;
};
// Get lines
var getLines = function(buffer, length, callback) {
decode(buffer.slice(0, length), function(text) {
var lines = text.split(splitPattern);
if (lines.length > 0 && lines[lines.length - 1] == "")
lines = lines.slice(0, lines.length - 1);
callback(lines);
});
};
// Search occurrences in line
function searchInLine(regex, line) {
var match = regex.exec(line);
return !match
? null
: {
offset: line.indexOf(match[0]),
length: match[0].length,
line: line
};
}
// Returns current milestones, to speed up file random reading in future
self.getMilestones = function() {
return milestones;
}
// Reads optimal number of lines
// callback: function(err, index, lines, eof)
self.readSomeLines = function(index, callback) {
var place = getPlaceToStart(index);
//offset, length, buffer, callback
readChunk(place.offset, chunkSize, function readChunkCallback(err, buffer, bytesRead) {
if (err) return callback(err, index);
var eof = bytesRead < chunkSize;
var inChunk = examineChunk(buffer, place.offset, bytesRead, place.firstLine);
// Wanted line in chunk
if (inChunk.firstLine <= index && index <= inChunk.lastLine) {
getLines(buffer, inChunk.length, function(lines) {
if (index != inChunk.firstLine)
lines = lines.splice(index - inChunk.firstLine);
callback(undefined, index, lines, eof);
})
// Wanted line not in this chunk
} else {
if (eof) return callback('Line ' + index + ' is out of index, last available: ' + inChunk.lastLine, index);
place = inChunk.place;
readChunk(place.offset, chunkSize, readChunkCallback);
}
})
};
// Reads exact amount of lines
// callback: function(err, index, lines, eof)
self.readLines = function(index, count, callback) {
var result = [];
self.readSomeLines(index, function readLinesCallback(err, partIndex, lines, eof) {
if (err) return callback(err, index);
result = result.concat(lines);
if (result.length >= count || eof)
return callback(undefined, index, result.splice(0, count), eof);
self.readSomeLines(partIndex + lines.length, readLinesCallback);
});
};
self.find = function(regex, index, callback) {
self.readSomeLines(index, function readSomeLinesHandler(err, firstLine, lines, eof) {
if (err) return callback(err);
for (var i = 0; i < lines.length; i++) {
var match = searchInLine(regex, lines[i]);
if (match) return callback(undefined, firstLine + i, match);
}
if (eof) return callback(undefined);
self.readSomeLines(firstLine + lines.length + 1, readSomeLinesHandler);
});
};
self.findAll = function(regex, index, limit, callback) {
var results = [];
self.readSomeLines(index, function readSomeLinesHandler(err, firstLine, lines, eof) {
if (err) return callback(err, index);
for (var i = 0; i < lines.length; i++) {
var match = searchInLine(regex, lines[i]);
if (match) {
match.index = firstLine + i;
results.push(match);
if (results.length >= limit)
return callback(undefined, index, true, results);
}
}
if (eof)
return callback(undefined, index, false, results);
self.readSomeLines(firstLine + lines.length + 1, readSomeLinesHandler);
});
};
}
// LineNavigator wrapper to work specifically with HTML5 File object
function FileNavigator (file) {
var self = this;
var size = file.size;
file.navigator = this; // reuse milestones later
var lastPosition = 0;
var getProgress = function() {
if (!size || size == 0) return 0;
var progress = parseInt(999 * (lastPosition/size));
return progress > 999 ? 999 : progress;
};
// callback(err, buffer, bytesRead)
var readChunk = function (offset, length, callback) {
lastPosition = offset + length;
var reader = new FileReader();
reader.onloadend = function(progress) {
var buffer;
if (reader.result) {
buffer = new Int8Array(reader.result, 0);
buffer.slice = buffer.subarray;
}
callback(progress.err, buffer, progress.loaded);
};
reader.readAsArrayBuffer(file.slice(offset, offset + length));
};
// callback(str);
var decode = function(buffer, callback) {
var reader = new FileReader();
reader.onloadend = function(progress) {
callback(progress.currentTarget.result);
};
reader.readAsText(new Blob([buffer]));
};
var navigator = new LineNavigator(readChunk, decode, { chunkSize: 1024 * 1024 * 4 });
// Returns current milestones, to speed up file random reading in future
self.getMilestones = navigator.getMilestones;
// Reads optimal number of lines
// callback: function(err, index, lines, eof, progress)
// where progress is 0-100 % of file
self.readSomeLines = function (index, callback) {
navigator.readSomeLines(index, function (err, index, lines, eof) {
callback(err, index, lines, eof, getProgress());
});
};
self.readLines = function (index, count, callback) {
navigator.readLines(index, count, function (err, index, lines, eof) {
callback(err, index, lines, eof, getProgress());
});
};
self.find = navigator.find;
self.findAll = navigator.findAll;
self.getSize = function(callback) {
return callback(file ? file.size : 0);
};
}
var started, finished;
function InitDemo(title) {
$('#meta').html('');
$('#output').html('');
if ($('#file-select')[0].files.length == 0 || $('#file-select')[0].files[0] == null) {
$('#meta').html('Please, choose file!');
return null;
}
var file = $('#file-select')[0].files[0];
$('#meta').append(title + '<br>');
$('#meta').append('');
started = new Date();
finished = null;
return file;
}
function DemoFinished(metaInfo, results) {
$('#meta').append('' + (metaInfo ? '<br>' + metaInfo : ''));
$('#output').html(results ? results : ''); \t
}
function Read() {
var file = InitDemo('');
if (!file) return;
var navigator = new FileNavigator(file);
var indexToStartWith = 0;
var countLines = 0;
navigator.readSomeLines(indexToStartWith, function linesReadHandler(err, index, lines, eof, progress) {
if (err) {
finished = new Date();
DemoFinished('Error: ' + err);
return;
}
countLines += lines.length;
if (eof) {
finished = new Date();
DemoFinished('');
return;
}
navigator.readSomeLines(index + lines.length, linesReadHandler);
});
\t
};
$('#read').click(Read);
var nextIndex = 0;
function FindNext() {
var pattern = $('#find-first-pattern').val();
var file = InitDemo('Find of "' + pattern + '" pattern starting from ' + nextIndex);
if (!file) return;
var navigator = new FileNavigator(file);
navigator.find(new RegExp(pattern), nextIndex, function (err, index, match) {
finished = new Date();
nextIndex = index + 1; // search next after this one
if (err) {
DemoFinished('Error: ' + err);
return;
}
if (!match) {
DemoFinished('No matching lines found');
return;
}
var token = match.line.substr(match.offset, match.length);
DemoFinished('Found matching token on ' + index + ' line', index + ': ' + match.line.replace(token, '<mark>' + token + '</mark>'));
});
}
$('#search-beginning').click(function() {
nextIndex = 0;
FindNext();
});
$('#search-next').click(function() {
FindNext();
});
function FindAll() {
var pattern = $('#find-all-pattern').val();
var file = InitDemo('');
if (!file) return;
var navigator = new FileNavigator(file);
var indexToStartWith = 0;
var limitOfMatches = 999;
navigator.findAll(new RegExp(pattern), indexToStartWith, limitOfMatches, function (err, index, limitHit, results) {
finished = new Date();
if (err) {
DemoFinished('Error: ' + err);
return;
}
if (results.length == 0) {
DemoFinished('No matching lines found');
return;
}
var resultsAsLine = '';
for (var i = 0; i < results.length; i++) {
var token = results[i].line.substr(results[i].offset, results[i].length);
resultsAsLine += results[i].line.replace(token, '' + token + '') + '';
}
DemoFinished((limitHit ? ' Limit of ' + limitOfMatches + ' is hit, so there can be more lines.' : ''), resultsAsLine);
\t \t alert("Find All [Step 3] Called "); \t \t
\t \t
});
data=JSON.parse(JSON.stringify($("#output").text()));
\t
\t \t oTable = $('#example').dataTable({
\t \t destroy: true,
\t \t ajax: "data.json",
\t \t data : data.aaData
\t \t });
alert("Alert 4"); \t \t \t \t \t \t
oTable.dataTable().fnClearTable();
alert("Alert 4 ClearTable"); \t
oTable.dataTable().fnDestroy();
alert("Alert 4 DestroyTable"); \t
//oTable.fnAddData(data);
oTable.fnDraw(); \t
alert("Alert 5");
function fnFormatDetails (nTr) {
var aData = oTable.fnGetData(nTr);
var sOut = '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">';
sOut += '<tr><td>Rendering engine:</td><td>'+aData[2]+' '+aData[5]+'</td></tr>';
sOut += '<tr><td>Link to source:</td><td>Could provide a link here</td></tr>';
sOut += '<tr><td>Extra info:</td><td>And any further details here (images etc)</td></tr>';
sOut += '</table>';
return sOut;
}
alert("Alert 5.1");
setInterval(function() {
oTable.api().ajax.reload();
}, 30000);
$('#example tbody td img').on('change', function() {
var nTr = $(this).parents('tr')[0];
if (oTable.fnIsOpen(nTr))
{
\t \t \t alert("Alert 5.2");
/* This row is already open - close it */
this.src = "../examples_support/details_open.png";
//this.src = "http://l.yimg.com/rz/d/yahoo_news_en-US_s_f_p_168x21_news.png";
oTable.fnClose(nTr);
}
else
{
/* Open this row */
\t \t \t alert("Alert 5.3");
this.src = "../examples_support/details_close.png";
\t \t \t alert("5.3.1 this.src");
oTable.fnOpen(nTr, fnFormatDetails(nTr), 'details');
\t \t \t alert("Alert 5.4");
}
\t alert("Base Function [Step 3] \t "); \t \t
\t \t
});
alert("Base Function [Step 2] \t ");
\t }
alert("('#searchAll').click(FindAll): Pre"); \t
$('#searchAll').click(FindAll);
alert("('#searchAll').click(FindAll): Post"); \t
//oTable.ajax.reload();
//$('#example').dataTable().ajax.reload();
});
alert("Step 1");
//data=JSON.parse(JSON.stringify($("#data").text()));
function fnFormatDetails (nTr) {
var aData = oTable.fnGetData(nTr);
var sOut = '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">';
sOut += '<tr><td>Rendering engine:</td><td>'+aData[2]+' '+aData[5]+'</td></tr>';
sOut += '<tr><td>Link to source:</td><td>Could provide a link here</td></tr>';
sOut += '<tr><td>Extra info:</td><td>And any further details here (images etc)</td></tr>';
sOut += '</table>';
return sOut;
}
//live is deprcated
$('#example tbody td img').on('click', function() {
var nTr = $(this).parents('tr')[0];
if (oTable.fnIsOpen(nTr))
{
/* This row is already open - close it */
this.src = "../examples_support/details_open.png";
//this.src = "http://l.yimg.com/rz/d/yahoo_news_en-US_s_f_p_168x21_news.png";
oTable.fnClose(nTr);
}
else
{
/* Open this row */
this.src = "../examples_support/details_close.png";
oTable.fnOpen(nTr, fnFormatDetails(nTr), 'details');
}
});
//]]>
</script>
</body>
</html>
Я слышал о некоторых JSON парсеров, имеющих проблемы с символами табуляции. Похоже, у вас есть вкладка перед линией «iTotalRecords». –
Я удалил вкладки и до сих пор не работает –
Я разобрался в soultuion. Я клонировал объявление тега Json Source и повторно инициализировал таблицу –