let random = (start, end, base = 1) => {
if (Array.isArray(start)) {
return start[random(0, start.length - 1)];
} else {
return Math.floor(Math.random() * ((end - start) / base + 1)) * base + start;
}
};
2018年11月19日 星期一
2018年10月20日 星期六
[JavaScript] MutationObserver(監聽DOM物件的改變)
MutationObserver可以用來監聽一個DOM物件的內容是否被修改。然而,監視對象並不是在初始化階段設置的,而是在之後用方法observe時提供的。
初始化階段只聲明這個observer被觸發時的callback函式,參數有兩個:mutations,那些被監聽到的變化;target,監聽對象。
===
var observer = new MutationObserver(function (mutations, target) {
// callback
});
var options = {
childList: true,
attributes: true,
characterData: true,
subtree: true,
attributeFilter: undefined
};
observer.observe(target, options);
observer.disconnect();
===.
呼叫observe方法時監聽才開始。options中childList代表是否監聽子節點變化;attributes代表屬性的變化;characterData代表資料;subtree代表是否往下遞迴。
初始化階段只聲明這個observer被觸發時的callback函式,參數有兩個:mutations,那些被監聽到的變化;target,監聽對象。
===
var observer = new MutationObserver(function (mutations, target) {
// callback
});
var options = {
childList: true,
attributes: true,
characterData: true,
subtree: true,
attributeFilter: undefined
};
observer.observe(target, options);
observer.disconnect();
===.
呼叫observe方法時監聽才開始。options中childList代表是否監聽子節點變化;attributes代表屬性的變化;characterData代表資料;subtree代表是否往下遞迴。
2018年8月7日 星期二
[SQL Server+Node.js] 建立連線
在Node.js伺服器上要跟Microsoft的SQL Server連線需要套件mssql。
只談連線的話基本上是這樣做的。
===
const mssql = require("mssql");
var dbConfig = {
user: "<username>",
password: "<password>",
server: "localhost\\SQLEXPRESS",
database: "<database-name>"
};
mssql.connect(dbConfig, (error) => {
// 連線以後的東西在這邊不講
});
===.
問題在於有些必須做的東西很多人沒講。
從這篇可以看到,在Windows的「電腦管理/服務與應用程式」裡可以找到SQL Server的傳輸協定的設定,TCP/IP必須開啟,然後SQL Server Browser也必須開啟。為了重新啟動服務最好直接重新開機。
然而還有一種問題是SQL Server Browser無法開啟(右鍵選單啥都沒有),這種狀況下參考這篇,到「服務」裡找到SQL Server Browser右鍵內容,把他從停用改為自動或啟用。
另外有時候腦袋蠢蠢的,在<database-name>填入資料表的名稱,當然她媽不會動,這種狀況下回傳的錯誤是登入失敗(因為他找不到那個資料庫)。
只談連線的話基本上是這樣做的。
===
const mssql = require("mssql");
var dbConfig = {
user: "<username>",
password: "<password>",
server: "localhost\\SQLEXPRESS",
database: "<database-name>"
};
mssql.connect(dbConfig, (error) => {
// 連線以後的東西在這邊不講
});
===.
問題在於有些必須做的東西很多人沒講。
從這篇可以看到,在Windows的「電腦管理/服務與應用程式」裡可以找到SQL Server的傳輸協定的設定,TCP/IP必須開啟,然後SQL Server Browser也必須開啟。為了重新啟動服務最好直接重新開機。
然而還有一種問題是SQL Server Browser無法開啟(右鍵選單啥都沒有),這種狀況下參考這篇,到「服務」裡找到SQL Server Browser右鍵內容,把他從停用改為自動或啟用。
另外有時候腦袋蠢蠢的,在<database-name>填入資料表的名稱,當然她媽不會動,這種狀況下回傳的錯誤是登入失敗(因為他找不到那個資料庫)。
[JavaScript] select元件手動觸發onchange事件
select元件就是下拉式選單。它的結構長得像這樣。
===
<select>
<option value="option0">Apple</option>
<option value="option1">Banana</option>
</select>
===.
要透過JavaScript來改變select元件的值使用的是下面的方法
===
element.value = "<value>";
===.
element指的是select元件。此處的<value>要參考option元件的value值。
到這邊都是好理解的,問題在於這個做法好像有點bug,就是onchange事件不會正確地觸發。因此修改完value以後還要特地去觸發onchange事件。
===
element.value = "<value>";
var ev = document.createElement("HTMLEvents");
ev.initEvent("change", false, true);
element.dispatchEvent(ev);
===.
===
<select>
<option value="option0">Apple</option>
<option value="option1">Banana</option>
</select>
===.
要透過JavaScript來改變select元件的值使用的是下面的方法
===
element.value = "<value>";
===.
element指的是select元件。此處的<value>要參考option元件的value值。
到這邊都是好理解的,問題在於這個做法好像有點bug,就是onchange事件不會正確地觸發。因此修改完value以後還要特地去觸發onchange事件。
===
element.value = "<value>";
var ev = document.createElement("HTMLEvents");
ev.initEvent("change", false, true);
element.dispatchEvent(ev);
===.
2018年6月28日 星期四
[Git] VS Code
首先要安裝Git。然後安裝VS Code(Visual Studio Code)。
先登入並在GitHub網頁上建立倉庫(repository),複製倉庫網址,在本機系統上找到要放置倉庫的目錄,右鍵開啟Git Bash,輸入指令
===
git clone <倉庫網址>
===.
要注意,不要先行建立倉庫名稱的目錄,會產生衝突。
複製(clone)完以後應該會有一個倉庫名稱的目錄,這就是本機倉庫,裡面會有一個隱藏目錄.git。
如果Git安裝的時候並沒有設置全域使用者,在這邊就要特別設置。
一樣,在Git Bash中移動到倉庫目錄下,執行指令
===
git config user.email <GitHub帳戶>
===.
這樣之後就會以這個帳戶的身分做推提與同步。
這種設置方法是針對倉庫的,也就是說以上的指令用來設定目前工作目錄的倉庫的帳戶身分,與其他倉庫則與此無關。
如果想要設置全域的帳戶就要加上--global。
===
git config --global user.email <GitHub帳戶>
===.
總之,設置好倉庫與帳戶身分之後,就可以在VS Code以開啟目錄的方式打開這個倉庫。在VS Code的左側欄位有一個原始檔控制(Ctrl+Shift+G),這邊可以看到原始檔控制使用的是GIT,下面則標記了被變更(modified)的檔案(會標記M)、被暫存(staged)的變更。
在變更列表中,點擊被變更檔案右側的加號可以暫存該檔案的變更;或是在「變更」的右側點擊加號可以暫存所有檔案的變更。同樣的,在暫存的變更列表中,點擊減號可以取消暫存。
當暫存的變更已經可以認可(commit)的時候,在上面輸入「訊息」並點擊Ctrl+Enter以認可目前的暫存。
在VS Code的左下角,可以看到目前工作的分支(branch),這個分支預設會是master,可以理解為主線。在分支名稱的後面,星號「*」代表在本機倉庫中有尚未暫存的變更、加號「+」代表在本機倉庫中有尚未認可的暫存。
無論如何,這些版本都是存儲在本機倉庫中的,必須要推送(push)到中央(?)倉庫──也就是GitHub上的倉庫──才能做合併(merge)。同樣的,要更新本機的倉庫資訊也需要提取(pull),或者使用同步(sync)。三者都可以在原始檔控制欄的右上角找到。
比較奇妙的是,提取的時候似乎不是整個倉庫做提取,而是和目前聚焦的檔案有關,因此在提取的時候可能要先把想提取的檔案打開。
先登入並在GitHub網頁上建立倉庫(repository),複製倉庫網址,在本機系統上找到要放置倉庫的目錄,右鍵開啟Git Bash,輸入指令
===
git clone <倉庫網址>
===.
要注意,不要先行建立倉庫名稱的目錄,會產生衝突。
複製(clone)完以後應該會有一個倉庫名稱的目錄,這就是本機倉庫,裡面會有一個隱藏目錄.git。
如果Git安裝的時候並沒有設置全域使用者,在這邊就要特別設置。
一樣,在Git Bash中移動到倉庫目錄下,執行指令
===
git config user.email <GitHub帳戶>
===.
這樣之後就會以這個帳戶的身分做推提與同步。
這種設置方法是針對倉庫的,也就是說以上的指令用來設定目前工作目錄的倉庫的帳戶身分,與其他倉庫則與此無關。
如果想要設置全域的帳戶就要加上--global。
===
git config --global user.email <GitHub帳戶>
===.
總之,設置好倉庫與帳戶身分之後,就可以在VS Code以開啟目錄的方式打開這個倉庫。在VS Code的左側欄位有一個原始檔控制(Ctrl+Shift+G),這邊可以看到原始檔控制使用的是GIT,下面則標記了被變更(modified)的檔案(會標記M)、被暫存(staged)的變更。
在變更列表中,點擊被變更檔案右側的加號可以暫存該檔案的變更;或是在「變更」的右側點擊加號可以暫存所有檔案的變更。同樣的,在暫存的變更列表中,點擊減號可以取消暫存。
當暫存的變更已經可以認可(commit)的時候,在上面輸入「訊息」並點擊Ctrl+Enter以認可目前的暫存。
在VS Code的左下角,可以看到目前工作的分支(branch),這個分支預設會是master,可以理解為主線。在分支名稱的後面,星號「*」代表在本機倉庫中有尚未暫存的變更、加號「+」代表在本機倉庫中有尚未認可的暫存。
無論如何,這些版本都是存儲在本機倉庫中的,必須要推送(push)到中央(?)倉庫──也就是GitHub上的倉庫──才能做合併(merge)。同樣的,要更新本機的倉庫資訊也需要提取(pull),或者使用同步(sync)。三者都可以在原始檔控制欄的右上角找到。
比較奇妙的是,提取的時候似乎不是整個倉庫做提取,而是和目前聚焦的檔案有關,因此在提取的時候可能要先把想提取的檔案打開。
2018年5月31日 星期四
[Node.js] 建立伺服器
典型的伺服器建立方式。下面是伺服器的程式碼。這個程式碼通常取名為server.js,置放在伺服器根目錄,之後在console用「node server.js」來運行他。
===
var http = require("http");
http.createServer(function (request, response) {
response.writeHead(code, {"ContentType": mime});
response.write(content);
response.end();
}).listen(port, ip);
===.
裡面的function應該挺容易懂的,是對於客戶端得請求如何作答覆。code是200正常、404找不著那個;mime是指內容的類型,最基本的是text/plain,常見的還有text/html、text/css、text/javascript,這部分在處理一些讓客戶端自動請求的CSS、JS時需要特別處理一下,否則會發現伺服器把這些檔案當成text/plain或text/html傳出去。response.end()之後這個回應就被送出了。
http.createServer().listen()則是實質地在本機的「ip:port」上啟動一個伺服器。
伺服器開啟後,console會被占用,輸入Ctrl+C強制跳出後伺服器就算關閉了。
===
var http = require("http");
http.createServer(function (request, response) {
response.writeHead(code, {"ContentType": mime});
response.write(content);
response.end();
}).listen(port, ip);
===.
裡面的function應該挺容易懂的,是對於客戶端得請求如何作答覆。code是200正常、404找不著那個;mime是指內容的類型,最基本的是text/plain,常見的還有text/html、text/css、text/javascript,這部分在處理一些讓客戶端自動請求的CSS、JS時需要特別處理一下,否則會發現伺服器把這些檔案當成text/plain或text/html傳出去。response.end()之後這個回應就被送出了。
http.createServer().listen()則是實質地在本機的「ip:port」上啟動一個伺服器。
伺服器開啟後,console會被占用,輸入Ctrl+C強制跳出後伺服器就算關閉了。
2018年5月25日 星期五
[JavaScript] 取得視窗卷軸位置
討論垂直方向,視窗的卷軸位置在window.scrollY。
如果要知道卷軸是否碰底,可以拿視窗卷軸位置與視窗高度相加,看是否與body的高度吻合。
===
return window.scrollY + window.innerHeight === document.body.clientHeight;
===.
如果要知道卷軸是否碰底,可以拿視窗卷軸位置與視窗高度相加,看是否與body的高度吻合。
===
return window.scrollY + window.innerHeight === document.body.clientHeight;
===.
訂閱:
文章 (Atom)
[HTML] ribody
怕自己忘記,稍微紀錄一下。 各種各種理由(其中一個就是Vue,不能綁定在body上),導致時常需要一個包在body中的div,當作body來用,像這樣: === <body> <div id="divBody"> ...
-
自動腳本最好還是在網頁讀取完畢之後再執行,有些情況下甚至需要一個延遲時間。大致上如下。 === window.loadelay = 0; // 延遲時間 window.main = function () { // 程序內容 }; window.addEve...
-
let random = (start, end, base = 1) => { if (Array.isArray(start)) { return start[random(0, start.length - 1)]; } else...
-
在Node.js伺服器上要跟Microsoft的SQL Server連線需要套件mssql。 只談連線的話基本上是這樣做的。 === const mssql = require("mssql"); var dbConfig = { user: ...