你可能不再需要JQUERY

You (Might) Don't Need jQuery

Posted in Javascript onMarch 09, 2021

Query Selector

常用的 class、id、属性 选择器都可以使用 document.querySelector 或 document.querySelectorAll 替代。区别是

  • document.querySelector 返回第一个匹配的 Element
  • document.querySelectorAll 返回所有匹配的 Element 组成的 NodeList。它可以通过 [].slice.call() 把它转成 Array
  • 如果匹配不到任何 Element,jQuery 返回空数组 [],但 document.querySelector 返回 null,注意空指针异常。当找不到时,也可以使用 || 设置默认的值,如 document.querySelectorAll(selector) || []

 

注意:document.querySelector 和 document.querySelectorAll 性能很差。如果想提高性能,尽量使用 document.getElementByIddocument.getElementsByClassName 或 document.getElementsByTagName

 

选择器查询

// jQuery
$('selector');

// Native
document.querySelectorAll('selector');

 

class 查询

// jQuery
$('.class');

// Native
document.querySelectorAll('.class');

// or
document.getElementsByClassName('class');

 

id 查询

// jQuery
$('#id');

// Native
document.querySelector('#id');

// or
document.getElementById('id');

 

属性查询

// jQuery
$('a[target=_blank]');

// Native
document.querySelectorAll('a[target=_blank]');

 

后代查询

$el.find('li');

// Native
el.querySelectorAll('li');

 

兄弟元素

// jQuery
$el.siblings();

// Native - latest, Edge13+
[...el.parentNode.children].filter((child) =>
  child !== el
);
// Native (alternative) - latest, Edge13+
Array.from(el.parentNode.children).filter((child) =>
  child !== el
);
// Native - IE10+
Array.prototype.filter.call(el.parentNode.children, (child) =>
  child !== el
);

 

上一个元素

// jQuery
$el.prev();

// Native
el.previousElementSibling;

 

下一个元素

// next
$el.next();

// Native
el.nextElementSibling;

 

Closest,获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上

// jQuery
$el.closest(queryString);

// Native - Only latest, NO IE
el.closest(selector);

// Native - IE10+
function closest(el, selector) {
  const matchesSelector = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector;

  while (el) {
    if (matchesSelector.call(el, selector)) {
      return el;
    } else {
      el = el.parentElement;
    }
  }
  return null;
}

 

Parents Until,获取当前每一个匹配元素集的祖先,不包括匹配元素的本身。

// jQuery
$el.parentsUntil(selector, filter);

// Native
function parentsUntil(el, selector, filter) {
  const result = [];
  const matchesSelector = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector;

  // match start from parent
  el = el.parentElement;
  while (el && !matchesSelector.call(el, selector)) {
    if (!filter) {
      result.push(el);
    } else {
      if (matchesSelector.call(el, filter)) {
        result.push(el);
      }
    }
    el = el.parentElement;
  }
  return result;
}

 

Input / Textarea

// jQuery
$('#my-input').val();

// Native
document.querySelector('#my-input').value;

 

获取 e.currentTarget 在 .radio 中的数组索引

// jQuery
$('.radio').index(e.currentTarget);

// Native
Array.prototype.indexOf.call(document.querySelectorAll('.radio'), e.currentTarget);

 

Iframe Contents, jQuery 对象的 iframe contents() 返回的是 iframe 内的 document

Iframe contents

// jQuery
$iframe.contents();

// Native
iframe.contentDocument;

Iframe Query

// jQuery
$iframe.contents().find('.css');

// Native
iframe.contentDocument.querySelectorAll('.css');

 

获取 body

// jQuery
$('body');

// Native
document.body;

 

获取或设置属性

// jQuery
$el.attr('foo');

// Native
el.getAttribute('foo');

 

设置属性

// jQuery, note that this works in memory without change the DOM
$el.attr('foo', 'bar');

// Native
el.setAttribute('foo', 'bar');

 

获取 data- 属性

// jQuery
$el.data('foo');

// Native (use `getAttribute`)
el.getAttribute('data-foo');

// Native (use `dataset` if only need to support IE 11+)
el.dataset['foo'];

 

CSS & Style

Get style

// jQuery
$el.css("color");

// Native
// 注意:此处为了解决当 style 值为 auto 时,返回 auto 的问题
const win = el.ownerDocument.defaultView;

// null 的意思是不返回伪类元素
win.getComputedStyle(el, null).color;

 

Set style

// jQuery
$el.css({ color: "#ff0011" });

// Native
el.style.color = '#ff0011';

 

Add class

// jQuery
$el.addClass(className);

// Native
el.classList.add(className);

 

Remove class

// jQuery
$el.removeClass(className);

// Native
el.classList.remove(className);

 

has class

// jQuery
$el.hasClass(className);

// Native
el.classList.contains(className);

 

Toggle class

// jQuery
$el.toggleClass(className);

// Native
el.classList.toggle(className);

 

Window height

// window height
$(window).height();

// 不含 scrollbar,与 jQuery 行为一致
window.document.documentElement.clientHeight;

// 含 scrollbar
window.innerHeight;

 

Document height

// jQuery
$(document).height();

// Native
const body = document.body;
const html = document.documentElement;
const height = Math.max(
  body.offsetHeight,
  body.scrollHeight,
  html.clientHeight,
  html.offsetHeight,
  html.scrollHeight
);

 

Element height

// jQuery
$el.height();

// Native
function getHeight(el) {
  const styles = this.getComputedStyle(el);
  const height = el.offsetHeight;
  const borderTopWidth = parseFloat(styles.borderTopWidth);
  const borderBottomWidth = parseFloat(styles.borderBottomWidth);
  const paddingTop = parseFloat(styles.paddingTop);
  const paddingBottom = parseFloat(styles.paddingBottom);
  return height - borderBottomWidth - borderTopWidth - paddingTop - paddingBottom;
}

// 精确到整数(border-box 时为 height - border 值,content-box 时为 height + padding 值)
el.clientHeight;

// 精确到小数(border-box 时为 height 值,content-box 时为 height + padding + border 值)
el.getBoundingClientRect().height;

 

Position

// jQuery
$el.position();

// Native
{ left: el.offsetLeft, top: el.offsetTop }

 

Offset

// jQuery
$el.offset();

// Native
function getOffset (el) {
  const box = el.getBoundingClientRect();

  return {
    top: box.top + window.pageYOffset - document.documentElement.clientTop,
    left: box.left + window.pageXOffset - document.documentElement.clientLeft
  }
}

 

Scroll Top,获取元素滚动条垂直位置。

// jQuery
$(window).scrollTop();

// Native
(document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop;

 

DOM Manipulation

Remove,从 DOM 中移除元素。

// jQuery
$el.remove();

// Native
el.parentNode.removeChild(el);

// Native - Only latest, NO IE
el.remove();

 

Get text,返回指定元素及其后代的文本内容。

// jQuery
$el.text();

// Native
el.textContent;

 

Set text,设置元素的文本内容。

// jQuery
$el.text(string);

// Native
el.textContent = string;

 

Get HTML

// jQuery
$el.html();

// Native
el.innerHTML;

 

Set HTML

// jQuery
$el.html(htmlString);

// Native
el.innerHTML = htmlString;

 

Append 插入到子节点的末尾

// jQuery
$el.append("<div id='container'>hello</div>");

// Native (HTML string)
el.insertAdjacentHTML('beforeend', '<div id="container">Hello World</div>');

// Native (Element)
el.appendChild(newEl);

 

Prepend

// jQuery
$el.prepend("<div id='container'>hello</div>");

// Native (HTML string)
el.insertAdjacentHTML('afterbegin', '<div id="container">Hello World</div>');

// Native (Element)
el.insertBefore(newEl, el.firstChild);

 

insertBefore,在选中元素前插入新节点

// jQuery
$newEl.insertBefore(queryString);

// Native (HTML string)
el.insertAdjacentHTML('beforebegin ', '<div id="container">Hello World</div>');

// Native (Element)
const el = document.querySelector(selector);
if (el.parentNode) {
  el.parentNode.insertBefore(newEl, el);
}

 

insertAfter,在选中元素后插入新节点

// jQuery
$newEl.insertAfter(queryString);

// Native (HTML string)
el.insertAdjacentHTML('afterend', '<div id="container">Hello World</div>');

// Native (Element)
const el = document.querySelector(selector);
if (el.parentNode) {
  el.parentNode.insertBefore(newEl, el.nextSibling);
}

 

is,如果匹配给定的选择器,返回true

// jQuery
$el.is(selector);

// Native
el.matches(selector);

 

clone,深拷贝被选元素。(生成被选元素的副本,包含子节点、文本和属性。)

//jQuery
$el.clone();

//Native
//深拷贝添加参数'true'
el.cloneNode();

 

empty,移除所有子节点

//jQuery
$el.empty();

//Native
el.innerHTML = '';

 

wrap,把每个被选元素放置在指定的HTML结构中。

//jQuery
$(".inner").wrap('<div class="wrapper"></div>');

//Native
Array.prototype.forEach.call(document.querySelector('.inner'), (el) => {
  const wrapper = document.createElement('div');
  wrapper.className = 'wrapper';
  el.parentNode.insertBefore(wrapper, el);
  el.parentNode.removeChild(el);
  wrapper.appendChild(el);
});

 

unwrap,移除被选元素的父元素的DOM结构

// jQuery
$('.inner').unwrap();

// Native
Array.prototype.forEach.call(document.querySelectorAll('.inner'), (el) => {
      let elParentNode = el.parentNode

      if(elParentNode !== document.body) {
          elParentNode.parentNode.insertBefore(el, elParentNode)
          elParentNode.parentNode.removeChild(elParentNode)
      }
});

 

replaceWith,用指定的元素替换被选的元素

//jQuery
$('.inner').replaceWith('<div class="outer"></div>');

//Native
Array.prototype.forEach.call(document.querySelectorAll('.inner'),(el) => {
  const outer = document.createElement("div");
  outer.className = "outer";
  el.parentNode.insertBefore(outer, el);
  el.parentNode.removeChild(el);
});

 

simple parse,解析 HTML/SVG/XML 字符串

// jQuery
$('<ol>
  <li>a</li>
  <li>b</li>
</ol>
<ol>
  <li>c</li>
  <li>d</li>
</ol>');

// Native
range = document.createRange();
parse = range.createContextualFragment.bind(range);

parse('<ol>
  <li>a</li>
  <li>b</li>
</ol>
<ol>
  <li>c</li>
  <li>d</li>
</ol>');

 

Ajax

Fetch API 是用于替换 XMLHttpRequest 处理 ajax 的新标准,Chrome 和 Firefox 均支持,旧浏览器可以使用 polyfills 提供支持。

IE9+ 请使用 github/fetch,IE8+ 请使用 fetch-ie8,JSONP 请使用 fetch-jsonp。

 

从服务器读取数据并替换匹配元素的内容。

// jQuery
$(selector).load(url, completeCallback)

// Native
fetch(url).then(data => data.text()).then(data => {
  document.querySelector(selector).innerHTML = data
}).then(completeCallback)

 

Events

Document ready by DOMContentLoaded

// jQuery
$(document).ready(eventHandler);

// Native
// 检测 DOMContentLoaded 是否已完成
if (document.readyState !== 'loading') {
  eventHandler();
} else {
  document.addEventListener('DOMContentLoaded', eventHandler);
}

 

使用 on 绑定事件

// jQuery
$el.on(eventName, eventHandler);

// Native
el.addEventListener(eventName, eventHandler);

 

使用 off 解绑事件

// jQuery
$el.off(eventName, eventHandler);

// Native
el.removeEventListener(eventName, eventHandler);

 

Trigger

// jQuery
$(el).trigger('custom-event', {key1: 'data'});

// Native
if (window.CustomEvent) {
  const event = new CustomEvent('custom-event', {detail: {key1: 'data'}});
} else {
  const event = document.createEvent('CustomEvent');
  event.initCustomEvent('custom-event', true, true, {key1: 'data'});
}

el.dispatchEvent(event);

 

Utilities

大部分实用工具都能在 native API 中找到. 其他高级功能可以选用专注于该领域的稳定性和性能都更好的库来代替

 

isArray,检测参数是不是数组。

// jQuery
$.isArray(range);

// Native
Array.isArray(range);

 

isWindow,检测参数是不是 window。

// jQuery
$.isWindow(obj);

// Native
function isWindow(obj) {
  return obj !== null && obj !== undefined && obj === obj.window;
}

 

inArray,在数组中搜索指定值并返回索引 (找不到则返回 -1)。

// jQuery
$.inArray(item, array);

// Native
array.indexOf(item) > -1;

// ES6-way
array.includes(item);

 

isNumeric,检测传入的参数是不是数字。

// jQuery
$.isNumeric(item);

// Native
function isNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

 

isFunction,检测传入的参数是不是 JavaScript 函数对象。

// jQuery
$.isFunction(item);

// Native
function isFunction(item) {
  if (typeof item === 'function') {
    return true;
  }
  var type = Object.prototype.toString(item);
  return type === '[object Function]' || type === '[object GeneratorFunction]';
}

 

isEmptyObject,检测对象是否为空 (包括不可枚举属性)。

// jQuery
$.isEmptyObject(obj);

// Native
function isEmptyObject(obj) {
  return Object.keys(obj).length === 0;
}

 

isPlainObject,检测是不是扁平对象 (使用 “{}” 或 “new Object” 创建).

// jQuery
$.isPlainObject(obj);

// Native
function isPlainObject(obj) {
  if (typeof (obj) !== 'object' || obj.nodeType || obj !== null && obj !== undefined && obj === obj.window) {
    return false;
  }

  if (obj.constructor &&
      !Object.prototype.hasOwnProperty.call(obj.constructor.prototype, 'isPrototypeOf')) {
    return false;
  }

  return true;
}

 

extend,合并多个对象的内容到第一个对象。 object.assign 是 ES6 API。

// jQuery
$.extend({}, defaultOpts, opts);

// Native
Object.assign({}, defaultOpts, opts);

 

trim,移除字符串头尾空白。

// jQuery
$.trim(string);

// Native
string.trim();

 

map,将数组或对象转化为包含新内容的数组。

// jQuery
$.map(array, (value, index) => {
});

// Native
array.map((value, index) => {
});

 

each,轮询函数,可用于平滑的轮询对象和数组。

// jQuery
$.each(array, (index, value) => {
});

// Native
array.forEach((value, index) => {
});

 

grep,找到数组中符合过滤函数的元素。

// jQuery
$.grep(array, (value, index) => {
});

// Native
array.filter((value, index) => {
});

 

type,检测对象的 JavaScript [Class] 内部类型。

// jQuery
$.type(obj);

// Native
function type(item) {
  const reTypeOf = /(?:^\[object\s(.*?)\]$)/;
  return Object.prototype.toString.call(item)
    .replace(reTypeOf, '$1')
    .toLowerCase();
}

 

merge,合并第二个数组内容到第一个数组。

// jQuery
$.merge(array1, array2);

// Native
// 使用 concat,不能去除重复值
function merge(...args) {
  return [].concat(...args)
}

// ES6,同样不能去除重复值
array1 = [...array1, ...array2]

// 使用 Set,可以去除重复值
function merge(...args) {
  return Array.from(new Set([].concat(...args)))
}

 

now,返回当前时间的数字呈现。

// jQuery
$.now();

// Native
Date.now();

 

proxy,传入函数并返回一个新函数,该函数绑定指定上下文。

// jQuery
$.proxy(fn, context);

// Native
fn.bind(context);

 

makeArray,类数组对象转化为真正的 JavaScript 数组。

// jQuery
$.makeArray(arrayLike);

// Native
Array.prototype.slice.call(arrayLike);

// ES6-way
Array.from(arrayLike);

 

contains,检测 DOM 元素是不是其他 DOM 元素的后代.

// jQuery
$.contains(el, child);

// Native
el !== child && el.contains(child);

 

globaleval,全局执行 JavaScript 代码。

// jQuery
$.globaleval(code);

// Native
function Globaleval(code) {
  const script = document.createElement('script');
  script.text = code;

  document.head.appendChild(script).parentNode.removeChild(script);
}

// Use eval, but context of eval is current, context of $.Globaleval is global.
eval(code);

 

parseHTML,解析字符串为 DOM 节点数组.

// jQuery
$.parseHTML(htmlString);

// Native
function parseHTML(string) {
  const context = document.implementation.createHTMLDocument();

  // Set the base href for the created document so any parsed elements with URLs
  // are based on the document's URL
  const base = context.createElement('base');
  base.href = document.location.href;
  context.head.appendChild(base);

  context.body.innerHTML = string;
  return context.body.children;
}

 

parseJSON,传入格式正确的 JSON 字符串并返回 JavaScript 值。

// jQuery
$.parseJSON(str);

// Native
JSON.parse(str);

 

Promises

Promise 代表异步操作的最终结果。jQuery 用它自己的方式处理 promises,原生 JavaScript 遵循 Promises/A+ 标准实现了最小 API 来处理 promises。

done, fail, always,done 会在 promise 解决时调用,fail 会在 promise 拒绝时调用,always 总会调用。

// jQuery
$promise.done(doneCallback).fail(failCallback).always(alwaysCallback)

// Native
promise.then(doneCallback, failCallback).then(alwaysCallback, alwaysCallback)

 

when,when 用于处理多个 promises。当全部 promises 被解决时返回,当任一 promise 被拒绝时拒绝。

// jQuery
$.when($promise1, $promise2).done((promise1Result, promise2Result) => {
});

// Native
Promise.all([$promise1, $promise2]).then([promise1Result, promise2Result] => {});

 

Deferred 是创建 promises 的一种方式。

// jQuery
function asyncFunc() {
  const defer = new $.Deferred();
  setTimeout(() => {
    if(true) {
      defer.resolve('some_value_computed_asynchronously');
    } else {
      defer.reject('failed');
    }
  }, 1000);

  return defer.promise();
}

// Native
function asyncFunc() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (true) {
        resolve('some_value_computed_asynchronously');
      } else {
        reject('failed');
      }
    }, 1000);
  });
}

// Deferred way
function defer() {
  const deferred = {};
  const promise = new Promise((resolve, reject) => {
    deferred.resolve = resolve;
    deferred.reject = reject;
  });

  deferred.promise = () => {
    return promise;
  };

  return deferred;
}

function asyncFunc() {
  const defer = defer();
  setTimeout(() => {
    if(true) {
      defer.resolve('some_value_computed_asynchronously');
    } else {
      defer.reject('failed');
    }
  }, 1000);

  return defer.promise();
}

 

Animation

Show & Hide

// jQuery
$el.show();
$el.hide();

// Native
// 更多 show 方法的细节详见 https://github.com/oneuijs/oui-dom-utils/blob/master/src/index.js#L363
el.style.display = ''|'inline'|'inline-block'|'inline-table'|'block';
el.style.display = 'none';

 

Toggle,显示或隐藏元素。

// jQuery
$el.toggle();

// Native
if (el.ownerDocument.defaultView.getComputedStyle(el, null).display === 'none') {
  el.style.display = ''|'inline'|'inline-block'|'inline-table'|'block';
} else {
  el.style.display = 'none';
}

 

FadeIn & FadeOut

// jQuery
$el.fadeIn(3000);
$el.fadeOut(3000);

// Native
el.style.transition = 'opacity 3s';
// fadeIn
el.style.opacity = '1';
// fadeOut
el.style.opacity = '0';

 

FadeTo,调整元素透明度。

// jQuery
$el.fadeTo('slow',0.15);
// Native
el.style.transition = 'opacity 3s'; // 假设 'slow' 等于 3 秒
el.style.opacity = '0.15';

 

FadeToggle,动画调整透明度用来显示或隐藏。

// jQuery
$el.fadeToggle();

// Native
el.style.transition = 'opacity 3s';
const { opacity } = el.ownerDocument.defaultView.getComputedStyle(el, null);
if (opacity === '1') {
  el.style.opacity = '0';
} else {
  el.style.opacity = '1';
}

 

SlideUp & SlideDown

// jQuery
$el.slideUp();
$el.slideDown();

// Native
const originHeight = '100px';
el.style.transition = 'height 3s';
// slideUp
el.style.height = '0px';
// slideDown
el.style.height = originHeight;

 

SlideToggle,滑动切换显示或隐藏。

// jQuery
$el.slideToggle();

// Native
const originHeight = '100px';
el.style.transition = 'height 3s';
const { height } = el.ownerDocument.defaultView.getComputedStyle(el, null);
if (parseInt(height, 10) === 0) {
  el.style.height = originHeight;
}
else {
 el.style.height = '0px';
}

 

Animate,执行一系列 CSS 属性动画。

// jQuery
$el.animate({ params }, speed);

// Native
el.style.transition = 'all ' + speed;
Object.keys(params).forEach((key) =>
  el.style[key] = params[key];
)

 

Browser Support

Chrome Firefox IE Opera Safari
Latest ✔ Latest ✔ 10+ ✔ Latest ✔ 6.1+ ✔
Javascript 相关文章推荐
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
Apr 27 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 Javascript
JS实现六位字符密码输入器功能
Aug 19 Javascript
JavaScript基于对象去除数组重复项的方法
Oct 09 Javascript
微信js-sdk预览图片接口及从拍照或手机相册中选图接口用法示例
Oct 13 Javascript
jQuery封装placeholder效果实现方法,让低版本浏览器支持该效果
Jul 08 jQuery
详解使用Visual Studio Code对Node.js进行断点调试
Sep 14 Javascript
layui select 禁止点击的实现方法
Sep 05 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
Jul 27 Javascript
解决vue路由name同名,路由重复的问题
Aug 05 Javascript
用vue写一个日历
Nov 02 Javascript
利用node.js开发cli的完整步骤
Dec 29 Javascript
JS中剪贴板兼容性、判断复制成功或失败
Mar 09 #Javascript
JS 容错处理代码, 屏蔽错误信息
Mar 09 #Javascript
JAVASCRIPT 对象的创建与使用
Mar 09 #Javascript
JS JavaScript获取Url参数,src属性参数
Mar 09 #Javascript
JS 统计时间
Mar 09 #Javascript
JavaScript延迟加载
Mar 09 #Javascript
javaScript - 如何引入js代码
Mar 09 #Javascript
You might like
PHP中的正则表达式函数介绍
2012/02/27 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
php正则表达式使用方法整理集合
2020/01/31 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
基于JQuery实现分隔条的功能
2016/06/17 Javascript
xtemplate node.js 的使用方法实例解析
2016/08/22 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
Angular2 (RC5) 路由与导航详解
2016/09/21 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
js实现移动端微信页面禁止字体放大
2017/02/16 Javascript
jquery PrintArea 实现票据的套打功能(代码)
2017/03/17 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
2018/09/12 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
JavaScript常用工具方法封装
2019/02/12 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
[03:00]DOTA2-DPC中国联赛1月18日Recap集锦
2021/03/11 DOTA
新手常见6种的python报错及解决方法
2018/03/09 Python
Python对象属性自动更新操作示例
2018/06/15 Python
python八皇后问题的解决方法
2018/09/27 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
Solaris操作系统的线程机制
2012/12/23 面试题
捷科时代的软件测试笔试题
2015/11/09 面试题
2014年党员自我评议(5篇)
2014/09/12 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
滴水洞导游词
2015/02/10 职场文书
《曹冲称象》教学反思
2016/02/20 职场文书