var head = document.getElementsByTagName('head')[0] || document.body; function loadJsModule(url) { var script = document.createElement('script'); script.charset = 'utf-8'; script.type = 'text/javascript'; script.onload = script.onreadystatechange = function() { if (!this.readyState || this.readyState === 'loaded' || this.readyState === 'complete') { /* * 加載邏輯, callback爲define的回調函數, args爲全部依賴模塊的數組 * callback.apply(window, args); */ script.onload = script.onreadystatechange = null; } }; }
fastclick是將事件綁定到你傳的元素(通常是document.body) ② 在touchstart和touchend後(會手動獲取當前點擊el),若是是類click事件便手動觸發了dom元素的click事件 因此click事件在touchend便被觸發,整個響應速度就起來了,觸發實際與zepto tap同樣 既然瀏覽器有這300ms的延遲,那麼咱們來代替瀏覽器判斷,手動觸發click事件,這也是fastClick的解決方案。 // 自定義事件 var eve = new Event('自定義事件名'); el.addEventListener('自定義事件名', function(){ console.log('自定義事件') }); el.dispatchEvent(eve); // fastClick的核心代碼 FastClick.prototype.onTouchEnd = function(event){ // 一些狀態監測代碼 // 從這裏開始, if (!this.needsClick(targetElement)) { // 若是這不是一個須要使用原生click的元素,則屏蔽原生事件,避免觸發兩次click event.preventDefault(); // 觸發一次模擬的click this.sendClick(targetElement, event); } } 這裏能夠看到,FastClick在touchEnd的時候,在符合條件的狀況下,主動觸發了click事件,這樣避免了瀏覽器默認的300毫秒等待判斷。爲了防止原生的click被觸發,這裏還經過event.preventDefault()屏蔽了原生的click事件。 咱們來看看他是怎麼模擬click事件的 FastClick.prototype.sendClick = function(targetElement, event) { // 這裏是一些狀態檢查邏輯 // 建立一個鼠標事件 clickEvent = document.createEvent('MouseEvents'); // 初始化鼠標事件爲click事件 clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null); // fastclick的內部變量,用來識別click事件是原生仍是模擬 clickEvent.forwardedTouchEvent = true; // 在目標元素上觸發該鼠標事件, targetElement.dispatchEvent(clickEvent); 咱們在網上搜索fastClick,大部分都在說他解決了zepto的點擊穿透問題,他是怎麼解決的呢?就是上面最後一句,他模擬的click事件是在touchEnd獲取的真實元素上觸發的,而不是經過座標計算出來的元素。
【當margin/padding取形式爲百分比
的值時,不管是left/right,仍是top/bottom
,都是以父元素的width
爲參照物的!】javascript