常用的前端JavaScript方法封装,字节跳动大神讲座

function myChildren(e) {

var children = e.childNodes,

arr = [],

len = children.length;

for (var i = 0; i < len; i++) {

if (children[i].nodeType === 1) {

arr.push(children[i])

}

}

return arr;

}

11、判断元素有没有子元素

=============

function hasChildren(e) {

var children = e.childNodes,

len = children.length;

for (var i = 0; i < len; i++) {

if (children[i].nodeType === 1) {

return true;

}

}

return false;

}

12、我一个元素插入到另一个元素的后面

===================

Element.prototype.insertAfter = function (target, elen) {

var nextElen = elen.nextElenmentSibling;

if (nextElen == null) {

this.appendChild(target);

} else {

this.insertBefore(target, nextElen);

}

}

13、返回当前的时间(年月日时分秒)

==================

function getDateTime() {

var date = new Date(),

year = date.getFullYear(),

month = date.getMonth() + 1,

day = date.getDate(),

hour = date.getHours() + 1,

minute = date.getMinutes(),

second = date.getSeconds();

month = checkTime(month);

day = checkTime(day);

hour = checkTime(hour);

minute = checkTime(minute);

second = checkTime(second);

function checkTime(i) {

if (i < 10) {

i = “0” + i;

}

return i;

}

return “” + year + “年” + month + “月” + day + “日” + hour + “时” + minute + “分” + second + “秒”

}

14、获得滚动条的滚动距离

=============

function getScrollOffset() {

if (window.pageXOffset) {

return {

x: window.pageXOffset,

y: window.pageYOffset

}

} else {

return {

x: document.body.scrollLeft + document.documentElement.scrollLeft,

y: document.body.scrollTop + document.documentElement.scrollTop

}

}

}

15、获得视口的尺寸

==========

function getViewportOffset() {

if (window.innerWidth) {

return {

w: window.innerWidth,

h: window.innerHeight

}

} else {

// ie8及其以下

if (document.compatMode === “BackCompat”) {

// 怪异模式

return {

w: document.body.clientWidth,

h: document.body.clientHeight

}

} else {

// 标准模式

return {

w: document.documentElement.clientWidth,

h: document.documentElement.clientHeight

}

}

}

}

16、获取任一元素的任意属性

==============

function getStyle(elem, prop) {

return window.getComputedStyle ? window.getComputedStyle(elem, null)[prop] : elem.currentStyle[prop]

}

17、绑定事件的兼容代码

============

function addEvent(elem, type, handle) {

if (elem.addEventListener) { //非ie和非ie9

elem.addEventListener(type, handle, false);

} else if (elem.attachEvent) { //ie6到ie8

elem.attachEvent(‘on’ + type, function () {

handle.call(elem);

})

} else {

elem[‘on’ + type] = handle;

}

}

18、解绑事件

=======

function removeEvent(elem, type, handle) {

if (elem.removeEventListener) { //非ie和非ie9

elem.removeEventListener(type, handle, false);

} else if (elem.detachEvent) { //ie6到ie8

elem.detachEvent(‘on’ + type, handle);

} else {

elem[‘on’ + type] = null;

}

}

19、取消冒泡的兼容代码

============

function stopBubble(e) {

if (e && e.stopPropagation) {

e.stopPropagation();

} else {

window.event.cancelBubble = true;

}

}

20、检验字符串是否是回文

=============

function isPalina(str) {

if (Object.prototype.toString.call(str) !== ‘[object String]’) {

return false;

}

var len = str.length;

for (var i = 0; i < len / 2; i++) {

if (str[i] != str[len - 1 - i]) {

return false;

}

}

return true;

}

21、检验字符串是否是回文

=============

function isPalindrome(str) {

str = str.replace(/\W/g, ‘’).toLowerCase();

console.log(str)

return (str == str.split(‘’).reverse().join(‘’))

}

22、兼容getElementsByClassName方法

=============================

Element.prototype.getElementsByClassName = Document.prototype.getElementsByClassName = function (_className) {

var allDomArray = document.getElementsByTagName(‘*’);

var lastDomArray = [];

function trimSpace(strClass) {

var reg = /\s+/g;

return strClass.replace(reg, ’ ').trim()

}

for (var i = 0; i < allDomArray.length; i++) {

var classArray = trimSpace(allDomArray[i].className).split(’ ');

for (var j = 0; j < classArray.length; j++) {

if (classArray[j] == _className) {

lastDomArray.push(allDomArray[i]);

break;

}

}

}

return lastDomArray;

}

23、运动函数

=======

function animate(obj, json, callback) {

clearInterval(obj.timer);

var speed,

current;

obj.timer = setInterval(function () {

var lock = true;

for (var prop in json) {

if (prop == ‘opacity’) {

current = parseFloat(window.getComputedStyle(obj, null)[prop]) * 100;

} else {

current = parseInt(window.getComputedStyle(obj, null)[prop]);

}

speed = (json[prop] - current) / 7;

speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

if (prop == ‘opacity’) {

obj.style[prop] = (current + speed) / 100;

} else {

obj.style[prop] = current + speed + ‘px’;

}

if (current != json[prop]) {

lock = false;

}

}

if (lock) {

clearInterval(obj.timer);

typeof callback == ‘function’ ? callback() : ‘’;

}

}, 30)

}

24、弹性运动

=======

function ElasticMovement(obj, target) {

clearInterval(obj.timer);

var iSpeed = 40,

a, u = 0.8;

obj.timer = setInterval(function () {

a = (target - obj.offsetLeft) / 8;

iSpeed = iSpeed + a;

iSpeed = iSpeed * u;

if (Math.abs(iSpeed) <= 1 && Math.abs(a) <= 1) {

console.log(‘over’)

clearInterval(obj.timer);

obj.style.left = target + ‘px’;

} else {

obj.style.left = obj.offsetLeft + iSpeed + ‘px’;

}

}, 30);

}

25、封装自己的forEach方法

=================

Array.prototype.myForEach = function (func, obj) {

var len = this.length;

var _this = arguments[1] ? arguments[1] : window;

// var _this=arguments[1]||window;

for (var i = 0; i < len; i++) {

func.call(_this, this[i], i, this)

}

}

26、封装自己的filter方法

================

Array.prototype.myFilter = function (func, obj) {

var len = this.length;

var arr = [];

var _this = arguments[1] || window;

for (var i = 0; i < len; i++) {

func.call(_this, this[i], i, this) && arr.push(this[i]);

}

return arr;

}

27、数组map方法

==========

Array.prototype.myMap = function (func) {

var arr = [];

var len = this.length;

var _this = arguments[1] || window;

for (var i = 0; i < len; i++) {

arr.push(func.call(_this, this[i], i, this));

}

return arr;

}

28、数组every方法

============

Array.prototype.myEvery = function (func) {

var flag = true;

var len = this.length;

var _this = arguments[1] || window;

for (var i = 0; i < len; i++) {

if (func.apply(_this, [this[i], i, this]) == false) {

flag = false;

break;

}

}

return flag;

}

29、数组reduce方法

=============

Array.prototype.myReduce = function (func, initialValue) {

var len = this.length,

nextValue,

i;

if (!initialValue) {

// 没有传第二个参数

nextValue = this[0];

i = 1;

} else {

// 传了第二个参数

nextValue = initialValue;

i = 0;

}

for (; i < len; i++) {

nextValue = func(nextValue, this[i], i, this);

}

return nextValue;

}

30、获取url中的参数

============

function getWindonHref() {

var sHref = window.location.href;

var args = sHref.split(‘?’);

if (args[0] === sHref) {

return ‘’;

}

var hrefarr = args[1].split(‘#’)[0].split(‘&’);

var obj = {};

for (var i = 0; i < hrefarr.length; i++) {

hrefarr[i] = hrefarr[i].split(‘=’);

obj[hrefarr[i][0]] = hrefarr[i][1];

}

return obj;

}

31、数组排序

=======

// 快排 [left] + min + [right]

function quickArr(arr) {

if (arr.length <= 1) {

return arr;

}

var left = [],

right = [];

var pIndex = Math.floor(arr.length / 2);

var p = arr.splice(pIndex, 1)[0];

for (var i = 0; i < arr.length; i++) {

if (arr[i] <= p) {

left.push(arr[i]);

} else {

right.push(arr[i]);

}

}

// 递归

return quickArr(left).concat([p], quickArr(right));

}

// 冒泡

function bubbleSort(arr) {

for (var i = 0; i < arr.length - 1; i++) {

for (var j = i + 1; j < arr.length; j++) {

if (arr[i] > arr[j]) {

var temp = arr[i];

arr[i] = arr[j];

arr[j] = temp;

}

}

}

return arr;

}

function bubbleSort(arr) {

var len = arr.length;

for (var i = 0; i < len - 1; i++) {

for (var j = 0; j < len - 1 - i; j++) {

if (arr[j] > arr[j + 1]) {

var temp = arr[j];

arr[j] = arr[j + 1];

arr[j + 1] = temp;

}

}

}

return arr;

}

32、遍历Dom树

=========

// 给定页面上的DOM元素,将访问元素本身及其所有后代(不仅仅是它的直接子元素)

// 对于每个访问的元素,函数讲元素传递给提供的回调函数

function traverse(element, callback) {

callback(element);

var list = element.children;

for (var i = 0; i < list.length; i++) {

traverse(list[i], callback);

}

}

33、原生js封装ajax

=============

function ajax(method, url, callback, data, flag) {

var xhr;

flag = flag || true;

method = method.toUpperCase();

if (window.XMLHttpRequest) {

xhr = new XMLHttpRequest();

} else {

xhr = new ActiveXObject(‘Microsoft.XMLHttp’);

}

xhr.onreadystatechange = function () {

if (xhr.readyState == 4 && xhr.status == 200) {

console.log(2)

callback(xhr.responseText);

}

}

if (method == ‘GET’) {

var date = new Date(),

timer = date.getTime();

xhr.open(‘GET’, url + ‘?’ + data + ‘&timer’ + timer, flag);

xhr.send()

} else if (method == ‘POST’) {

xhr.open(‘POST’, url, flag);

xhr.setRequestHeader(‘Content-Type’, ‘application/x-www-form-urlencoded’);

xhr.send(data);

}

}

34、异步加载script

=============

function loadScript(url, callback) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

文末

从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。

个人将这段时间所学的知识,分为三个阶段:

第一阶段:HTML&CSS&JavaScript基础

第二阶段:移动端开发技术

第三阶段:前端常用框架

  • 推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;

  • 大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

9io2HrH-1712766447304)]
[外链图片转存中…(img-DM1V1xFq-1712766447304)]
[外链图片转存中…(img-lykTUuJQ-1712766447305)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-ftsbU4GH-1712766447305)]

文末

从转行到现在,差不多两年的时间,虽不能和大佬相比,但也是学了很多东西。我个人在学习的过程中,习惯简单做做笔记,方便自己复习的时候能够快速理解,现在将自己的笔记分享出来,和大家共同学习。

个人将这段时间所学的知识,分为三个阶段:

第一阶段:HTML&CSS&JavaScript基础

第二阶段:移动端开发技术

第三阶段:前端常用框架

  • 推荐学习方式:针对某个知识点,可以先简单过一下我的笔记,如果理解,那是最好,可以帮助快速解决问题;

  • 大厂的面试难在,针对一个基础知识点,比如JS的事件循环机制,不会上来就问概念,而是换个角度,从题目入手,看你是否真正掌握。所以对于概念的理解真的很重要。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-shl5KqJb-1712766447305)]

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值