摘要:禁止用戶選擇文字在一些應用場合,我們不希望用戶能夠選擇文字。在下使用透明效果雖然已經停止對的技術支持了,然而做前端的還得被它惡心一段時間,有些兼容性的問題是我們仍要面對滴。但是,前端界被虐了這么多年,解決問題的方法總是有的。
禁止用戶選擇文字
在一些應用場合,我們不希望用戶能夠選擇文字。比如在拖動交互中,如果用戶能選擇元素內部的文字,也就意味著能拖動它們,這樣就會干擾對元素的拖動、影響拖動的效果;再如一些網站也會簡單地通過禁止用戶選擇文字以防止用戶復制站內文字(只能騙騙小白而已,不知道我們都會F12嗎<( ̄︶ ̄)>)。
如何實現呢?可以采用CSS的user-select屬性,不過這個屬性是非標準的,所以加前綴就少不了了:
.notSelect { -moz-user-select: none; /*火狐*/ -webkit-user-select: none; /*webkit瀏覽器*/ -ms-user-select: none; /*IE10*/ user-select: none; }
在要禁止文字選擇的區域加上上面這個類即可,要全局禁用就加到body上咯。如果要兼容老舊IE,則應該設置元素的onselectstart屬性,可以使用如下js:
element.onselectstart = function() { return false; };安全地使用insertBefore()方法
Node.insertBefore()方法可不止能用來插入節點到指定節點前面,其實你想添加到哪里都可以。因為它的第二個參數既可以是參考的兄弟節點,還可以是null,傳入null的效果就是把節點插入到最后,相當于實現了Node.appendChild()。所以,我們把它當成一個添加子節點的全能方法。
但是如果第二個參數不是調用該方法的節點的一個有效子節點、也不是null,會有什么問題呢?我們來驗證一下:
這里ul.children[3]并不存在,直接訪問的結果是undefined,但是執行上面的代碼卻并沒有錯誤發生(用的chrome),反而直接把新節點插入了最后,和第二個參數直接傳null的效果一樣。看來瀏覽器在實現insertBefore時是有做了容錯的,如果第二個參數不是有效的DOM節點也會將其當成null處理。
但是現實總是殘酷的,指望瀏覽器來給我們處理錯誤并不靠譜,比如上面提到的容錯在IE8以下的瀏覽器是沒有滴,如果你在IE8運行上述代碼,直接就給你報錯了。所以為了你的代碼安全運行,一旦你不能保證你要傳給insertBefore的第二個參數的是一個有效的節點,那就老實寫成兄弟節點 || null的形式吧,手動消滅出錯的機會。
在IE8下使用透明效果雖然ms已經停止對IE8的技術支持了,然而做前端的還得被它惡心一段時間,有些兼容性的問題是我們仍要面對滴。如果你用opacity和rgba擼了一個有透明效果的頁面,放到IE8-下一看,乖乖,一點朦朧的美感都沒有了。。。
但是,前端界被IE虐了這么多年,解決問題的方法總是有的。我們可以使用IE獨有的DX濾鏡來解決透明效果的問題,這里以opacity和在背景使用rgba顏色為例,我們都可以找到替代的方法:
opacity: x ---> filter: progid:DXImageTransform.Microsoft.Alpha(opacity=100*x); background: rgba(0,0,0,x); ---> filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#y000000,endColorstr=#y000000); /* 其中y=255*x(十六進制),y后面的六位是十六進制顏色 */
這里要注意兩點,一是用于背景色透明的方法似乎只能用于塊級元素,對行內元素并沒有效果。二是由于IE9同時支持標準的透明和濾鏡,所以上面的代碼在IE9中可能會有沖突,同時為了避免和其他瀏覽器的沖突,上面的代碼最好只用作IE9以下瀏覽器的hack。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78773.html
閱讀 2141·2023-04-25 18:49
閱讀 1846·2019-08-30 14:02
閱讀 2646·2019-08-29 17:24
閱讀 3328·2019-08-28 18:10
閱讀 2929·2019-08-28 18:03
閱讀 492·2019-08-26 12:01
閱讀 3312·2019-08-26 11:31
閱讀 1424·2019-08-26 10:29