假设容器宽度为 W ,内容宽度为 L 。(满足 L > W,我觉得 L <= W 没必要无缝滚动,你非要滚动请自行设计。) 假设容器的scrollLeft值为 x,开始,x = 0;然后 x 不停增加,一直移动到右边 x = L - W(滚不动了,x大于 L-W,也会被设置为 L-W)。 x ∈ [0, L-W] ⊂ N。
The click event fires when a pointing device button (e.g., a mouse’s primary button) is pressed and released on a single element. If the button is pressed on one element and released on a different one, the event is fired on the most specific ancestor element that contained both.
click fires after the mousedown and mouseup events, in that order.
The mouseenter event is fired when a pointing device (usually a mouse) is moved over the element that has the listener attached.
Though similar to mouseover, it differs in that it doesn’t bubble and that it isn’t sent to any descendants when the pointer is moved from one of its descendants’ physical space to its own physical space.
Callback function A callback function is a function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine or action.
粘贴一些小的知识点
打开 谷歌浏览器的 console。我们来看点东西。我这里是一句一句执行的。
没毛病。haha的 Scopes 只有 Global,我这里没有定义 t。
擦!haha的 Scopes 变了,[Script, Global]。这就是 let 搞得鬼。let 偷偷修改了作用域。(const 同理)
p.value // p 是 yield 吐出来的 {value: promise, done: false},我们取 promise。 .then(v=>{ console.log("give result to r1"); let p = rg.next(v); return p.value; }) .then(v=>{ console.log("give result to r2"); let p = rg.next(v); return p.value; })
代码写的虽然和狗屎一样,但是这次 yield 吐出了一个 promise 的值,(上此吐出来的值,我们并未在意)。我们在 then 中 调用了 next 方法,再次启动 generator,启动的时机不同。
比如我访问 https://www.aliyun.com/xx 和 https://www.aliyun.com/oo (本故事纯属虚构,如有雷同,纯属巧合!)。我本以为是这样的 C <-> S。但是实际情况可能是 C <-> P <-> S1(xx), C <-> P <-> S2(oo) 。其实我访问的是 P,它把不同种类的请求分发给了后面不同的服务器。在 C <-> P 中, 这个 P 作为一个反向代理,糊弄了 C ,让整个流程变成 C <-> P <-->Ss。单看反向代理,就是 P 的事情,它会把请求分发到一堆 Ss;而 C 是不知道的,除非 P 愿意泄露点啥。-->->->->->->->->
代理
然后就变成了 C <-> Pforward <-> Preverse <-> Ss。 C 通过 Pforward 糊弄 Preverse ,Preverse 用了一堆 Ss 反过来也在糊弄 Pforward。 C 通过 Pforward 以为自己访问了 Preverse,实际 Preverse 却把请求给了 Ss。->->->