鍍金池/ 問(wèn)答/ HTML問(wèn)答
冷咖啡 回答
  1. debouncethrottle是目前用得最廣泛的,具體可見(jiàn)樓上的一堆收藏;
  2. 想要確保邏輯上不會(huì)有同時(shí)提交的請(qǐng)求,npm搜“mutex”也有很多;
  3. 或者我也寫(xiě)了一個(gè)簡(jiǎn)易版的,用下面的函數(shù)包裹點(diǎn)擊回調(diào),如果前一次請(qǐng)求尚未結(jié)束,新請(qǐng)求會(huì)和舊請(qǐng)求一起返回。這樣的話回調(diào)要返回Promise

    const debounceAsync = originalFunction => {
      let currentExcution = null;
      const wrappedFunction = async function () {
        // 1. locked => return lock
        if (currentExcution) return currentExcution;
    
        // 2. released => apply
        currentExcution = originalFunction.apply(this, arguments);
        try {
          return await currentExcution;
        }
        finally {
          currentExcution = null;
        }
      };
      return wrappedFunction;
    };

    用法

    const sleep = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms));
    
    const debounceAsync_UNIT_TEST = async () => {
      const goodnight = debounceAsync(sleep);
      for (let i = 0; i < 8; i++) {
        goodnight(5000).then(() => console.log(Date()));
        await sleep(500);
      }
      console.warn('Expected output: 8 identical datetime');
    };

    https://segmentfault.com/a/11...

乞許 回答

History API了解一下

https://developer.mozilla.org...

向?yàn)g覽器歷史添加一個(gè)狀態(tài)history.pushState

https://developer.mozilla.org...

款爺 回答
wait for a server to send response headers (and start the response body) before aborting the request.

5秒是響應(yīng)完成5秒還是響應(yīng)開(kāi)始時(shí)已經(jīng)5秒
timeout只是接收body前是否超時(shí),開(kāi)始接收body的那一刻起timeout就不管了。

心沉 回答

你在退出登錄的時(shí)候,先在前端把token清空, 再發(fā)送請(qǐng)求

怣人 回答

給你一個(gè)思路,不知道get沒(méi)get你的意思

首先用js對(duì)圖片寬高進(jìn)行縮放,這個(gè)比較容易。

然后用很多種方式可以水平垂直居中;

margin-left: 50%;
margin-top: 50%;
transform: translate(-50%, -50%)

或者在 flex 內(nèi)部

margin:auto

礙你眼 回答

其實(shí)更好的方法是你建立一個(gè)內(nèi)部數(shù)據(jù)集,對(duì)左邊每個(gè)標(biāo)題元素有一個(gè)穩(wěn)定(全局唯一的id,且不受過(guò)濾等影響),然后根據(jù)點(diǎn)擊查詢(xún)到這個(gè)id用于顯示右邊數(shù)據(jù)。
就是想辦法維護(hù)一個(gè) index 和 id的對(duì)應(yīng)表就可以查詢(xún)到正確數(shù)據(jù)了。

厭遇 回答
  1. 代碼第九行不要使用in,in用于判斷一個(gè)對(duì)象有沒(méi)有一個(gè)屬性,不能判斷一個(gè)數(shù)組是否包含某個(gè)元素,使用includes代替;
  2. 代碼第10行使用str = str.replace重新給str賦值;
function rot13 (str) {
  var empty = [];
  for (var i = 0; i < str.length; i++) {
    empty.push(str.charCodeAt(i))
  }
  var left = empty.filter(function (x) {return x >= 65 && x <= 77})
  var right = empty.filter(function (y) {return y >= 78 && y <= 90})
  for (var j = 0; j < str.length; j++) {
    if (left.includes(str.charCodeAt(j))) { // 使用includes
      str = str.replace(str[j], String.fromCharCode(str.charCodeAt(j) + 13)) // 重新賦值
    }
  }
  return str
}
鐧簞噯 回答

也可以考慮將父元素設(shè)置為display: table-cell; text-align: center

陌南塵 回答

從我這邊看,返回的是到 https://segmentfault.com/ 的 302。

失心人 回答

是不是外部有容器沒(méi)有設(shè)置高度?可以將外部容器都設(shè)置高度試試

孤影 回答

DMO加載過(guò)程:

網(wǎng)頁(yè)文檔加載都是按順序執(zhí)行的。一般瀏覽器渲染操作順序大致是一下幾個(gè)步驟:

1.解析HTML結(jié)構(gòu)

2.加載外部腳本和樣式表文件

3.解析并執(zhí)行腳本代碼 ------此處是在外部調(diào)用window.xxx的地方

4.構(gòu)造HTML DOM模型------此處是ready函數(shù)執(zhí)行的地方,也就是說(shuō)ready函數(shù)執(zhí)行之前,window.xxx已經(jīng)被調(diào)用,所以會(huì)報(bào)錯(cuò)

5.加載圖片等外部文件

6.頁(yè)面加載完畢

帥到炸 回答

不太清楚,你有新的發(fā)現(xiàn)嗎?

你是對(duì)js的引用類(lèi)型理解不充分

console.log(document.createElement("script")===document.createElement("script"))

你運(yùn)行一下上面的代碼,看看結(jié)果
還有

ret=fn.apply(this,arguments)

相當(dāng)于

ret=document.createElement("script");

ret=(function(){
    return document.createElement("script");
}).apply(this,arguments)

ret=window.(function(arguments){
return document.createElement("script");
})=document.createElement("script");

是只有訪問(wèn)一個(gè)未定義的變量時(shí),才會(huì)去window對(duì)象上面找

createElement()的調(diào)用方式如下:

React.createElement(
  type,
  [props],
  [...children]
)

綁定事件寫(xiě)在[props]中,例如:

var target = React.createElement('button', {
  onClick: () => { alert('lol') },
}, 'Click me');

ReactDOM.render(
        target,
        document.getElementById('root')
);

DEMO:
https://codepen.io/CodingMonk...