我用這段Code來自動讀取連續數字的 .jpg 圖檔,如下要人手設定 1-90,和 是 .jpg 或是 .webp,png,gif 格式。
for (noPics = 1; noPics <= 90; noPics++) {
document.write('<p><img src="./' + noPics + '.jpg" alt="' + noPics + '" title="' + noPics + '"/></p>');
}
問題是:
謝謝大大 幫忙!
不是很清楚你的問題。因為不太清楚你所謂的依folder圖檔是啥意思。
不過如果前端要可以不分格式圖片處理的話
倒是可以利用一下CSS background
.img {
background-image: url("img_tree.gif"), url("img_tree.jpg"), url("img_tree.png");
background-repeat: no-repeat, repeat;
.........
}
這是這招只適合用在長寬都是一樣固定的圖片。
如果各自不同長寬的話,一般還得做一下特殊的處理才行。
另外一招就是利用一下LOAD圖片的程式寫法了。
也就是後載入的處理方式。可以在載入過程中判斷是否有成功載入及是否能讀取圖片。
當然了,如果有利用到後端語言的話。就可以用後端語言協助一下。先行判斷並載入圖檔的連結。
再送給前端處理。
畢竟前端並不能知道圖片位置。只能判斷連結圖片是否存在而已。
可參考 stackoverflow 這篇的範例能做到直接讀取資料夾內的所有圖片:
var xhr = new XMLHttpRequest();
xhr.open("GET", "/img", true);
xhr.responseType = 'document';
xhr.onload = () => {
if (xhr.status === 200) {
var elements = xhr.response.getElementsByTagName("a");
for (x of elements) {
if ( x.href.match(/\.(jpe?g|png|gif)$/) ) {
let img = document.createElement("img");
img.src = x.href;
document.body.appendChild(img);
}
};
}
else {
alert('Request failed. Returned status of ' + xhr.status);
}
}
xhr.send()
可以先 console.log(xhr.response) 觀察下返回的資料結構
上面解答是直接取得圖片路徑後生成,但依據你的需求尚須取得檔名,同時依照你原本的格式我改寫如下供參考:
var xhr = new XMLHttpRequest();
xhr.open("GET", "/img", true);
xhr.responseType = 'document';
xhr.onload = () => {
if (xhr.status === 200) {
let elements = xhr.response.getElementsByTagName("a");
let imgsSrc = []
for (x of elements) {
if (x.href.match(/\.(jpe?g|png|gif)$/)) {
imgsSrc.push(x.href)
}
};
roadImgHandler(imgsSrc)
}
else {
alert('Request failed. Returned status of ' + xhr.status);
}
}
xhr.send()
function roadImgHandler(imgsSrc) {
let imgName = "";
imgsSrc.forEach(imgSrc => {
imgName = getFileName(imgSrc);
document.write(`
<p><img src="${imgSrc}" alt="${imgName}" title="${imgName}"/></p>
`);
});
}
function getFileName(fileUrl) {
return fileUrl.split('/').pop().split('.')[0]
}
延伸:
圖片成功讀取、也取得檔名。若還因為其他需求而依然需要取得所有檔名內的最大值最小值,應該也不難做了。
或者也可以試著在請求時從 xhr.response 取圖片檔名而不是圖檔路徑。
小提醒-注意非同步的問題:
xhr.onload = () => {
if (xhr.status === 200) {
....
}
}
xhr.send()
imgsSrc.forEach(imgSrc => {
...
});
如果直接這樣寫會失敗,因為執行 imgsSrc.forEach 時,imgsSrc 還沒塞完請求資料。
希望有幫助到你囉!
這個是我另一類似問題,發生在使用 jQuery dataTables 時,遇到這問題。
例子是我的HTML頁之Table會輸入這AJAX data檔案(img8.js):
const imgList = [
["<img src='./1.jpg'>"],
["<img src='./2.jpg'>"],
["<img src='./3.jpg'>"],
["<img src='./4.jpg'>"],
["<img src='./5.jpg'>"],
["<img src='./6.jpg'>"],
["<img src='./7.jpg'>"],
["<img src='./8.jpg'>"]
]
問題是使用在極之多地方使用,所以由0(無圖片)至 1000幅不定,那我就要製作 1001個 js檔,的確很倦!可以用JS程式代替嗎?
很多正式環境不會回傳資料夾內有哪些檔案
所以我還是比較建議伺服器開一個api給前端使用
因為內聯網使用,只想解決現狀,也因未學習製作api。
就如我回答說的,前端程式能做的事有限。
前端並無法直接取到後端連結的圖片路徑及目錄資料。
所以在無法用API跟後端請求的情況下。
最多只能用載入圖片的失敗法來處理。只是這樣會跑非常多的回圈,效果一定是不好的。
不過你有說到一件事。「AJAX DATA」
但從宣告const 來看,這一定不會是AJAX請求的東西。也就是程式寫死的東西才對。也就是說認真來看,你不是會寫前端的工程師。
要不然不會有此一問。
基本來看,不利用後端來處理的話。你還是只能乖乖的在這寫設定檔了。直到你會寫後端處理。
我是初哥(佬)學習寫自己網站,就是很多流行的用詞都不懂。用 宣告const 在DATA file 也是別人教我,但我在網上也很難找到相關用法,但實際又可以運作,才只好繼續用。我也考慮了學習後端處理,來增加可控手段。但路還有很遠,我必定在這裡多多學習。