個人工具庫(持續更新中)

来源:https://www.cnblogs.com/ld1024/archive/2019/04/09/10678132.html
-Advertisement-
Play Games

主要分享自己日常工作中常用的工具函數,希望能夠對大家有幫助。工具函數不定時持續更新中…… ...


本篇目錄:

  • 1.截取指定位元組數的字元串
  • 2.判斷是否微信
  • 3.獲取時間格式的幾個舉例
  • 4.獲取字元串位元組長度
  • 5.對象克隆、深拷貝
  • 6.組織結構代碼證驗證
  • 7.身份證號驗證
  • 8.js正則為url添加http標識
  • 9.URL有效性校驗方法
  • 10.自定義jsonp方法
  • 11.cookie操作
  • 12.生成隨機字元串 (可指定長度)
  • 13.瀏覽器判斷
  • 14.Rem移動端適配
  • 15.獲取url後參數
  • 16.動態載入JS
  • 17.生成隨機顏色值
  • 18.事件綁定與解綁
  • 19.移動端音頻播放
  • 20.移動端視頻適配
  • 21.Webpack+Vue-CLI實現自動全局註冊組件

1.截取指定位元組數的字元串

/**
 * 截取指定位元組的字元串
 * @param str 要截取的字元穿
 * @param len 要截取的長度,根據位元組計算
 * @param suffix 截取前len個後,其餘的字元的替換字元,一般用“…”
 * @returns {*}
 */
function cutString(str, len, suffix) {
  if (!str) return "";
  if (len <= 0) return "";
  if (!suffix) suffix = "";
  var templen = 0;
  for (var i = 0; i < str.length; i++) {
    if (str.charCodeAt(i) > 255) {
      templen += 2;
    } else {
      templen++
    }
    if (templen == len) {
      return str.substring(0, i + 1) + suffix;
    } else if (templen > len) {
      return str.substring(0, i) + suffix;
    }
  }
  return str;
}

2.判斷是否微信

/**
 * 判斷微信瀏覽器
 * @returns {Boolean}
 */
function isWeiXin() {
  var ua = window.navigator.userAgent.toLowerCase();
  if (ua.match(/MicroMessenger/i) == 'micromessenger') {
    return true;
  } else {
    return false;
  }
}

3.獲取時間格式的幾個舉例

function getTimeFormat(time) {
  var date = new Date(parseInt(time) * 1000);
  var month, day, hour, min;
  parseInt(date.getMonth()) + 1 < 10 ? month = '0' + (parseInt(date.getMonth()) + 1) : month = parseInt(date.getMonth()) + 1;
  date.getDate() < 10 ? day = '0' + date.getDate() : day = date.getDate();
  date.getHours() < 10 ? hour = '0' + date.getHours() : hour = date.getHours();
  date.getMinutes() < 10 ? min = '0' + date.getMinutes() : min = date.getMinutes();
  return [month, day].join('-') + '  ' + hour + ':' + min
}

function getTimeFormatYMD(time) {
  var date = new Date(parseInt(time) * 1000);
  var year, month, day;
  year = date.getFullYear();
  parseInt(date.getMonth()) + 1 < 10 ? month = '0' + (parseInt(date.getMonth()) + 1) : month = parseInt(date.getMonth()) + 1;
  date.getDate() < 10 ? day = '0' + date.getDate() : day = date.getDate();
  return [year, month, day].join('-')
}

function getTimeFormatAll(time) {
  var date = new Date(parseInt(time) * 1000);
  var year, month, day, hour, min, second;
  year = date.getFullYear();
  parseInt(date.getMonth()) + 1 < 10 ? month = '0' + (parseInt(date.getMonth()) + 1) : month = parseInt(date.getMonth()) + 1;
  date.getDate() < 10 ? day = '0' + date.getDate() : day = date.getDate();
  date.getHours() < 10 ? hour = '0' + date.getHours() : hour = date.getHours();
  date.getMinutes() < 10 ? min = '0' + date.getMinutes() : min = date.getMinutes();
  date.getSeconds() < 10 ? second = '0' + date.getSeconds() : second = date.getSeconds();

  return [year, month, day].join('-') + '  ' + hour + ':' + min + ':' + second
}

4.獲取字元串位元組長度

/**
 * 獲取字元串位元組長度
 * @param {String}
 * @returns {Boolean}
 */
function checkLength(v) {
  var realLength = 0;
  var len = v.length;
  for (var i = 0; i < len; i++) {
    var charCode = v.charCodeAt(i);
    if (charCode >= 0 && charCode <= 128) realLength += 1;
    else realLength += 2;
  }
  return realLength;
}

5.對象克隆、深拷貝

/**
 * 對象克隆&深拷貝
 * @param obj
 * @returns {{}}
 */
function cloneObj(obj) {
  var newO = {};
  if (obj instanceof Array) {
    newO = [];
  }
  for (var key in obj) {
    var val = obj[key];
    newO[key] = typeof val === 'object' ? arguments.callee(val) : val;
  }
  return newO;
};

克隆拷貝增強版

/**
 * 對象克隆&深拷貝
 * @param obj
 * @returns {{}}
 */
function clone(obj) {
  // Handle the 3 simple types, and null or undefined
  if (null == obj || "object" != typeof obj) return obj;
  // Handle Date
  if (obj instanceof Date) {
    var copy = new Date();
    copy.setTime(obj.getTime());
    return copy;
  }
  // Handle Array
  if (obj instanceof Array) {
    var copy = [];
    for (var i = 0,
    len = obj.length; i < len; ++i) {
      copy[i] = clone(obj[i]);
    }
    return copy;
  }
  // Handle Object
  if (obj instanceof Object) {
    var copy = {};
    for (attr in obj) {
      if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]);
    }
    return copy;
  }
  throw new Error("Unable to copy obj! Its type isn't supported.");
}

測試用例:

var origin = {
  a: "text",
  b: null,
  c: undefined,
  e: {
    f: [1, 2]
  }
}

6.組織結構代碼證驗證

驗證規則:

組織機構代碼是每一個機關、社會團體、企事業單位在全國範圍內唯一的、始終不變的法定代碼標識。最新使用的組織機構代碼在1997年頒佈實施,由8位數字(或大寫拉丁字母)本體代碼和1位數字(或大寫拉丁字母)校驗碼組成。本體代碼採用系列(即分區段)順序編碼方法。校驗碼按下列公式計算:8 C9 = 11 - MOD(∑Ci * Wi,11)… (2) i = 1其中:MOD——表示求餘函數;i——表示代碼字元從左到右位置序號;Ci——表示第i位置上的代碼字元的值,採用附錄A“代碼字元集”所列字元;C9——表示校驗碼;Wi——表示第i位置上的加權因數,其數值如下表:i 1 2 3 4 5 6 7 8 Wi 3 7 9 10 5 8 4 2當MOD函數值為1(即C9 = 10)時,校驗碼用字母X表示。

驗證方法:

checkOrgCodeValid: function(el) {
  var txtval = el.value;
  var values = txtval.split("-");
  var ws = [3, 7, 9, 10, 5, 8, 4, 2];
  var str = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  var reg = /^([0-9A-Z]){8}$/;
  if (!reg.test(values[0])) {
    return false
  }
  var sum = 0;
  for (var i = 0; i < 8; i++) {
    sum += str.indexOf(values[0].charAt(i)) * ws[i];
  }
  var C9 = 11 - (sum % 11);
  var YC9 = values[1] + '';
  if (C9 == 11) {
    C9 = '0';
  } else if (C9 == 10) {
    C9 = 'X';
  } else {
    C9 = C9 + '';
  }
  return YC9 == C9;
}

7.身份證號驗證

/**
 * 驗證身份證號
 * @param el 號碼輸入input
 * @returns {boolean}
 */
function checkCardNo(el) {
  var txtval = el.value;
  var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
  return reg.test(txtval)
}

8.js正則為url添加http標識

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">  
  <title></title>
  <script>
        var html = 'http:/ / www.google.com ';
        html += '\rwww.google.com ';
        html += '\rcode.google.com ';
        html += '\rhttp: //code.google.com/hosting/search?q=label%3aPython';
        var regex = /(https?:\/\/)?(\w+\.?)+(\/[a-zA-Z0-9\?%=_\-\+\/]+)?/gi;
        alert('before replace:');
        alert(html);
        html = html.replace(regex,
            function(match, capture) {
                if (capture) {
                    return match
                } else {
                    return 'http://' + match;
                }
            });
        alert('after replace:');
        alert(html); 
    </script>
</head>
<body>  
</body>
</html>

9.URL有效性校驗方法

/**
 * URL有效性校驗
 * @param str_url
 * @returns {boolean}
 */
function isURL(str_url) { 
  // 驗證url
  var strRegex = "^((https|http|ftp|rtsp|mms)?://)" + "?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //           
  ftp的user@ + "(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP形式的URL- 199.194.52.184
  + "|" // 允許IP和DOMAIN(功能變數名稱)
  + "([0-9a-z_!~*'()-]+\.)*" // 功能變數名稱- www.
  + "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 二級功能變數名稱
  + "[a-z]{2,6})" // first level domain- .com or .museum
  + "(:[0-9]{1,4})?" // 埠- :80
  + "((/?)|" // a slash isn't required if there is no file name
  + "(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
  var re = new RegExp(strRegex);
  return re.test(str_url);
}
// 建議的正則
functionisURL(str) {
  return !! str.match(/(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/g);
}

10.自定義jsonp方法

/**
 * 自定義封裝jsonp方法
 * @param options
 */
jsonp = function(options) {
  options = options || {};
  if (!options.url || !options.callback) {
    throw new Error("參數不合法");
  }
  //創建 script 標簽並加入到頁面中
  var callbackName = ('jsonp_' + Math.random()).replace(".", "");
  var oHead = document.getElementsByTagName('head')[0];
  options.data[options.callback] = callbackName;
  var params = formatParams(options.data);
  var oS = document.createElement('script');
  oHead.appendChild(oS);
  //創建jsonp回調函數
  window[callbackName] = function(json) {
    oHead.removeChild(oS);
    clearTimeout(oS.timer);
    window[callbackName] = null;
    options.success && options.success(json);
  };
  //發送請求
  oS.src = options.url + '?' + params;
  //超時處理
  if (options.time) {
    oS.timer = setTimeout(function() {
      window[callbackName] = null;
      oHead.removeChild(oS);
      options.fail && options.fail({
        message: "超時"
      });
    },
    time);
  }
};
/**
 * 格式化參數
 * @param data
 * @returns {string}
 */
formatParams = function(data) {
  var arr = [];
  for (var name in data) {
    arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
  }
  return arr.join('&');
}

11.cookie操作

//寫cookies
setCookie = function(name, value, time) {
  var strsec = getsec(time);
  var exp = new Date();
  exp.setTime(exp.getTime() + strsec * 1);
  document.cookie = name + "=" + escape(value) + ";expires=" + exp.toGMTString();
}
//cookie操作輔助函數
getsec = function(str) {
  var str1 = str.substring(1, str.length) * 1;
  var str2 = str.substring(0, 1);
  if (str2 == "s") {
    return str1 * 1000;
  } else if (str2 == "h") {
    return str1 * 60 * 60 * 1000;
  } else if (str2 == "d") {
    return str1 * 24 * 60 * 60 * 1000;
  }
}
//讀取cookies
getCookie = function(name) {
  var arr, reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
  if (arr = document.cookie.match(reg)) return (arr[2]);
  else return null;
}

//刪除cookies
delCookie = function(name) {
  var exp = new Date();
  exp.setTime(exp.getTime() - 1);
  var cval = getCookie(name);
  if (cval != null) document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}

12.生成隨機字元串 (可指定長度)

/**
 * 生成隨機字元串(可指定長度)
 * @param len
 * @returns {string}
 */
randomString = function(len) {
  len = len || 8;
  var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';
  /****預設去掉了容易混淆的字元oOLl,9gq,Vv,Uu,I1****/
  var maxPos = $chars.length;
  var pwd = '';
  for (var i = 0; i < len; i++) {
    pwd += $chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return pwd;
}

13.瀏覽器判斷

function parseUA() {
  var u = navigator.userAgent;
  var u2 = navigator.userAgent.toLowerCase();
  return { //移動終端瀏覽器版本信息
    trident: u.indexOf('Trident') > -1,
    //IE內核
    presto: u.indexOf('Presto') > -1,
    //opera內核
    webKit: u.indexOf('AppleWebKit') > -1,
    //蘋果、谷歌內核
    gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,
    //火狐內核
    mobile: !!u.match(/AppleWebKit.*Mobile.*/),
    //是否為移動終端
    ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
    //ios終端
    android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1,
    //android終端或uc瀏覽器
    iPhone: u.indexOf('iPhone') > -1,
    //是否為iPhone或者QQHD瀏覽器
    iPad: u.indexOf('iPad') > -1,
    //是否iPad
    webApp: u.indexOf('Safari') == -1,
    //是否web應該程式,沒有頭部與底部
    iosv: u.substr(u.indexOf('iPhone OS') + 9, 3),
    weixin: u2.match(/MicroMessenger/i) == "micromessenger",
    ali: u.indexOf('AliApp') > -1,
  };
}
var ua = parseUA();
if (!ua.mobile) {
  location.href = './pc.html';
}

14.Rem移動端適配

var rem = {
  baseRem: 40,
  // 基準字型大小,按照iphone6應該為20,此處擴大2倍,便於計算
  baseWidth: 750,
  // 基準尺寸寬,此處是按照ihpone6的尺寸
  rootEle: document.getElementsByTagName("html")[0],
  initHandle: function() {
    this.setRemHandle();
    this.resizeHandle();
  },
  setRemHandle: function() {
    var clientWidth = document.documentElement.clientWidth || document.body.clientWidth;
    this.rootEle.style.fontSize = clientWidth * this.baseRem / this.baseWidth + "px";
  },
  resizeHandle: function() {
    var that = this;
    window.addEventListener("resize",
    function() {
      setTimeout(function() {
        that.setRemHandle();
      },
      300);
    });
  }
};
rem.initHandle();

15.獲取url後參數

function GetRequest() {
  var url = location.search; //獲取url中"?"符後的字串
  var theRequest = new Object();
  if (url.indexOf("?") != -1) {
    var str = url.substr(1);
    strs = str.split("&");
    for (var i = 0; i < strs.length; i++) {
      theRequest[strs[i].split("=")[0]] = (strs[i].split("=")[1]);
    }
  }
  return theRequest;
}

16.動態載入JS

function loadScript(url, callback) {
  var script = document.createElement("script");
  script.type = "text/";
  if (typeof(callback) != "undefined") {
    if (script.readyState) {
      script.onreadystatechange = function() {
        if (script.readyState == "loaded" || script.readyState == "complete") {
          script.onreadystatechange = null;
          callback();
        }
      };
    } else {
      script.onload = function() {
        callback();
      };
    }
  }
  script.src = url;
  document.body.appendChild(script);
}

17.生成隨機顏色值

function getRandomColor () {
  const rgb = []
  for (let i = 0 ; i < 3; ++i){
    let color = Math.floor(Math.random() * 256).toString(16)
    color = color.length == 1 ? '0' + color : color
    rgb.push(color)
  }
  return '#' + rgb.join('')
}

18.事件綁定與解綁

ElementClass.prototype.on = function (name, callback) {
    this.callbacks[name] = this.callbacks[name] || []
    this.callbacks[name].push(callback)
}

ElementClass.prototype.off = function (name, callback) {
    var callbacks = this.callbacks[name]
    if (callbacks && callbacks instanceof Array) {
        var index = callbacks.indexOf(callback)
        if (index !== -1) callbacks.splice(index, 1)
    }
}

ElementClass.prototype.trigger = function (name, params) {
    var callbacks = this.callbacks[name]
    if (callbacks && callbacks instanceof Array) {
        callbacks.forEach((cb) => {
            cb(params)
        })
    }
}

19.移動端音頻播放

/**
  * 移動端H5播放音樂處理,相容微信端
  * @param el 音樂Audio元素
  */
function playMusic(el) {
    var b = document.getElementById(el);

    var c = function c() {
        b.play();
        document.removeEventListener("touchstart", c, true);
    };

    b.play();
    document.addEventListener("WeixinJSBridgeReady", function () {
        c();
    }, false);
    document.addEventListener("YixinJSBridgeReady", function () {
        c();
    }, false);
    document.addEventListener("touchstart", c, true);
}

20.移動端視頻適配

<video class="video1" webkit-playsinline="true" x-webkit-airplay="true" playsinline="true" x5-video-player-type="h5" x5-video-player-fullscreen="true"  preload="auto" poster="poster圖片地址" src="視頻地址"></video>

21.Webpack+Vue-CLI實現自動全局註冊組件

// 需要 npm import --save lodash
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase'

const requireComponent = require.context(
  // 其組件目錄的相對路徑
  './components',
  // 是否查詢其子目錄
  false,
  // 匹配基礎組件文件名的正則表達式,獲取.vue結尾的文件
  /.vue$/
)


requireComponent.keys().forEach(fileName => {
  // 獲取組件配置
  const componentConfig = requireComponent(fileName)

  // 獲取組件的 PascalCase 命名
  const componentName = upperFirst(
    camelCase(
      // 剝去文件名開頭的 `./` 和結尾的擴展名
      fileName.replace(/^\.\/(.*)\.\w+$/, '$1')
    )
  )

  // 全局註冊組件
  Vue.component(
    componentName,
    // 如果這個組件選項是通過 `export default` 導出的,
    // 那麼就會優先使用 `.default`,
    // 否則回退到使用模塊的根。
    componentConfig.default || componentConfig
  )

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • :-1: Multiple commands produce '/Users/apple/Library/Developer/Xcode/DerivedData/Pic-frfhvoheijeiybfkgglgxywajidn/Build/Products/Debug-iphoneos/Pic.ap ...
  • 1.demo總結 2.第三方使用 一、demo總結 1.選擇相冊單張照片 二、第三方使用 ...
  • 此方案只能用於開發環境,線上最好設置同源策略(遇到個後端,裝你媽批) 前後端不在同一伺服器的情況下,前端要訪問後端API,可通過在vue.config.js中配置代理伺服器。 0:前提條件 1:安裝vue-lic 2:安裝axios 用於發送請求。 1:將任何未知請求轉發到代理伺服器 如: 前端地址 ...
  • 越學習越感覺自己瞭解的少,學習的知識不夠扎實,以前總是感覺自己瞭解CORS,前後臺交互遇到那個經典的錯誤信息腦海中就會想起需要後臺設置 cors 錯誤和代碼如下。 解決的方案也是隨口說來,也就是在後臺設置上如下類似的代碼, 直到這一次項目..搞得我是真的難受,這一篇文章本來想詳細寫一些 CORS的東 ...
  • 我認為,學習一門語言,主要是掌握它的思想與用途,就好比談戀愛一樣,你只要猜測到了對方的想法,就能夠知情達意。廢話不多說,我們開始今天學習的進度,加油ヾ(◍°∇°◍)ノ゙ 1. jQuery([selector[, context]]) 該函數還可以表示為 $([selector[, context] ...
  • 整體思路: 1.實現頁面佈局,設置css樣式 2.用jQuery獲取需要用到的變數 3.用jQuery為兩個按鈕綁定事件 一.頁面佈局: <style> body{ margin: 0 0 0 0; height: 1000px; width: 100%; } .d1{ position: abso ...
  • 在數組的方法中有一組用於遍曆數組的方法。有 forEach()、map()、filter()、find()、reduce()、some()、every()。 他們的共同特征是: 1. 它們都自帶遍歷(只要調用這個方法就會自動迴圈數組中的每一項) 2. 它們都不會改變原數組,調用方法後產生的結果在返回 ...
  • 使用bootstrap自帶的提示控制項,省去了不少事情 控制器或者js代碼: 控制顏色,類名是生成彈出層後的類名: 預設背景顏色 設置顏色後 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...