最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端JavaScript實(shí)現(xiàn)圖片水印生成的具體指南

 更新時(shí)間:2025年07月15日 09:15:17   作者:盛夏綻放  
在前端開發(fā)中,給網(wǎng)頁(yè)或圖像添加水印是一項(xiàng)常見的需求,給圖片加水印,就是給它們紋上一個(gè)獨(dú)特的"防偽標(biāo)記",即使被盜也能一眼認(rèn)出"這是我的!"本文就給大家介紹了前端JavaScript實(shí)現(xiàn)圖片水印生成的具體指南,需要的朋友可以參考下

引言:為什么你的圖片需要"紋身"?

想象一下,你的身份證照片被不法分子盜用注冊(cè)貸款,或者你的攝影作品被無(wú)良商家盜版販賣——這就像你的錢包被偷了,小偷還拿著你的證件到處招搖撞騙!給圖片加水印,就是給它們紋上一個(gè)獨(dú)特的"防偽標(biāo)記",即使被盜也能一眼認(rèn)出"這是我的!"。

今天,我將手把手教你用前端技術(shù)給圖片"紋身",就像給貴重物品刻上姓名一樣簡(jiǎn)單。無(wú)需后端,打開瀏覽器就能完成!

1. 水?。簣D片的"防偽身份證"

1.1 水印的三大神奇功效

  • 防盜盾牌:就像超市商品上的防盜磁條,讓盜圖者無(wú)從下手
  • 版權(quán)簽名:相當(dāng)于在作品上蓋個(gè)人印章,聲明"原創(chuàng)出品"
  • 追蹤暗號(hào):類似鈔票的防偽編號(hào),泄露后能追查源頭

1.2 真實(shí)案例警示

  • 某大學(xué)生用他人證件照注冊(cè)網(wǎng)貸,導(dǎo)致受害者負(fù)債20萬(wàn)
  • 攝影師作品被淘寶商家盜用,月銷3000+卻分文未獲
  • 企業(yè)合同被PS篡改,造成百萬(wàn)經(jīng)濟(jì)損失

2. 技術(shù)揭秘:Canvas如何給圖片"紋身"

2.1 五大步驟圖解

2.2 核心代碼拆解

// 就像準(zhǔn)備畫板和顏料
const canvas = document.createElement("canvas");
const ctx = canvas.getContext("2d");

// 把照片鋪在畫板上
ctx.drawImage(img, 0, 0);

// 用半透明"墨水"寫字
ctx.fillStyle = "rgba(0,0,0,0.3)";
ctx.fillText("機(jī)密", 100, 100);

// 把畫好的作品拍成照片
canvas.toDataURL("image/jpeg");

3. 終極方案對(duì)比:選對(duì)你的"紋身槍"

方案適合場(chǎng)景優(yōu)點(diǎn)缺點(diǎn)
Canvas動(dòng)態(tài) 網(wǎng)頁(yè)加水印靈活可控,效果豐富需處理跨域問(wèn)題
CSS簡(jiǎn)單內(nèi)容保護(hù)零代碼基礎(chǔ)也能用右鍵保存即可破解
SVG需要矢量清晰水印放大不模糊兼容性要求高
后端批量處理海量圖片安全性最高需要服務(wù)器支持

新手推薦:Canvas方案就像多功能紋身機(jī),能滿足大部分需求!

4. 手把手教學(xué):給圖片戴上"防偽項(xiàng)鏈"

4.1 準(zhǔn)備工具

  • 瀏覽器(推薦Chrome)
  • 代碼編輯器(VS Code或記事本也行)
  • 一張測(cè)試圖片(建議尺寸800x600左右)

4.2 分步實(shí)現(xiàn)

第一步:創(chuàng)建圖片上傳區(qū)

<!-- 就像準(zhǔn)備一個(gè)相框 -->
<input type="file" id="uploader" accept="image/*">
<div id="photoFrame"></div>

第二步:編寫"紋身"機(jī)器

// 紋身師傅上崗啦?。ńo圖片添加水印的函數(shù))
async function tattooImage(file) {
  // 1. 讀取顧客照片
  // 調(diào)用 loadImage 函數(shù),將上傳的文件轉(zhuǎn)換為 Image 對(duì)象
  const img = await loadImage(file);
  
  // 2. 準(zhǔn)備畫布(根據(jù)照片尺寸定制)
  // 創(chuàng)建一個(gè) Canvas 元素,用于繪制圖片和水印
  const canvas = document.createElement("canvas");
  // 設(shè)置 Canvas 的寬高與圖片一致
  canvas.width = img.width;
  canvas.height = img.height;

  // 3. 繪制原圖(先鋪好底圖)
  // 獲取 Canvas 的繪圖上下文
  const ctx = canvas.getContext("2d");
  // 將圖片繪制到 Canvas 上
  ctx.drawImage(img, 0, 0);

  // 4. 設(shè)計(jì)紋身圖案(設(shè)置水印樣式)
  // 設(shè)置水印的字體為微軟雅黑,大小為 30px,加粗
  ctx.font = "bold 30px 微軟雅黑";
  // 設(shè)置水印的顏色為黑色,透明度為 0.3
  ctx.fillStyle = "rgba(0,0,0,0.3)";
  
  // 5. 斜著紋更防偽(旋轉(zhuǎn)20度)
  // 將 Canvas 繪圖上下文旋轉(zhuǎn) -20 度(逆時(shí)針旋轉(zhuǎn))
  // 注意:旋轉(zhuǎn)是以 Canvas 的原點(diǎn)為中心的,因此水印會(huì)傾斜
  ctx.rotate(-20 * Math.PI / 180);
  
  // 6. 全圖紋上暗花(平鋪水印)
  // 使用雙層循環(huán),在圖片上平鋪水印文本
  for (let x = 0; x < canvas.width; x += 200) { // 水印水平方向的間距為 200 像素
    for (let y = 0; y < canvas.height; y += 100) { // 水印垂直方向的間距為 100 像素
      // 在指定位置繪制水印文本“嚴(yán)禁盜用”
      ctx.fillText("嚴(yán)禁盜用", x, y);
    }
  }

  // 7. 包裝成品(將帶有水印的 Canvas 導(dǎo)出為圖片)
  // 將 Canvas 的內(nèi)容導(dǎo)出為 Base64 格式的圖片數(shù)據(jù)
  return canvas.toDataURL("image/jpeg");
}
function loadImage(file) {
  return new Promise((resolve, reject) => {
    // 1.創(chuàng)建一個(gè) FileReader 對(duì)象
    const reader = new FileReader(); 
    reader.onload = (e) => {
      // 2.在讀取文件的時(shí)候,創(chuàng)建一個(gè) Image 對(duì)象
      const img = new Image(); 
      img.onload = () => {
        // 當(dāng)圖片加載完成時(shí),返回 Image 對(duì)象
        resolve(img); 
      };
      img.onerror = (err) => {
        // 如果圖片加載失敗,拋出錯(cuò)誤
        reject(err); 
      };
      // 將 Base64 數(shù)據(jù)賦值給 Image 的 src 屬性
      img.src = e.target.result; 
    };
    // 如果文件讀取失敗,拋出錯(cuò)誤
    reader.onerror = (err) => {
      reject(err); 
    };
    reader.readAsDataURL(file); // 以 Data URL 的形式讀取文件
  });
}

看完上面操作,你可能會(huì)有一個(gè)疑問(wèn):為什么只是 resolve(img) 就進(jìn)行下一步了?請(qǐng)看下面的分析

代碼分析-loadImage

第一步:使用 FileReader 讀取文件

const reader = new FileReader();
reader.onload = (e) => {
  const img = new Image();
  img.onload = () => {
    resolve(img);
  };
  img.onerror = (err) => {
    reject(err);
  };
  img.src = e.target.result; // 將 Base64 數(shù)據(jù)賦值給 Image 的 src 屬性
};
reader.onerror = (err) => {
  reject(err);
};
reader.readAsDataURL(file); // 以 Data URL 的形式讀取文件

FileReader.readAsDataURL(file)

  • 這一步將文件(通常是用戶通過(guò) <input type="file"> 選擇的圖片文件)讀取為 Base64 格式的字符串。
  • 這是一個(gè)異步操作,當(dāng)文件讀取完成時(shí),會(huì)觸發(fā) reader.onload 事件。

reader.onload 事件

  • 當(dāng)文件讀取成功后,e.target.result 包含了文件的 Base64 數(shù)據(jù)。
  • 在這個(gè)事件中,創(chuàng)建了一個(gè) Image 對(duì)象,并將 Base64 數(shù)據(jù)賦值給 Imagesrc 屬性。

第二步:加載圖片

const img = new Image();
img.onload = () => {
  resolve(img);
};
img.onerror = (err) => {
  reject(err);
};
img.src = e.target.result; // 將 Base64 數(shù)據(jù)賦值給 Image 的 src 屬性

img.src = e.target.result

  • 將 Base64 數(shù)據(jù)賦值給 Imagesrc 屬性后,瀏覽器會(huì)開始加載圖片。
  • 這也是一個(gè)異步操作,當(dāng)圖片加載完成時(shí),會(huì)觸發(fā) img.onload 事件。

img.onload 事件

  • 當(dāng)圖片加載成功后,圖片的 widthheight 屬性會(huì)被正確設(shè)置,此時(shí)圖片已經(jīng)可以被使用了。
  • 在這個(gè)事件中,通過(guò) resolve(img) 將加載完成的 Image 對(duì)象傳遞出去。

兩步操作的聯(lián)系

這兩步操作是緊密相連的異步流程,具體聯(lián)系如下:

FileReaderonload 事件觸發(fā)后

  • 文件被成功讀取為 Base64 數(shù)據(jù)。
  • 這時(shí),圖片數(shù)據(jù)已經(jīng)準(zhǔn)備好,但還沒有被加載到 Image 對(duì)象中。

Imageonload 事件觸發(fā)后

  • 圖片數(shù)據(jù)被成功加載到 Image 對(duì)象中。
  • 這時(shí),圖片已經(jīng)可以被繪制到 Canvas 上或進(jìn)行其他操作。

總結(jié)

  • FileReaderonload 事件處理文件讀取完成后的數(shù)據(jù)。
  • Imageonload 事件處理圖片加載完成后的操作。
  • resolve(img) 將加載完成的 Image 對(duì)象傳遞給 Promise 的后續(xù)處理邏輯,使得調(diào)用者可以通過(guò) await.then() 獲取到結(jié)果。

這種設(shè)計(jì)使得異步操作可以被很好地管理,代碼邏輯清晰且易于維護(hù)。

第三步:展示防偽作品

// 當(dāng)顧客上傳照片時(shí)
uploader.addEventListener("change", async (e) => {
  const file = e.target.files[0];
  if(!file) return;
  
  // 開始紋身!
  const protectedImage = await tattooImage(file);
  
  // 展示成品
  photoFrame.innerHTML = `<img src="${protectedImage}" style="max-width:100%">`;
});

4.3 效果升級(jí)技巧

動(dòng)態(tài)水印:添加當(dāng)前日期

ctx.fillText(`張三 ${new Date().toLocaleDateString()}`, x, y);

圖片水印:用Logo代替文字

const logo = await loadImage("logo.png");
ctx.drawImage(logo, x, y, 50, 50);

多重防護(hù):文字+圖案組合水印

如果你仔細(xì)觀看了第4標(biāo)題的內(nèi)容,你就會(huì)發(fā)現(xiàn)他是把 上傳的整個(gè)圖片文件 進(jìn)行水印處理。那么,到此為止你就可以嘗試將 上傳的圖片 加上水印了。但是肯定有人要問(wèn)了:我想要水印的圖片來(lái)源并不是上傳的圖片,是 本地服務(wù)器/網(wǎng)絡(luò)圖片 我又該怎么辦吶?那么好,向下看

補(bǔ)充:本地服務(wù)器/網(wǎng)絡(luò)圖片水印添加全攻略

針對(duì)已經(jīng)存在于本地服務(wù)器或網(wǎng)絡(luò)上的圖片,我將提供兩種場(chǎng)景的完整解決方案,并解釋其中的關(guān)鍵差異。

場(chǎng)景一:本地服務(wù)器圖片加水印

(如:http://localhost:3000/uploads/photo.jpg

解決方案代碼

// 異步函數(shù):給通過(guò) URL 加載的圖片添加水印
async function addWatermarkToLocalImage(imageUrl) {
  return new Promise((resolve) => {
    const img = new Image(); // 創(chuàng)建一個(gè) Image 對(duì)象,用于加載圖片
    
    // 關(guān)鍵設(shè)置:聲明需要跨域訪問(wèn)
    // 如果圖片來(lái)自其他域名,需要設(shè)置 crossOrigin 屬性為 "Anonymous" 或 "Use-Credentials"
    img.crossOrigin = "Anonymous";
    
    // 避免緩存問(wèn)題:在圖片 URL 后添加時(shí)間戳
    img.src = imageUrl + '?t=' + Date.now();
    
    // 圖片加載成功后的回調(diào)
    img.onload = function() {
      // 創(chuàng)建一個(gè) Canvas 元素,用于繪制圖片和水印
      const canvas = document.createElement("canvas");
      // 設(shè)置 Canvas 的寬高與圖片一致
      canvas.width = img.width;
      canvas.height = img.height;
      const ctx = canvas.getContext("2d"); // 獲取 Canvas 的繪圖上下文
      
      // 繪制原圖:將加載的圖片繪制到 Canvas 上
      ctx.drawImage(img, 0, 0);
      
      // 添加水?。ㄅc之前相同)
      // 設(shè)置水印的字體、顏色和透明度
      ctx.font = "bold 30px Microsoft YaHei";
      ctx.fillStyle = "rgba(0,0,0,0.3)";
      
      // 旋轉(zhuǎn)水?。?20度),使水印傾斜
      ctx.rotate(-20 * Math.PI / 180);
      
      // ...(其他水印代碼,例如平鋪水印等)
      
      // 將帶有水印的 Canvas 導(dǎo)出為 Base64 格式的圖片數(shù)據(jù)
      resolve(canvas.toDataURL("image/jpeg"));
    };
    
    // 圖片加載失敗的回調(diào)
    img.onerror = () => {
      console.error("本地圖片加載失敗,請(qǐng)檢查:");
      console.log("1. 圖片URL是否正確");
      console.log("2. 服務(wù)器是否允許跨域(CORS)");
      resolve(null); // 返回 null 表示失敗
    };
  });
}

// 使用示例
const watermarked = await addWatermarkToLocalImage(
  "http://localhost:3000/uploads/photo.jpg" // 圖片的 URL
);

關(guān)鍵注意事項(xiàng)

必須設(shè)置跨域?qū)傩?/strong>:

img.crossOrigin = "Anonymous"; // 必須!

開發(fā)環(huán)境CORS配置(以Express為例):

// 在Node.js服務(wù)器添加這段代碼
app.use((req, res, next) => {
  res.header("Access-Control-Allow-Origin", "*");
  next();
});

緩存問(wèn)題處理

img.src = url + '?t=' + Date.now(); // 加時(shí)間戳避免緩存

場(chǎng)景二:網(wǎng)絡(luò)圖片加水印

(如:https://example.com/photo.jpg

解決方案代碼

async function addWatermarkToWebImage(imageUrl) {
  try {
    // 方案1:直接嘗試(需要圖片服務(wù)器允許跨域)
    const result = await tryDirectWatermark(imageUrl);
    if (result) return result;
    
    // 方案2:通過(guò)后端代理(當(dāng)直接訪問(wèn)失敗時(shí))
    return await fetchProxyWatermark(imageUrl);
  } catch (error) {
    console.error("水印生成失敗:", error);
    return null;
  }
}

// 嘗試直接加水印
async function tryDirectWatermark(url) {
  return new Promise((resolve) => {
    const img = new Image();
    img.crossOrigin = "Anonymous";
    img.src = url;
    
    img.onload = function() {
      // ...(與本地服務(wù)器相同的加水印邏輯)
      resolve(watermarkedImage);
    };
    
    img.onerror = () => resolve(null); // 失敗返回null
  });
}

// 通過(guò)后端代理獲取
async function fetchProxyWatermark(url) {
  const response = await fetch(`/api/watermark-proxy?url=${encodeURIComponent(url)}`);
  const blob = await response.blob();
  return URL.createObjectURL(blob);
}

關(guān)鍵注意事項(xiàng)

跨域問(wèn)題處理流程

后端代理示例(Node.js):

// 代理接口實(shí)現(xiàn)
app.get('/api/watermark-proxy', async (req, res) => {
  const { url } = req.query;
  try {
    const response = await axios.get(url, { responseType: 'arraybuffer' });
    res.type(response.headers['content-type']);
    res.send(response.data);
  } catch (error) {
    res.status(500).send("圖片獲取失敗");
  }
});

兩種場(chǎng)景對(duì)比

特性本地服務(wù)器圖片網(wǎng)絡(luò)圖片
基礎(chǔ)訪問(wèn)同源或配置CORS即可必須圖片服務(wù)器允許跨域
必做設(shè)置crossOrigin="Anonymous"需要準(zhǔn)備代理方案作為后備
典型URLhttp://localhost:3000/xxx.jpghttps://example.com/photo.jpg
緩存處理建議加時(shí)間戳可能需要清理緩存
失敗概率較低(開發(fā)環(huán)境通常允許)較高(依賴第三方服務(wù)器配置)

完整使用示例

<!DOCTYPE html>
<html>
<body>
  <h2>本地服務(wù)器圖片</h2>
  <button onclick="processLocalImage()">處理本地圖片</button>
  
  <h2>網(wǎng)絡(luò)圖片</h2>
  <input type="text" id="webImageUrl" placeholder="輸入圖片URL">
  <button onclick="processWebImage()">處理網(wǎng)絡(luò)圖片</button>
  
  <div id="result" style="margin-top:20px;"></div>

  <script>
    async function processLocalImage() {
      const result = await addWatermarkToLocalImage(
        "http://localhost:3000/photo.jpg"
      );
      if (result) {
        document.getElementById("result").innerHTML = `
          <img src="${result}" style="max-width:500px;">
        `;
      }
    }
    
    async function processWebImage() {
      const url = document.getElementById("webImageUrl").value;
      const result = await addWatermarkToWebImage(url);
      if (result) {
        document.getElementById("result").innerHTML = `
          <img src="${result}" style="max-width:500px;">
          <p>右鍵圖片另存為即可下載</p>
        `;
      } else {
        alert("處理失敗,請(qǐng)檢查URL或控制臺(tái)報(bào)錯(cuò)");
      }
    }
  </script>
</body>
</html>

常見問(wèn)題解決

Q1:本地圖片加載失敗怎么辦?

  • ? 檢查瀏覽器控制臺(tái)是否報(bào)CORS錯(cuò)誤
  • ? 確認(rèn)圖片URL能直接訪問(wèn)
  • ? 在服務(wù)器添加CORS頭(開發(fā)環(huán)境可臨時(shí)禁用安全限制)

Q2:網(wǎng)絡(luò)圖片始終加載失?。?/strong>

  • ? 嘗試在瀏覽器直接打開圖片URL
  • ? 使用代理方案(必須有自己的后端服務(wù))
  • ? 推薦免費(fèi)的CORS代理服務(wù)(如cors-anywhere.herokuapp.com

Q3:水印位置不理想?

  • 調(diào)整這兩個(gè)參數(shù):
// 水印間距
for(let x=0; x<width; x+=150) { ... }
for(let y=0; y<height; y+=80) { ... }

// 旋轉(zhuǎn)角度
ctx.rotate(-15 * Math.PI / 180); // 改成15度

現(xiàn)在你可以輕松為任何來(lái)源的圖片添加專業(yè)水印了!根據(jù)實(shí)際需求選擇適合的方案即可。

5. 常見問(wèn)題急救箱

Q1:為什么水印加載失???

檢查清單

  1. 圖片地址是否正確(試試瀏覽器直接打開)
  2. 服務(wù)器是否配置CORS(開發(fā)時(shí)可用chrome --disable-web-security
  3. 控制臺(tái)是否有報(bào)錯(cuò)(按F12查看)

Q2:如何讓水印更難去除?

進(jìn)階方案

  • 使用半隨機(jī)位置(避免規(guī)律排列)
  • 添加噪點(diǎn)干擾(類似驗(yàn)證碼效果)
  • 設(shè)置多層水印(不同角度/透明度疊加)

Q3:移動(dòng)端適配要注意什么?

優(yōu)化建議

  • 觸屏增加上傳引導(dǎo)
  • 根據(jù)屏幕尺寸調(diào)整水印大小
  • 添加加載動(dòng)畫(大圖處理需要時(shí)間)

6. 總結(jié):你的圖片保鏢已上線

現(xiàn)在你已獲得:

  • 防盜技能:給圖片穿上防彈衣
  • 設(shè)計(jì)能力:自由定制水印樣式
  • 排錯(cuò)技巧:快速解決常見問(wèn)題

以上就是前端JavaScript實(shí)現(xiàn)圖片水印生成的具體指南的詳細(xì)內(nèi)容,更多關(guān)于前端圖片水印生成的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • javascript同步Import,同步調(diào)用外部js的方法

    javascript同步Import,同步調(diào)用外部js的方法

    javascript同步Import,同步調(diào)用外部js的實(shí)現(xiàn)代碼,測(cè)試確實(shí)可用
    2008-07-07
  • JS 連鎖泡泡 v1.1

    JS 連鎖泡泡 v1.1

    前幾天在朋友的iPhone上面玩了一個(gè)連鎖泡泡游戲,頭腦發(fā)熱就想用js寫一個(gè)。
    2009-09-09
  • 只需五句話搞定JavaScript作用域(經(jīng)典)

    只需五句話搞定JavaScript作用域(經(jīng)典)

    javascript作用域是前端開發(fā)比較難理解的知識(shí)點(diǎn),下面小編給大家提供五句話幫助大家很快的了解js作用域,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-07-07
  • layui操作列按鈕個(gè)數(shù)和文字顏色的判斷實(shí)例

    layui操作列按鈕個(gè)數(shù)和文字顏色的判斷實(shí)例

    今天小編就為大家分享一篇layui操作列按鈕個(gè)數(shù)和文字顏色的判斷實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-09-09
  • 深度拆解前端雙Token無(wú)感刷新的實(shí)現(xiàn)機(jī)制

    深度拆解前端雙Token無(wú)感刷新的實(shí)現(xiàn)機(jī)制

    在前后端分離的項(xiàng)目中,為了安全,Token?通常會(huì)設(shè)置有效期,本文將深度拆解?“雙?Token?無(wú)感刷新”?的實(shí)現(xiàn)機(jī)制,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-03-03
  • Bootstrap選項(xiàng)卡動(dòng)態(tài)切換效果

    Bootstrap選項(xiàng)卡動(dòng)態(tài)切換效果

    這篇文章主要為大家詳細(xì)介紹了Bootstrap選項(xiàng)卡動(dòng)態(tài)切換效果,點(diǎn)擊登錄和注冊(cè)可以實(shí)現(xiàn)任意切換,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 微信小程序頁(yè)面生命周期詳解

    微信小程序頁(yè)面生命周期詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序頁(yè)面生命周期的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Echarts實(shí)現(xiàn)點(diǎn)擊列表聯(lián)動(dòng)餅圖的示例代碼

    Echarts實(shí)現(xiàn)點(diǎn)擊列表聯(lián)動(dòng)餅圖的示例代碼

    本文主要介紹了Echarts實(shí)現(xiàn)點(diǎn)擊列表聯(lián)動(dòng)餅圖的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Javascript添加監(jiān)聽與刪除監(jiān)聽用法詳解

    Javascript添加監(jiān)聽與刪除監(jiān)聽用法詳解

    這篇文章主要介紹了Javascript添加監(jiān)聽與刪除監(jiān)聽用法,較為詳細(xì)的分析了javascript原理與用法,并補(bǔ)充說(shuō)明了事件監(jiān)聽的兼容性問(wèn)題,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • 使用JavaScript匹配URL中的查詢參數(shù)的實(shí)現(xiàn)方法

    使用JavaScript匹配URL中的查詢參數(shù)的實(shí)現(xiàn)方法

    在 Web 開發(fā)中,處理 URL 的查詢參數(shù)(也稱為搜索內(nèi)容)是一項(xiàng)常見的任務(wù),查詢參數(shù)通常位于 URL 的 ? 之后,以鍵值對(duì)的形式存在,本文將介紹如何使用 JavaScript 編寫一個(gè)函數(shù),用于匹配并提取 URL 中的所有查詢參數(shù)內(nèi)容,需要的朋友可以參考下
    2025-12-12

最新評(píng)論

伊宁县| 南丰县| 静乐县| 大同市| 云安县| 岳普湖县| 云梦县| 天祝| 芮城县| 黎川县| 洪雅县| 黑河市| 高要市| 西贡区| 湖口县| 耒阳市| 洛南县| 天峻县| 浑源县| 达尔| 烟台市| 阳东县| 远安县| 枝江市| 内黄县| 铜山县| 西乌珠穆沁旗| 淅川县| 无锡市| 新巴尔虎左旗| 漳浦县| 神池县| 卓尼县| 安陆市| 延寿县| 酒泉市| 古浪县| 禄丰县| 龙游县| 寻甸| 五指山市|