Javascript 高级程序设计学习

让元素显示滚动到屏幕可视区:

el.scrollIntoView()  // 元素顶部与可视区顶部对齐
el.scrollIntoView(false)  // 元素底部与可视区底部对齐

监听右键菜单并阻止其显示,然后可以显示自定义菜单

window.addEventListener('contextmenu',function(e){e.preventDefault();console.log(789)}).

监听窗口关闭事件,弹出提示向用户再次确认

window.addEventListener('beforeunload',function(e){e.returnValue = "确定要关闭吗"})

监听url的哈希字段的改变

window.addEventListener('hashchange',function(e){console.log(e,location)})

兼容--文本框的选择文本方法

function selectText(textbox, startIndex, stopIndex) {
            if (textbox.setSelectionRange) {
                textbox.setSelectionRange(startIndex, stopIndex);
            } else if (textbox.createTextRange) {
                var range = textbox.createTextRange();
                range.collapse(true);
                range.moveStart("character", startIndex);
                range.moveEnd("character", stopIndex - startIndex);
                range.select();
            }

            textbox.focus();
        }

监听keypress事件,可以限制用户的输入(数字)

textInput.addEventListener('keypress',(e) => {
            let charCode = e.keyCode
            if(!/\d/.test(String.fromCharCode(charCode)) && charCode > 9 && !e.ctrlKey) {
                e.preventDefault();
            }
        })

实用兼容方法

var EventUtil = {
            //获得剪切板的记录
            getClipboardText: function (event) {
                var clipboardData = (event.clipboardData || window.clipboardData);
                return clipboardData.getData("text");
            },
            //设置剪切板的记录
            setClipboardText: function (event, value) {
                if (event.clipboardData) {
                    return event.clipboardData.setData("text/plain", value);
                } else if (window.clipboardData) {
                    return window.clipboardData.setData("text", value);
                }
            },
            //省略的代码
        };

分辨是否是原生JavaScript对象

一般我们判断是否是数组,会这样写:

var isArray = value instanceof Array;

以上代码要返回true,value 必须是一个数组,而且还必须与Array 构造函数在同个全局作用域中。(别忘了,Array 是window 的属性。)如果value 是在另个frame 中定义的数组,那么以上代码就会返回false。
解决上述问题:大家知道,在任何值上调用Object 原生的toString()方法,都会返回一个[object NativeConstructorName]格式的字符串。每个类在内部都有一个[[Class]]属性,这个属性中就指定了上述字符串中的构造函数名。

所以就有这样:

function isArray(value){
return Object.prototype.toString.call(value) == "[object Array]";
}

function isFunction(value){
return Object.prototype.toString.call(value) == "[object Function]";
}
function isRegExp(value){
return Object.prototype.toString.call(value) == "[object RegExp]";
}

请注意,Object.prototpye.toString()本身也可能会被修改。这
技巧假设Object.prototpye.toString()是未被修改过的原生版本。

base64编码与解码

function utf8_to_b64( str ) {
  return window.btoa(unescape(encodeURIComponent( str )));
}

function b64_to_utf8( str ) {
  return decodeURIComponent(escape(window.atob( str )));
}

dom 变化检测 MutationObserver, 短时间内的变化会合成一次去触发回调

var observer = new MutationObserver(function (mutations, observer) {
mutations.forEach(function(mutation) {
console.log(mutation);
});
});

var article = document.querySelector('article');

var options = {
'childList': true,
'attributes':true
} ;

observer.observe(article, options);

childList:子节点的变动(指新增,删除或者更改)。
attributes:属性的变动。
characterData:节点内容或节点文本的变动

subtree:布尔值,表示是否将该观察器应用于该节点的所有后代节点。
attributeOldValue:布尔值,表示观察attributes变动时,是否需要记录变动前的属性值。
characterDataOldValue:布尔值,表示观察characterData变动时,是否需要记录变动前的值。
attributeFilter:数组,表示需要观察的特定属性(比如['class','src'])。

// 保存所有没有被观察器处理的变动
var changes = mutationObserver.takeRecords();

// 停止观察
mutationObserver.disconnect();

window.matchMedia 媒体查询

matchMedia() 返回一个新的 MediaQueryList 对象,表示指定的媒体查询字符串解析后的结果。

matchMedia() 方法的值可以是任何一个 CSS @media 规则 的特性, 如 min-height, min-width, orientation 等。

window.matchMedia("(max-width:100px)")

MediaQueryList 对象有订阅接口:addListener,这样就可以根据媒体的改变去修改样式了。

元素左对齐与右对齐的设置

element.dir属性

'rtl' 右对齐 right to left

'ltr' 左对齐 left to right

winsow.ResizeObserver 监听元素的大小变化,及隐藏和显示

有这个方法的话,就不需要只能依靠监听window的resize事件去实现了

其实隐藏和显示,style.display = 'none', removeChild移除节点都能触发

用法

// 监听
const el = document.body;
const ob = new ResizeObserver((entry) => {do ....});// 注意加防抖动
ob.observe(el); // 绑定元素,可绑定多个

ob.unobserve(el); //解绑

ob.disconnect(); // 解绑所有

注意事项

  1. 调用observe绑定时,会触发一次回调;
  2. entry有2个属性,一个是rect描述触发元素的大小位置,一个是目标元素
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容