- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请有人告诉我如何将我创建并输出到jsondata.php的以下结果放入JavaScript中的变量中,以便我可以索引 通过结果并在整个网站的 Div 中使用它们。
所需变量是:
$lastplayed 中的所有内容以及 $secsemain 的结果
我尝试使用下面的代码访问 Javascript 中的数据,...我知道它不好!!
测试1
<script>
url = jsondata.php;
var arr;
arr = <?php echo json_decode($lastplayed,TRUE); ?>;
</script>
以下是生成 JSON 数据的文件
FILE1 (dblastplayedarray.php)
<?php
date_default_timezone_set('Europe/London');
require_once("DbConnect.php");
$sql = "SELECT `artist`, `title`, `label`, `albumyear`, `date_played`, `duration`,
`picture` FROM historylist ORDER BY `date_played` DESC LIMIT 5 ";
$result = $db->query($sql);
$lastplayed = array();
$i = 1;
while ($row=$result->fetch_object()) {
$lastplayed[$i]['artist'] = $row->artist;
$lastplayed[$i]['title'] = $row->title;
$lastplayed[$i]['label'] = $row->label;
$lastplayed[$i]['albumyear'] = $row->albumyear;
$lastplayed[$i]['date_played'] = $row->date_played;
$lastplayed[$i]['duration'] = $row->duration;
$lastplayed[$i]['picture'] = $row->picture;
$i++;
}
$starttime = strtotime($lastplayed[1]['date_played']);
$curtime = time();
$timeleft = $starttime+round($lastplayed[1]['duration']/1000)-$curtime;
$secsremain = (round($lastplayed[1]['duration'] / 1000)-($curtime-$starttime))
?>
文件 2 (jsondata.php)
<?php
require_once("dblastplayedarray.php");
echo json_encode($lastplayed);
?>
最佳答案
首先,您不想仅仅为了获取当前歌曲的剩余时间而对 PHP 脚本生成连续的请求。最好让 JavaScript 来处理这个问题。
你的 JavaScript 必须决定两件事:
可能的解决方案是:
让你的 JS 代码计算当前歌曲结束的时间。当时间达到零时,通过 PHP 查询数据库以获取下一批歌曲。
收到更新后,再次计算当前歌曲结束的时间并等待其达到零(使用计时器)。
要从 PHP 获取结果,您最好使用 Ajax 以避免完全刷新页面。
将所有这些放在一起,您应该得到类似的结果:
var PlayList = function (onUpdate, onError)
{
// store user callbacks
this.onUpdate = onUpdate;
this.onError = onError;
// setup internal event handlers
this.onSongEnd = onSongEnd.bind (this);
// allocate an Ajax handler
try
{
this.ajax = window.XMLHttpRequest
? new XMLHttpRequest()
: new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
// fatal error: could not get an Ajax handler
this.onError ("could not allocated Ajax handler");
}
this.ajax.onreadystatechange = onAjaxUpdate.bind(this);
// launch initial request
this.onSongEnd ();
// ------------------------------------------
// interface
// ------------------------------------------
// try another refresh in the specified amount of seconds
this.retry = function (delay)
{
setTimeout (this.onSongEnd, delay*1000);
}
// ------------------------------------------
// ancillary functions
// ------------------------------------------
// called when it's time to refresh the playlist
function onSongEnd ()
{
// ask for a playlist update
this.ajax.open('GET', 'playlist.php', // <-- reference your PHP script here
true);
this.ajax.send(null);
}
// called to handle Ajax request progress
function onAjaxUpdate ()
{
if (this.ajax.readyState != 4) return;
if (this.ajax.status == 200)
{
// get our response
var list = eval ('('+this.ajax.responseText+')');
// compute milliseconds remaining till the end of the current song
var start = new Date (list[0].date_played).getTime();
var now = new Date ( ).getTime();
var d = start - now
+ parseInt(list[0].duration); // JSON data are plain strings, don't forget
// to convert then to numbers if need be
if (d < 0)
{
// no new song started, retry in 10 seconds
d = 10000;
}
else
{
// notify caller
this.onUpdate (list);
}
// schedule next refresh
setTimeout (this.onSongEnd, d);
}
else
{
// Ajax request failed. Most likely a fatal error
this.onError ("Bloody Ajax request failed");
}
}
}
请注意,这是纯粹的、普通的 JavaScript。这是教育代码,因此如果您有兴趣,可以使用它来查看准系统 Ajax 使用的示例。
由于使用了 bind()
,它在 IE8 中不起作用,但如果您打算支持老牛,您可以轻松添加包装函数。
可以说,您可以使用 JQuery goo 更轻松地执行 Ajax 查询。我自己从来都无法忍受这些东西,但毫无疑问,你会发现很多人愿意向你展示它是如何完成的。
var list = new PlayList (playlistupdate, playlisterror);
function playlistupdate (list)
{
// do whatever you want with the playlist
console.log ("Playlist update at "+new Date().toTimeString());
for (var i = 0 ; i != list.length ; i++)
{
var song = list[i];
console.log (i+" "+song.title);
}
}
function playlisterror (msg)
{
// display error message
console.log ("Ajax error: "+msg);
// may want to retry, but chances of success are slim
list.retry (10); // retry in 10 seconds
}
// make this query non cacheable
/*
* if you don't do this, your browser will cache
* your first query and ignore the subsequent ones
*/
header("Cache-Control: no-cache");
// open your DB connection
require_once("DbConnect.php");
// fetch playlist
$result = $db->query(
"SELECT `artist`, `title`, `label`, `albumyear`, `date_played`, `duration`, `picture` "
."FROM historylist ORDER BY `date_played` DESC LIMIT 5 ");
// this little line replaces your bunch of code
while ($row=$result->fetch_object()) $list[] = $row;
// encode and send the result
echo json_encode ($list);
注意无缓存 header 。这是防止浏览器缓存您的请求的最干净的方法。
前面提到的 JQuery goo 将为您提供一个糟糕的解决方案,包括在查询后面添加一些垃圾(即用 playlist.php?some_random_junk
替换 playlist.php
来强制浏览器将每个请求视为唯一的,从而无缘无故地污染您的浏览器缓存)。
由于您可以控制执行查询的 PHP,因此可以更好地从源头处理问题。
我编写了一个快速而肮脏的测试工具来省去数据库
// read our dummy DB
if (file_exists ("playlist.txt"))
{
foreach (explode ("\n", file_get_contents ("playlist.txt")) as $i => $line)
{
$line = explode ('|', $line);
foreach (array ('title', 'date_played', 'duration') as $k =>$f)
{
$db[$i]->$f = $line[$k];
}
}
$last_ended = strtotime($db[count($db)-1]->date_played)
+ $db[count($db)-1]->duration/1000;
}
else $last_ended = time();
function song_name ()
{
return
array_rand (array_flip(array("A", "Your", "Some", "This", "No"))). " ".
array_rand (array_flip(array("beautiful", "weird", "delightful", "doomed", "pink"))). " ".
array_rand (array_flip(array("love", "kiss", "baby", "monster", "dude", "car")));
}
// add a new dummy song to our DB if the last one has ended
if ($last_ended <= time())
{
$changed = true;
$db[] = array ("title" => song_name(), "date_played" => date("M d Y H:i:s", $last_ended), "duration" => rand(10,20)*1000);
// store only the last 5 songs in the dummy DB
$db = array_slice ($db, -5);
foreach ($db as $k => $record)
{
$out[$k] = implode ('|', (array)$record);
}
file_put_contents ("playlist.txt", implode ("\n", $out));
}
// make this query non cacheable
header("Cache-Control: no-cache");
// get DB output
$list = array_slice (array_reverse ($db), 0, 5);
// encode and send it
echo json_encode ($list);
Playlist update at 00:34:26 GMT+0100 (Paris, Madrid)
0 Your doomed love
1 Your doomed dude
2 No beautiful kiss
3 Some pink baby
4 Your delightful car
Playlist update at 00:34:38 GMT+0100 (Paris, Madrid)
0 No doomed baby
1 Your doomed love
2 Your doomed dude
3 No beautiful kiss
4 Some pink baby
您可以获得两个测试文件here .
由于以可读的方式模拟 Ajax 请求很困难,所以我没有做 JSFiddle。
根据流行的请求,这里是一个示例代码,它确实在网页上显示某些内容,而不是简单地将列表打印到控制台。
您只需更改 playlistupdate
即可:
function playlistupdate (list)
{
// display the playlist inside a table
// table header
var table = '<tr>';
for (var j in list[0]) table += '<th>'+j+'</th>';
table += '</tr>';
// list items
for (var i = 0 ; i != list.length ; i++)
{
table += '<tr>';
for (var j in list[i])
{
table += '<td>'+list[i][j]+'</td>';
}
table += '</tr>';
}
// update table
document.getElementById ('playlist').innerHTML = table;
}
并且您需要在 HTML 中的某个位置定义一个空表:
<table id='playlist'></table>
关于javascript - JSON 编码的 PHP 数组到 JAVASCRIPT 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21242366/
我对自定义 CSS 或在将图像作为 Logo 上传到页面时使用编码 block 有疑问。我正在为我的网站使用 squarespace,我需要帮助编码我的 Logo 以使其适合每个页面。一个选项是使用自
如 encoding/json 包文档中所述, Marshal traverses the value v recursively. If an encountered value implement
我必须做一些相当于Java中的iconv -f utf8 -t sjisMS $INPUT_FILE的事情。该命令在 Unix 中 我在java中没有找到任何带有sjisMS的编码。 Java中有Sh
从 PHP 5.3 迁移到 PHP 5.6 后,我遇到了编码问题。我的 MySQL 数据库是 latin1,我的 PHP 文件是 windows-1251。现在一切都显示为“ñëåäíèòå àäðå
我有一个 RScript文件(我们称之为 main.r ),它引用了另一个文件,使用以下代码: source("functions.R") 但是,当我运行 RScript 文件时,它提示以下错误:
我无法设法从 WSDL 创建 RPC/编码风格的代码 - 有谁知道哪个框架可以做到这一点? 带有 adb 和 xmlbeans 映射的 Axis2 无法正常工作(无法处理响应中的肥皂编码)直接使用 X
安装了最新版本的Node.Js()和npm包**(1.2.10)**当我运行 Express 命令来生成项目时,它向我抛出以下错误 buffer.js:240 switch (encoding &
JavaScript中有JSON编码/解码base64编码/解码函数吗? 最佳答案 是的,btoa() 和 atob() 在某些浏览器中可以工作: var enc = btoa("this is so
>>> unicode('восстановление информации', 'utf-16') Traceback (most recent call last): File "", line
我当然熟悉 java.net.URLEncoder 和 java.net.URLDecoder 类。但是,我只需要 HTML 样式的编码。 (我不想将 ' ' 替换为 '+' 等)。我不知道任何只做
有一个非常简单的 SSIS 包: OLE DB Source 通过 View 获取数据(数据库表 nvarchar 或 nchar 中的所有字符串列)。 派生列,用于格式化现有日期并将其添加到数据集(
我正在使用一个在 Node 中进行base64编码的软件,如下所示: const enc = new Buffer('test', 'base64') console.log(enc) 显示: 我正
我试图将带有日语字符的数据插入到 oracle 数据库中。事情是保存在数据库中的是一堆倒置的问号。我该如何解决这个问题 最佳答案 见 http://www.errcode.net/blogs/?p=6
当我在 java 中解压 zip 文件时,我发现文件名中出现了带有重音字符的奇怪行为。 西索: Add File user : L'equipe Technique -- Folder : spec
在网上冲浪我找到了 ExtJS 的 Ext.Gantt 插件,该扩展有一个特殊的编码。任何人都知道如何编码那样或其他复杂的形式。 Encoded Gantt Chart 最佳答案 它似乎被 Dean
我正在用C语言做一个编码任务,我进展顺利,直到读取符号并根据表格分配相应的代码的部分。我必须连接几个代码,直到它们的长度达到 32 位,为此我必须将它们写入一个文件中。这种写入文件的方法给我带来了很多
我有一个外部链接的 javascript 文件。在那个 javascript 里面,我有这个功能: function getMonthNumber(monthName){ monthName = mo
使用mechanize,我检索到一个网页的源页面,其中包含一些非ASCII字符,比如汉字。 代码如下: #using python2.6 from mechanize import Browser b
我有一个包含字母 ø 的文件。当我用这段代码 File.ReadLines(filePath) 读取它时,我得到了一个问号而不是它。 当我像这样添加编码时 File.ReadLines(filePat
如何翻译下面的字符串 H.P. Dembinski, B. K\'{e}gl, I.C. Mari\c{s}, M. Roth, D. Veberi\v{c} 进入 H. P. Dembinski,
我是一名优秀的程序员,十分优秀!