JS傳參技巧總結

1.隱式建立 html 標籤

<input type="hidden" name="tc_id" value="{{tc_id}}">
這種方法通常配合 ajax,上面的 value 使用了模板引擎

2.window['data']

window["name"] = "the window object";

3.使用 localStorage,cookie 等存儲

window.localStorage.setItem("name", "xiaoyueyue");
window.localStorage.getItem("name");
特色:cookie,localStorage,sessionStorage,indexDB
特性 cookie localStorage sessionStorage indexDB
數據生命週期 通常由服務器生成,能夠設置過時時間 除非被清理,不然一直存在 頁面關閉就清理 除非被清理,不然一直存在
數據存儲大小 4K 5M 5M 無限
與服務端通訊 每次都會攜帶在 header 中,對於請求性能影響 不參與 不參與 不參與

從上表能夠看到,cookie 已經不建議用於存儲。若是沒有大量數據存儲需求的話,可使用 localStoragesessionStorage 。對於不怎麼改變的數據儘可能使用 localStorage 存儲,不然能夠用 sessionStorage 存儲。html

注意點:存儲 object類型數據,此深拷貝方法會忽略掉函數和 undefined
var obj = {
  type: undefined,
  text: "xiaoyueyue",
  methord: function() {
    alert("I am an methord");
  }
};

localStorage.setItem("data", JSON.stringify(obj));
console.log(JSON.parse(localStorage.getItem("data"))); // {text: "xiaoyueyue"}

4.獲取地址欄方法

  1. 本身封裝的方法
function parseParam(url) {
  var paramArr = decodeURI(url)
      .split("?")[1]
      .split("&"),
    obj = {};
  for (var i = 0; i < paramArr.length; i++) {
    var item = paramArr[i];
    if (item.indexOf("=") != -1) {
      var tmp = item.split("=");
      obj[tmp[0]] = tmp[1];
    } else {
      obj[item] = true;
    }
  }
  return obj;
}

2.正則表達式方法ajax

function GetQueryString(name) {
  var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
  var r = window.location.search.substr(1).match(reg);
  if (r != null) return unescape(r[2]);
  return null;
}

5.標籤綁定函數傳參

<!--base-->
<button id="test1" onclick="alert(id)">test1</button>

<!--高級-->
<button
  id="test"
  name="123"
  yue="xiaoyueyue"
  friend="heizi"
  onclick="console.log(this.getAttribute('yue'),this.getAttribute('friend'))"
>
  test
</button>

this 拓展

使用 this 傳參,在使用 art-template 中琢磨出來的,不再用只傳遞一個 id 拼接成好幾個參數了!happy!正則表達式

var box = document.createElement("div");
box.innerHTML =
  "<button id='1' data-name='xiaoyueyue' data-age='25' data-friend='heizi' onclick='alertInfo(this.dataset)'>點擊</button>";
document.body.appendChild(box);

// name,age,friend
function alertInfo(data) {
  alert(
    "你們好,我是" +
      data.name +
      ", 我今年" +
      data.age +
      "歲了,個人好朋友是" +
      data.friend +
      " !"
  );
}
這裏須要注意一點:存儲的 data—含有大寫的單詞 =》這裏會統一轉化爲小寫,好比:data-orderId = 「2a34fb64a13211e8a0f00050568b2fdd」,在實際取值的時候爲 this.dataset.orderid;

event

既然可使用 this,那麼在事件當中event.target方法也是能夠的:小程序

根據 class 獲取當前的索引值,參數能夠爲 event 對象
var getIndexByClass =  function (param) {
    var element = param.classname ? param : param.target;
    var className = element.classname;
    var domArr = Array.prototype.slice.call(document.querySelectorAll('.' + className));
    for (var index = 0; index < domArr.length; index++) {
      if (domArr[index] === element) {
        return index;
      }
    }
    return -1;
  },

6.HTML5 data-* 自定義屬性

<button data-name="xiaoyueyue">點擊</button>
var btn = document.querySelector("button");
btn.onclick = function() {
  alert(this.dataset.name);
};

7.字符串傳參

單個參數

var name = "xiaoyueyue",
  age = 25;

var box = document.createElement("div");
box.innerHTML = "<button onclick=\"alertInfo('" + name + "')\">點擊</button>";
document.body.appendChild(box);

// name, age
function alertInfo(name, age, home, friend) {
  alert("我是" + name);
}

多參傳遞

var name = 'xiaoyueyue',
      age = '25',
      home = 'shanxi',
      friend = 'heizi',
      DQ = "&quot;"; // 雙引號的超文本標記語言

    var params = "&quot;" + name + "&quot;,&quot;" + age + "&quot;,&quot;" + home + "&quot;,&quot;" + friend + "&quot;";
    var params2 = DQ + name + DQ + ',' + DQ + age + DQ + ',' + DQ + home + DQ + ',' + DQ + friend + DQ;
    var box = document.createElement("div");
    box.innerHTML = "<button onclick='alertInfo(" + params + ")'>點擊</button>";
    console.log(box)
    document.body.appendChild(box);


    // name, age,home,friend
    function alertInfo(name, age, home, friend) {
      alert("我是" + name + ',' + "我今年" + age + "歲了!")

複雜傳參

var data = [
  {
    name: "xiaoyueyue",
    age: "25",
    home: "shanxi",
    friend: "heizi"
  }
];

var box = document.createElement("div"),
  html = "";

for (var i = 0; i < data.length; i++) {
  html +=
    "<button id='btn'  onclick='alertInfo(id,\"" +
    data[i].name +
    '","' +
    data[i].age +
    '","' +
    data[i].home +
    '","' +
    data[i].friend +
    "\")'>點擊</button>";
}
box.innerHTML = html;
document.body.appendChild(box);

function alertInfo(id, name, age, home, friend) {
  alert("我是 " + name + " , " + friend + " 是個人好朋友");
}

8.arguments

arguments對象是全部(非箭頭)函數中均可用的局部變量。你可使用 arguments 對象在函數中引用函數的參數。它是一個類數組的對象。微信小程序

<button
  onclick="fenpei('f233c7a290ae11e8a0f00050568b2fdd','100','0號 車用柴油(Ⅴ)')"
>
  分配
</button>
function fenpei() {
  var args = Array.prototype.slice.call(arguments);
  alert("我是" + args[2] + "油品,數量爲 " + args[1] + " 噸, id爲 " + args[0]);
}

9.form 表單

藉助form表單,ajax 傳遞序列化參數數組

// form表單序列化,摘自JS高程
function serialize(form) {
  var parts = [],
    field = null,
    i,
    len,
    j,
    optLen,
    option,
    optValue;

  for (i = 0, len = form.elements.length; i < len; i++) {
    field = form.elements[i];

    switch (field.type) {
      case "select-one":
      case "select-multiple":
        if (field.name.length) {
          for (j = 0, optLen = field.options.length; j < optLen; j++) {
            option = field.options[j];
            if (option.selected) {
              optValue = "";
              if (option.hasAttribute) {
                optValue = option.hasAttribute("value")
                  ? option.value
                  : option.text;
              } else {
                optValue = option.attributes["value"].specified
                  ? option.value
                  : option.text;
              }
              parts.push(
                encodeURIComponent(field.name) +
                  "=" +
                  encodeURIComponent(optValue)
              );
            }
          }
        }
        break;

      case undefined: //fieldset
      case "file": //file input
      case "submit": //submit button
      case "reset": //reset button
      case "button": //custom button
        break;

      case "radio": //radio button
      case "checkbox": //checkbox
        if (!field.checked) {
          break;
        }
      /* falls through */

      default:
        //don't include form fields without names
        if (field.name.length) {
          parts.push(
            encodeURIComponent(field.name) +
              "=" +
              encodeURIComponent(field.value)
          );
        }
    }
  }
  return parts.join("&");
}

栗子:緩存

<form id="formData">
  <div class="pop-info">
    <label for="ordersaleCode">訂單編號:</label>
    <input
      type="text"
      id="ordersaleCode"
      name="ordersaleCode"
      placeholder="請輸入訂單編號"
    />
  </div>
  <div class="pop-info">
    <label for="extractType">配送方式:</label>
    <select id="extractType" name="extractType" class="mySelect">
      <option value="0" selected>配送</option>
      <option value="1">自提</option>
    </select>
  </div>
</form>
<button>獲取參數</button>
document.querySelector("button").onclick = function() {
  console.log("param: " + serialize(document.getElementById("formData"))); // param: ordersaleCode=&extractType=0
};

10. 發佈訂閱處理複雜邏輯傳參

支持先訂閱後發佈,以及先發布後訂閱
  • 方法源碼
var Event = (function() {
  var clientList = {},
    pub,
    sub,
    remove;

  var cached = {};

  sub = function(key, fn) {
    if (!clientList[key]) {
      clientList[key] = [];
    }
    // 使用緩存執行的訂閱不用屢次調用執行
    cached[key + "time"] == undefined ? clientList[key].push(fn) : "";
    if (cached[key] instanceof Array && cached[key].length > 0) {
      //說明有緩存的 能夠執行
      fn.apply(null, cached[key]);
      cached[key + "time"] = 1;
    }
  };
  pub = function() {
    var key = Array.prototype.shift.call(arguments),
      fns = clientList[key];
    if (!fns || fns.length === 0) {
      //初始默認緩存
      cached[key] = Array.prototype.slice.call(arguments, 0);
      return false;
    }

    for (var i = 0, fn; (fn = fns[i++]); ) {
      // 再次發佈更新緩存中的 data 參數
      cached[key + "time"] != undefined
        ? (cached[key] = Array.prototype.slice.call(arguments, 0))
        : "";
      fn.apply(this, arguments);
    }
  };
  remove = function(key, fn) {
    var fns = clientList[key];
    // 緩存訂閱一併刪除
    var cachedFn = cached[key];
    if (!fns && !cachedFn) {
      return false;
    }
    if (!fn) {
      fns && (fns.length = 0);
      cachedFn && (cachedFn.length = 0);
    } else {
      if (cachedFn) {
        for (var m = cachedFn.length - 1; m >= 0; m--) {
          var _fn_temp = cachedFn[m];
          if (_fn_temp === fn) {
            cachedFn.splice(m, 1);
          }
        }
      }
      for (var n = fns.length - 1; n >= 0; n--) {
        var _fn = fns[n];
        if (_fn === fn) {
          fns.splice(n, 1);
        }
      }
    }
  };
  return {
    pub: pub,
    sub: sub,
    remove: remove
  };
})();

在微信小程序中使用的例子:服務器

  • 全局掛載使用
// app.js
App({
  onLaunch: function(e) {
    // 註冊 storage,這是第二條
    wx.Storage = Storage;
    // 註冊發佈訂閱模式
    wx.yue = Event;
  }
});
  • 使用實例
// 添加收貨地址頁面訂閱
 onLoad: function (options) {
        wx.yue.sub("addAddress", function (data) {
            y.setData({
                addAddress: data
            })
        })
 }
/**
 * 生命週期函數--監聽頁面隱藏
 */
 onHide: function () {
    // 取消多餘的事件訂閱
    wx.Storage.removeItem("addAddress");
},
 onUnload: function () {
    // 取消多餘的事件訂閱
    wx.yue.remove("addAddress");
}
// 傳遞地址頁面獲取好數據傳遞
wx.yue.pub("addAddress", data.info);
// 補充跳轉返回
注意:使用完成數據後要注意卸載,在頁面被關閉時操做

拓展閱讀

相關文章
相關標籤/搜索