18个实用的JavaScript开发方法,提升你的开发效率

摘要:在实际开发项目中,我们会遇到很多重复的需求。为了提升工作效率,我们常常会整理很多属于自己的常用工具和功能模块代码,必要的时候,我们还会对其进行迭代更新。

在实际开发项目中,我们会遇到很多重复的需求。为了提升工作效率,我们常常会整理很多属于自己的常用工具和功能模块代码,必要的时候,我们还会对其进行迭代更新。

今天这篇文章,我们要跟大家分享的就是一些关于 JavaScript 的常用方法整理,希望这些方法能够帮助到你。


1. 实现全屏

function fullScreen() {
  const el = document.documentElement;
  const rfs = 
    el.requestFullScreen || 
    el.webkitRequestFullScreen || 
    el.mozRequestFullScreen || 
    el.msRequestFullscreen;
  
  if (typeof rfs != "undefined" && rfs) {
    rfs.call(el);
  }
}

fullScreen();


2. 退出全屏

function exitScreen() {
  if (document.exitFullscreen) { 
    document.exitFullscreen();
  } else if (document.mozCancelFullScreen) { 
    document.mozCancelFullScreen();
  } else if (document.webkitCancelFullScreen) { 
    document.webkitCancelFullScreen();
  } else if (document.msExitFullscreen) { 
    document.msExitFullscreen();
  }
}

exitScreen();


3. 页面打印

window.print();


4. 打印内容样式更改

<style>
/* 使用@media print可以调整你需要的打印样式 */
@media print {
  .noprint {
    display: none;
  }
}
</style>

<div class="print">print</div>
<div class="noprint">noprint</div>


5. 阻止关闭事件

当你需要防止用户刷新或者关闭浏览器时,可以选择触发 beforeunload 事件。部分浏览器不能自定义文本内容。

window.onbeforeunload = function() {
  return '您确定要离开haorooms博客吗?';
};


6. 屏幕录制

当你需要录制当前屏幕,并将录屏上传或下载时:

const streamPromise = navigator.mediaDevices.getDisplayMedia();

streamPromise.then(stream => {
  var recordedChunks = []; // 录制的视频数据
  var options = { mimeType: "video/webm; codecs=vp9" }; // 设置编码格式
  var mediaRecorder = new MediaRecorder(stream, options); // 初始化MediaRecorder实例

  mediaRecorder.ondataavailable = handleDataAvailable; // 设置数据可用(录屏结束)时的回调
  mediaRecorder.start();

  // 视频碎片合并
  function handleDataAvailable(event) {
    if (event.data.size > 0) {
      recordedChunks.push(event.data); // 添加数据,event.data是一个BLOB对象
      download(); // 封装成BLOB对象并下载
    }
  }

  // 文件下载
  function download() {
    var blob = new Blob(recordedChunks, {
      type: "video/webm"
    });
    // 此处可将视频上传到后端
    var url = URL.createObjectURL(blob);
    var a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    a.href = url;
    a.download = "test.webm";
    a.click();
    window.URL.revokeObjectURL(url);
  }
});


7. 判断横竖屏

function hengshuping() {
  if (window.orientation == 180 || window.orientation == 0) {
    alert("竖屏状态!");
  }
  if (window.orientation == 90 || window.orientation == -90) {
    alert("横屏状态!");
  }
}

window.addEventListener(
  "onorientationchange" in window ? "orientationchange" : "resize", 
  hengshuping, 
  false
);


8. 横竖屏样式变更

<style>
@media all and (orientation : landscape) {
  body {
    background-color: #ff0000;
  }
}

@media all and (orientation : portrait) {
  body {
    background-color: #00ff00;
  }
}
</style>


9. 标签页显隐

当你需要对标签页显示隐藏进行事件监听时:

const { hidden, visibilityChange } = (() => {
  let hidden, visibilityChange;
  
  if (typeof document.hidden !== "undefined") {
    // Opera 12.10 and Firefox 18 and later support
    hidden = "hidden";
    visibilityChange = "visibilitychange";
  } else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
  } else if (typeof document.webkitHidden !== "undefined") {
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
  }
  
  return {
    hidden,
    visibilityChange
  };
})();

const handleVisibilityChange = () => {
  console.log("当前被隐藏", document[hidden]);
};

document.addEventListener(
  visibilityChange,
  handleVisibilityChange,
  false
);


10. 本地图片预览

当你从客户端获取到一张图片但不能立刻上传到服务器,却需要预览的时候:

<div class="test">
  <input type="file" name="" id="">
  <img src="" alt="">
</div>

<script>
const getObjectURL = (file) => {
  let url = null;
  if (window.createObjectURL != undefined) { // basic
    url = window.createObjectURL(file);
  } else if (window.URL != undefined) { // webkit or chrome
    url = window.URL.createObjectURL(file);
  } else if (window.URL != undefined) { // mozilla(firefox)
    url = window.URL.createObjectURL(file);
  }
  return url;
}

document.querySelector('input').addEventListener('change', (event) => {
  document.querySelector('img').src = getObjectURL(event.target.files[0]);
});
</script>


11. 图片预加载

当你有大量图片的时候,你需要将图片进行预加载以免出现白屏的情况:

const images = [];

function preloader(args) {
  for (let i = 0, len = args.length; i < len; i++) {
    images[i] = new Image();
    images[i].src = args[i];
  }
}

preloader(['1.png', '2.jpg']);


12. 字符串脚本化

当你需要将一串字符串转换成一个 JS 脚本时(该方法有 XSS 漏洞,慎用):

const obj = eval('({ name: "jack" })');
// obj会被转换为对象{ name: "jack" }

const v = eval('obj');
// v会变成obj这个变量


13. 递归函数名解耦

当你需要写一个递归函数时,声明了一个函数名,但每次修改函数名时总会忘记修改内部的函数名。arguments.callee 代表函数名:

// 这是一个最基础的斐波那契数列
function fibonacci(n) {
  const fn = arguments.callee;
  if (n <= 1) return 1;
  return fn(n - 1) + fn(n - 2);
}


14. 隐显判断

当你需要对一个 DOM 元素判断当前是否出现在页面视图内时,可以用 IntersectionObserver:

<style>
.item {
  height: 350px;
}
</style>

<div class="container">
  <div class="item" >="1">不可见</div>
  <div class="item" >="2">不可见</div>
  <div class="item" >="3">不可见</div>
</div>

<script>
if (window?.IntersectionObserver) {
  let items = [...document.getElementsByClassName("item")]; // 解析为真数组,也可用 Array.prototype.slice.call()
  
  let io = new IntersectionObserver(
    (entries) => {
      entries.forEach((item) => {
        item.target.innerHTML =
          item.intersectionRatio === 1 // 元素显示比例,为1时完全可见,为0时完全不可见
            ? `元素完全可见`
            : `元素部分不可见`;
      });
    },
    {
      root: null,
      rootMargin: "0px 0px",
      threshold: 1, // 阀值设为1,当只有比例达到1时才触发回调函数
    }
  );

  items.forEach((item) => io.observe(item));
}
</script>


15. 元素可编辑

当你需要在某个 DOM 元素进行编辑,让它点击的时候就像一个 textarea:

<div contenteditable="true">这里是可编辑的内容</div>


16. 元素属性监听

<div id="test">test</div>
<button onclick="handleClick()">OK</button>

<script>
const el = document.getElementById("test");
let n = 1;

const observe = new MutationObserver((mutations) => {
  console.log("属性发生变化了", mutations);
});

observe.observe(el, {
  attributes: true
});

function handleClick() {
  el.setAttribute("style", "color: red");
  el.setAttribute(">, n++);
}

setTimeout(() => {
  observe.disconnect(); // 停止监听
}, 5000);
</script>


17. 打印 DOM 元素

当你需要在开发过程中打印 DOM 元素时,使用 console.log 往往只会打印出整个 DOM 元素,而无法查看该 DOM 元素的内部属性。可以尝试使用 console.dir:

console.dir(document.body);


18. 激活应用

当你在移动端开发时,需要打开其他应用。以下方法也可以通过 location.href 赋值操作:

<a href="tel:12345678910">电话</a>

<!-- Android短信 -->
<a href="sms:12345678910,12345678911?body=你好">android短信</a>

<!-- iOS短信 -->
<a href="sms:/open?addresses=12345678910,12345678911&body=你好">ios短信</a>

<a href="wx://">微信</a>

以上就是我们在开发中经常会使用的 18 个开发方法,希望这些方法能够帮助到你。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_13428