如題
有試過在function內宣告iris的ctx出來用,但是好像會被卡住無法執行
如果單純傳資料去前端,再用javascript去修改html的內容也是可以,只是這樣好像就失去後端的作用(變成單純依照前端傳來的資訊去資料庫撈東西)
所以才想用後端渲染的方式完成
語言是golang,框架是iris/websocket
ws := websocket.New(websocket.DefaultGorillaUpgrader, websocket.Events{
websocket.OnNativeMessage: func(nsConn *websocket.NSConn, msg websocket.Message) error {
log.Printf("Server got: %s from [%s]", msg.Body, nsConn.Conn.ID())
msg.Body = []byte("Here is input") //需要渲染到html的資料
nsConn.Conn.Write(msg.Body)
nsConn.Conn.Server().Broadcast(nsConn, msg)
return nil
},
})
程式的主要目的是因應其中一位使用者做出動作的回應可以渲染到所有使用者的畫面上
完整程式碼是參考iris官方文件
前端用AJAX,後端收到再把資料用JSON回傳,前端收回JSON後再把資料填入網頁中,不用重新RENDER整個頁面
我配JQUERY(懶的三次方)
※前端(.done是收到後端丟來的json格式的data,用$.each把資料直接填回頁面的動作)
$.post({
url: "main.php",
dataType: 'json',
data: {
rbmode: "getSingersList",
}
})
.done(function(data) {
if (data.length > 0) {
$("#singersList").html("");
var Adl = $("<dl></dl>");
$.each(data, function(i, v) {
Adl.append(`<dt>${v["kindname"]}</dt>`);
var xdd = $("<dd></dd>");
$.each(v["data"], function(di, dv) {
xdd.append(`<div>${dv}</div>`)
});
Adl.append(xdd);
});
$("#singersList").append(Adl);
}
});
※PHP後端(也是個爬蟲,網址就不好意思寫了,免得收到存証信函)
if ($_POST["rbmode"] == "getSingersList") {
$today = time();
$sscache = './ktvlist/sscache.list';
$fileTooOld = false;
if (file_exists($sscache)) {
$filedate = filemtime($sscache);
$fileTooOld = abs($today - $filedate) > (3 * 86400);
}
if (!file_exists($sscache) or $fileTooOld) {
$TotalSingers = array();
$singerL = array(
"a" => "華語男歌手",
"b" => "華語女歌手",
"c" => "華語團體",
"e" => "歐美",
"f" => "日韓"
);
foreach (array_keys(array_reverse($singerL)) as $sL) {
$html = file_get_html("https://某網站/xxxx" . $sL . "1.htm");
if ($html != "") {
$sulall = $html->find("ul[class=s_listA]", 0)->find("li");
$thisL = array();
foreach ($sulall as $aul) {
$detail = $aul->find("a", 0)->innertext;
if (!in_array($thisL, $detail)) {
array_push($thisL, $detail);
}
}
array_push($TotalSingers, array(
"kindname" => $singerL[$sL],
"data" => $thisL
));
}
}
if (count($TotalSingers) > 0) {
$jsonstr = json_encode(array_reverse($TotalSingers));
file_put_contents($sscache, $jsonstr);
ob_start();
echo $jsonstr;
ob_flush();
}
} else {
ob_start();
echo file_get_contents($sscache);
ob_flush();
}
die();
exit();
}