可以做到類似於某度網盤的樣式嗎?
文件夾的命名, 可以用單數, 也可以用復數, 在同一個項目中, 只要統一就好了. 畢竟項目開發不同於英語寫作. 建議使用縮寫, 不管是不是縮寫都用單數, 這樣簡潔,容易一致.
關於模板中的 常量替換?
配置文件名, 函數名文件等,都是嚴格大小寫的, 所以這里創建了一個 Common/Conf/Config.php (里面的config寫成了Config)文件,里面的 TMPL_PARSE_STRING就不能被解析.
**雖然在模板中, 可以認識 __PUBLIC__, 但是寫TMPL_PARSE_STRING的時候, 在config.php中, 只認識__ROOT__, 並不認識 __PUBLIC__, 所以即使你先定義了__PUBLIC__, 后面要定義__IMG__的時候, 也不能使用__PUBLIC__, 而是仍然要從__ROOT__開始寫起 **
寫__IMG__等的時候, 最后的路徑最好是不要加 斜杠/, 因為 一般的使用習慣是前面使用了常量, 一般會在后面加斜杠,如: src="__IMG__/foo.jpg"
instead of: 后跟名詞, 動名詞等. 表示 "代替,(替代物, 替代品), 而不是..." 記住一點: 它后面的內容表示 "被否定的, 被替代的事物"
事實上, 是不能通過javascript腳本直接去訪問 "客戶端"本地文件的. firefox曾經提出過 FileRead對象去直接操作本地文件, 而windows用new ActiveXObject對象實現. 單都不是標准. 可以通過 html的 file對象(即文件域)去打開"select"窗口, 選擇本地文件.
只是input type=file文件域, 每次只能選擇一個 本地文件 用於上傳.
如何實現input file文件域多選上傳?
寫法 <input type="file" multiple name="photo" />
這里最重要的是 要加上一個 multiple. 就可以在選擇上傳文件時, 實現 "多選"操作.
從另一個角度來理解 導航?
導航一方面,確實是顯示整個網站的結構. 但是另一方面,有的時候, 除了(網占內容, 結構的顯示和導引外), 也可以看作是, 或者是(在首頁/各個頁面)的頂端, 兩邊, 布置一些 快捷按鈕/鏈接(作為技術員的網占, 內容為王, 基本上都不用圖形按鈕的, 通常用文字鏈接), 即使可能不是網站內容導航, 但是是瀏覽用戶最想找到的地方...
幾乎絕大多數網頁都 經不起 縮小的?? 所以, 就通常不要考慮網頁過渡縮小的情況了.
emmet在寫標簽屬性的時候, 由於在原生的屬性之間 都是用空格 來分隔的, 所以, 在簡寫的屬性時, 也用 空格來分隔!
在shell command的終端中, ctrl_pgup/pgdn是切換到下一個/上一個標簽, 而shift+ctrl+pgup/pgdn則是移動標簽. 兩者是不一樣的. 也可以直接使用 alt+ {count} 來選擇標簽.
注意/破除一個誤解的思想, 以為結尾的大小括號應該與開始的 括號相對齊, 其實vim有自己的 對齊 / 縮進 /格式化的方式, 不要在意它!
vim的 自動注釋工具, 非手寫注釋 參考: https://github.com/vim-scripts/DoxygenToolkit.vim
Doxygen: 文檔生成器, Dox + generator.
可以使用Doxygen, 生成注釋性的文檔, 按照Doxygen的格式進行注釋后, 再使用命令: doxygen "注釋文檔名稱"
更簡潔的工具是 DoxygenToolkit.
用bundle安裝時, 如果那個插件在github中提供了的情況下, 可以直接寫 {具體的pluginname}.vim, 而不用寫作者名稱! 如:
Taglist.vim, 和這里的 DoxygenToolkit.vim, 只要在 https://github.com/vim-scripts/
下面有相應的插件搜索提供就可以免作者名稱...
另一個vim的插件的地址是: www.vim.org/scripts/
下, 這個下面搜索的話, 就要寫作者名稱/插件名稱.
如果 用 Bundle來安裝, 它的 插件語句是: Plugin 'DoxygenToolkit.vim'
注意前面不用作者名稱, 而且單詞Doxy...的首字母要大寫, 后面加上 .vim的 后綴
Doxygen有四種重要命令:
DoxLic, 生成license注釋; :DoxAuthor, 生成作者信息; :Dox, 生成函數/類/結構體等注釋信息; :DoxBlock, 生成結構塊.
配置 Dox的 變量名, 可以在 DoxygenToolkit.vim 配置文件中設置, 也可以在 vimrc文件中設置變量賦值:
let g:DoxygenToolkit_commentType='php' // 下划線后面的內容使用 小駝峰法.
let g:DoxygenToolkit_authorName='foo'
使用linux的好處和"福利"
在linux下, 基本上大多數 "管理" 程序都是支持多標簽的, 如ff, terminal, gedit, nautilus等等.
而且基本上所有的程序下, 標簽的移動和切換 操作都是相同的:
切換: ctrl+pgdn 或者 pgup, 也可以對前幾個標簽頁使用 alt+1,2,3...的方式切換. 要切換到最后一個, 可以在第一個標簽頁 的時候, 使用 ctrl+pgup "向后"從而循環到最后一個標簽頁...
移動: ctrl+ (shift) +pgdn/ pgup.
如何才能在搜索的時候, 不高亮顯示搜索結果?
關於查找 文本, 可以參考這篇文章: http://blog.csdn.net/hitustc/article/details/5585101
高亮顯示搜索到的文本, 是設置選項: set hlsearch.
如果是 默認的 要 一律不高亮顯示 , 是: set nohlsearch ????????? 但是好像即使是這樣設置頁不管用!! 一旦回車之后, 都會高亮顯示的!也就是說 , 高亮的問題不要管了!!!
如果只是取消當前 這一次的高亮顯示結果是: :nohlsearch, 可以簡寫為 : nohl , 或直接搜索一個 隨便的不存在的 單詞內容...
設置搜索時的方向: /, 向前, ?表示向后: 前后, 是指行號增大的方向為前, 反之為后.
設置搜索時不區分大小寫: set ignorecase, 反義是: set noignorecase. 但是這樣不靈活, 更靈活的設置是:
- 使用修飾符: ? 或者/ Csearchword, 大寫的C表示要區分大小寫, 而 ?/csearchword表示不區分大小寫.????? 這個好像不可以????
- 使用星號或井號表示即時查找當前光標所在字符.
- 設置循環查找: set wrapscan, set nowrapscan. 默認的搜索方向是....
通過終端啟動的程序總是依賴於 終端的, 一旦終端關閉后, 程序也會自動關閉. 即使是通過后台運行的方式 即& 的方式也是這樣, 要想不依賴終端, 可以通過 alt_F2的方式來 run.
jquery中, attr方法, 即可以獲取元素的屬性, 也可以設置元素的屬性值.設置元素 的屬性值, 有三種方法, 一是 key, value; 二是 key, func; 三是如果一次性的設置多個屬性值, 可以用map的方式 {ky1:val1, key2: val2...}
在前端js, 和 jquery中, 使用單/雙引號都是可以的, 效果結果是一樣的. 只是 平時 建議都使用 單引號, 只有在 嵌套 的時候 才配合使用兩者.
jquery中 的attr和prop如何區別? 參考: http://wenzhixin.net.cn/2013/05/24/jquery_attr_prop http://www.cnblogs.com/Showshare/p/different-between-attr-and-prop.html
prop是從jquery 1.6+ 后才開始增加的.
雖然兩者都有屬性的意思, 但是:
prop: property意思是財產, 即元素自己的東西, 是元素原本就有的/w3c規定它自帶的, 不是后來程序員添加上去的.
attr: 不是w3c規定的"固有屬性", 是程序員自己添加上去的屬性.
使用時, 一方面, 看屬性是不是元素 固有的, 另一方面: 對於 checked, selected, disabled等具有 true/false屬性值的使用 prop, 而不使用attr. 對於這些具有 true/false的元素, 使用attr進行設置或獲取, 都是undefined.
jquery中, 在任何時候, 都要注意變量的類型. bool類型值 false和true, 是不同於 字符串的, 所以在需要字符串變量的 函數中, 傳入這種 bool值變量時, 是沒有任何顯示的.
像上面這種, 如果在append中, 傳入foo變量, 就不會有任何顯示了!
input的checkbox的寫法, <input type="checkbox" checked="checked" id="chbox" >
, label標簽的寫法是: for是針對 前面的id的, 要跟前面的input id保持一致.
jquery中的函數, fn中的 元素, 可以直接使用 this, 表示這個元素本身!!
從jquery對象到dom元素, 使用 數組下標的形式[index] 去取值, 或用get()取值也是可以的, get([index])如果不帶 index索引數字 , 則取得所有元素組成的數組! 然后可以用reverse()方法來反向, 因此, 在需要dom元素的時候, 為了簡潔, 為了避免再作一次轉換, 直接使用 document.getElementById()... 的形式
用ff的debug工具獲得的上傳文件域的值:
**Nerdtree設置啟動時, 所打開的默認目錄 :NERDTreeFromBookmark View 但是這個好像只是命令, 不能作為設置, 要作為設置 ,得設置鍵 映射. **
在html中定義的/要調用的函數, 應該放在script之間, 不要放在 $(function(){ 這里不要定義外部要調用的函數});
javascript中的四舍五入的函數方法?
可以使用Math對象的round函數, 但是round函數只有一個參數,那就是被處理的數字, 它不能指定對 小數點后的第幾位 數字進行四舍五入. 即 它**只能對小數點后的第一位數字進行四舍五入, 即總是得到的時一個 整數! ** 因此, 要對后面 第n 位的小數進行四舍五入, 就要先乘以 n100, round后,再/n100
**實際上, 也可以使用另一個很強大的函數: a_num. toFixed(要四舍五入的小數點位數) **
html中如何輸入 tab 特殊符號?
要注意tab並不是 html 所包含的特殊字符! 所以 不能用 &...; 的方式輸入 ???
但是可以使用 pre.../pre的方式, 保存 tab字符
但是請注意, pre中不能包含像p, talbe, h1,等之類的塊級元素. 只能包含內聯元素(行級元素), 它主要是用來為了保留 空格, tab, 換行之類的符號的. 主要是用來寫代碼的.
jquery中的empty和remove的區別?
empty是把這個dom元素的內部的 所有 子節點 刪除.
而remove 是把 這個dom元素 本身 刪除掉. remove可以過濾 你要刪除的哪些 類/id節點, 如: $('p'). remove('.class');
上傳處理函數 function upHandler()的實際內容
設置的上傳設置是:
rootPath默認的(再upload.class.php中的Upload類的屬性中有設置), 是./Upload/, 而實際中用得更多的是 /Public/Upload/, 所以這個屬性要單獨另外進行設置.
注意, rootPath的路徑最后要加斜杠, 這個跟路徑常量 有些不同
**另外設置的是, rootPath, 而不是 savePath! !! 設置 savePath時, 根路徑仍然認為是 ./Upload/ 而報錯~
**在linux中 要設置 上傳路徑為可寫! 設置目錄為777, 否則會提示: 路徑目錄 不存在, 讓你手動去創建.其實目錄是存在的, 只是由於權限不對.
上傳成功后, 給出的 $info
的數組信息:
subName: Array
array(1) {
[0] => array(9) { // 有9個屬性.
["key"] => string(5) "photo"
["name"] => string(23) "IMG_20161117_164852.jpg"
["type"] => string(10) "image/jpeg"
["size"] => int(1290692)
["ext"] => string(3) "jpg"
["md5"] => string(32) "8a1d410bfd85a7d11678536d9175aeeb"
["sha1"] => string(40) "b225acf637a4b224a6fc8f55a9842396be9f8d57"
["savename"] => string(23) "IMG_20161117_164852.jpg" // 這里的saveName 和原來的文件名相同, 使用的是->saveName ='' 這里使用雙引號也是可以的
["savepath"] => string(9) "20161228/"
}
}
javascript中的變量聲明?
js中的變量, 並不是必須聲明的! 你可以直接使用, 但是那樣不是太好 但是你也可以聲明, 建議最好是 對變量作聲明, 如果不作聲明, 當函數比較長的時候, 后面的變量是怎么來的就不好找了.
js var 變量的聲明時,可以賦初值, 但是如果 那個變量不好賦值, 或你不想給它賦值時, 你也可以不賦值, 直接就是 var foo_variablename
如果沒有給變量賦初值, 那么變量的值就是 undefined.
通常, 建議在函數的開頭集中聲明變量, 可以在同一行中聲明多個變量: var foo1, foo2=1, foo3='a', foo4; 如果變量比較長, 也可以跨行聲明.
再次反復強調, js和php都是弱類型語言, 弱類型並不是不講類型, 就像人一樣...., 同樣的, 如果你的函數中變量的類型不匹配, 同樣會報錯,同樣也需要 進行類型轉換:
- js字符串截取, 有很多語言都有這個函數需求, 但是不要搞昏了. substr是php中的, 而js中是 substring, 並且用法也不同..
- 類型轉換:
-
第一種, parseInt, parseFloat, 是將字符串轉換為整數/浮點數.只能對字符串使用這個函數, 其他類型都會犯錯.
相反的有個將數字轉換為字符串: toString -
第二種, 強制類型轉換: String(value), Number(value), Boolean(value).
-
所以, 在lastModifyDate加入到輸出結果的字符串中時, 如果直接對該變量使用加號時, 就會出錯, 還的要把它 (d.getMonth()+1).toString()轉換為字符串才能使用.
查看網頁中的問題時, 覺得是離不開firefox的! 因為它提供的調試功能太有用了. 包括js的調試排錯(console和debugger的區別: 通常js出現問題時, debugger是無法使用的, 所以js腳本不能執行, 執行結果不是期望的時候, 首先要去console查看錯誤, 然后排除錯誤, 錯誤排除后, debugger才能使用. debugger的主要作用是, 查看腳本執行過程, 或出現邏輯錯誤時....), 另外, 查看源代碼/和 查看生成的實際代碼 是不一樣的!! 源代碼是你請求的那個web的html頁面, 而firefox除了可以查看源代碼(右鍵菜單中), 還可以查看實時生成的html代碼. 實時代碼除了源代碼中 的 內容外, 還包括其他如js腳本輸出的內容. 實際上, 這個實時代碼在很多時候更有用!
**如這個問題就是通過實時代碼查出來的: 表格中的th 是和td 地位一樣的, 是單元格的 內容, 不是代表表格的行 tr, 不能使用th 來包圍 td, 當 試圖用th來包圍 td的時候, 會默認的加入行, 而且把th當作額外多出的一個單元格來表示. 這就是問題的原因, 為什么會多出來一個單元格! **
pretty: 漂亮的, prettify: 美化, 修飾. Prettify是google的code 美化插件, 只是讓代碼看起來更好看, 對實際執行結果沒有影響.
black boxing: 黑盒化, 黑箱, 實際上就是不顯示, black box this source...
表格的單元格分隔線, 要融合, 使用 style: border-collapse的值有兩個: collapse, separate, 當設置了這個css屬性時, 會忽略 border-spacing等屬性.
注意: css中的font-size屬性, 其實是沒有: +2, -2 之類的. 它的可能值是: 比例% (這個用得多), 固定長度(這個很少用), 關鍵字:如: xx-small, x-small, small, medium(這個是默認值), large, x-large, xx-large, (比較級)smaller, larger.
顯示多個上傳文件的列表upload.js
表格形式:
function suinfo(){
$('#ups').empty();
var info="<table style='border-collapse: collapse; font-size: 85%'><tr><th>name</th><th style='padding-left: 35px;'>size(KB)</th><th style='padding-left: 35px;'>last modif</th></tr>";
var uf=document.getElementById('ufile').files;
var l=uf.length;
var ef="", date;
for(i=0;i<l;i++){
date = uf[i].lastModifiedDate;
date = date.getFullYear()+'-'+(date.getMonth()+1).toString()+'-'+date.getDate();
if(i%2==1){
info += '<tr style="background: #eee;"><td>' +uf[i].name+'</td><td style="padding-left: 35px;">'+(uf[i].size/1024).toFixed(2)+'</td><td style="padding-left: 35px;">'+date+'</td></tr>';
}else{
info += '<tr><td>' +uf[i].name+'</td><td style="padding-left: 35px;">'+(uf[i].size/1024).toFixed(2)+'</td><td style="padding-left: 35px;">'+date+'</td></tr>';
}
}
info += "</table>";
$('#ups').append(info);
}
$('input[type="submit"]')
中的type 后面的內容 , 可以加 引號,也可以不加引號, 跟前面的input一起構成選擇符. jquery的幫助手冊上也說了, type后的value的引號是可選的, 只是在包含中括號[]的時候, 才要加引號進行區別
在js中, 要判斷 數據/變量的類型, 使用 typeof()函數, 因為有時候, 要判斷所得數據的類型, 才能 寫 if for while 等條件 判斷表達式, 看它是跟 boolean類型的值作比較, 還是和 string類型的值作比較 判斷.
如何人是input file文件域? 對文件域的理解, 雖然它是由一個(選擇browse...按鈕 + 文字說明 )構成的, (文字的內容 就等於 文件域的值, 一個字符串, 即當前選擇文件的名稱 字符串!!) 但是, 它其實 跟 其他一些input text等類型的文本框一樣, 相類似的, 它只是在 外觀上有些不同, 其他的 如 賦值 / 取值等操作跟其他 input都是一樣的.
將js 的數組 進行 清空的操作: 一是, array.length=0 讓數組長度等於0; 第二種方法是: arr=[] , 相當於重新賦值一個空數組.但是 要清空 input file文件域的值 , 方法是 由於文件域的值是 一個字符串, 所以只要 給它賦值為 空串 "" 即可.