iT邦幫忙

0

怎樣改成不用設定 讀 多少張圖片讀和 不用理會圖檔格式?

  • 分享至 

  • xImage

我用這段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內的圖檔?不用每次修改這兩處!
    or
  • 以 另一個JS檔來存取這兩項變數可以嗎?怎樣修改呢?

謝謝大大 幫忙!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0

不是很清楚你的問題。因為不太清楚你所謂的依folder圖檔是啥意思。

不過如果前端要可以不分格式圖片處理的話
倒是可以利用一下CSS background

.img {
  background-image: url("img_tree.gif"), url("img_tree.jpg"), url("img_tree.png");
  background-repeat: no-repeat, repeat;
  .........
}

這是這招只適合用在長寬都是一樣固定的圖片。
如果各自不同長寬的話,一般還得做一下特殊的處理才行。

另外一招就是利用一下LOAD圖片的程式寫法了。
也就是後載入的處理方式。可以在載入過程中判斷是否有成功載入及是否能讀取圖片。

當然了,如果有利用到後端語言的話。就可以用後端語言協助一下。先行判斷並載入圖檔的連結。
再送給前端處理。
畢竟前端並不能知道圖片位置。只能判斷連結圖片是否存在而已。

MoMoDIYer iT邦新手 5 級 ‧ 2021-06-27 11:00:53 檢舉

很多謝您的提意,但還要測試一段時間才知道是否合我的情況!

0
Eudora
iT邦新手 4 級 ‧ 2021-06-27 01:39:52

可參考 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]
}

延伸:

  1. 圖片成功讀取、也取得檔名。若還因為其他需求而依然需要取得所有檔名內的最大值最小值,應該也不難做了。

  2. 或者也可以試著在請求時從 xhr.response 取圖片檔名而不是圖檔路徑。

  3. 小提醒-注意非同步的問題:

    xhr.onload = () => {
      if (xhr.status === 200) {
      ....
      } 
    }
    xhr.send()
    
    imgsSrc.forEach(imgSrc => {
      ...
    });
    

    如果直接這樣寫會失敗,因為執行 imgsSrc.forEach 時,imgsSrc 還沒塞完請求資料。


希望有幫助到你囉!

看更多先前的回應...收起先前的回應...
MoMoDIYer iT邦新手 5 級 ‧ 2021-06-27 11:11:51 檢舉

這個是我另一類似問題,發生在使用 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程式代替嗎?

淺水員 iT邦大師 6 級 ‧ 2021-06-27 12:14:24 檢舉

很多正式環境不會回傳資料夾內有哪些檔案
所以我還是比較建議伺服器開一個api給前端使用

MoMoDIYer iT邦新手 5 級 ‧ 2021-06-27 16:04:47 檢舉

因為內聯網使用,只想解決現狀,也因未學習製作api。

就如我回答說的,前端程式能做的事有限。
前端並無法直接取到後端連結的圖片路徑及目錄資料。
所以在無法用API跟後端請求的情況下。

最多只能用載入圖片的失敗法來處理。只是這樣會跑非常多的回圈,效果一定是不好的。

不過你有說到一件事。「AJAX DATA」
但從宣告const 來看,這一定不會是AJAX請求的東西。也就是程式寫死的東西才對。也就是說認真來看,你不是會寫前端的工程師。
要不然不會有此一問。

基本來看,不利用後端來處理的話。你還是只能乖乖的在這寫設定檔了。直到你會寫後端處理。

MoMoDIYer iT邦新手 5 級 ‧ 2021-06-30 09:30:53 檢舉

我是初哥(佬)學習寫自己網站,就是很多流行的用詞都不懂。用 宣告const 在DATA file 也是別人教我,但我在網上也很難找到相關用法,但實際又可以運作,才只好繼續用。我也考慮了學習後端處理,來增加可控手段。但路還有很遠,我必定在這裡多多學習。

我要發表回答

立即登入回答