title:

layout: doc

mip.js 内置了一些开发工具和模块,使用原生 JS 实现通用的函数。这些函数不能直接在页面<script>标签中使用,但在开发MIP组件时可以在组件 JS 中引用。

本文包含四个部分:

  1. 替代jquery、zepto
  2. viewport帮助
  3. jquery、zepto引入
  4. 组件提前渲染

1. 替代 jquery、zepto

MIP 不推荐使用 jquery 和 zepto。

为什么不推荐?
1、原生JS已经足够好用
2、jquery、zepto 性能相对于原生JS比较差
3、减少页面负担,不必引入额外的文件

没有jquery&zepto的情况下如何开发?
请参见后面的帮助,大部分都可以用原生JS替代,mip也提供了一些内置组件以解决兼容问题。

选择器

推荐:
querySelector
querySelectorAll

  1. // 全局
  2. // jquery
  3. $('selector');
  4. // native
  5. document.querySelectorAll('selector');
  6. // 局部
  7. var element = document.getElementById('xxx');
  8. // jquery
  9. $('selector', element);
  10. // native
  11. element.querySelectorAll('selector');
  12. // 另外原生也支持
  13. element.getElementsByClassName
  14. element.getElementById
  15. element.getElementsByTagName

attr & data

  1. // attr
  2. // jquery
  3. $element.attr('test');
  4. $element.attr('test', '123');
  5. // native
  6. element.getAttribute('test');
  7. element.setAttribute('test', '1');
  8. element.hasAttribute('test');
  9. // data
  10. // jquery
  11. $element.data('test');
  12. $element.data('test', '1');
  13. // native
  14. element.dataset['test'];
  15. element.dataset['test'] = '1';

dom

  1. var util = require('util');
  2. // previousElement
  3. // jquery
  4. $element.prev();
  5. // native
  6. element.previousElementSibling;
  7. // nextElement
  8. // jquery
  9. $element.next();
  10. // native
  11. element.nextElementSibling;
  12. // closest
  13. // jquery
  14. $element.closest(selector);
  15. // mip
  16. util.dom.closest(element, selector);
  17. // contains
  18. // jquery
  19. jQuery.contains(parent, child);
  20. // mip
  21. util.dom.contains(parent, child);
  22. // matches(判断element与selector是否匹配)
  23. // mip
  24. util.dom.matches(document.body, 'body'); // true
  25. // 其它常规操作
  26. // native
  27. element.appendChild
  28. element.insertBefore
  29. element.removeChild
  30. element.innerHTML
  31. element.textContent

css

  1. // jquery
  2. $element.css('display', 'none');
  3. // mip
  4. var util = require('util');
  5. util.css(element, 'display', 'none');
  6. util.css(element, {
  7. left: 100,
  8. top: 200
  9. });
  10. var arr = [element, element1, element2];
  11. util.css(arr, 'display', 'none');

class

  1. // add
  2. // jquery
  3. $element.addClass('test');
  4. // native
  5. element.classList.add('test');
  6. // remove
  7. // jquery
  8. $element.removeClass('test');
  9. // native
  10. element.classList.remove('test');
  11. // has
  12. // jquery
  13. $element.hasClass('test');
  14. // native
  15. element.classList.contains('test');
  16. // toggle
  17. // jquery
  18. $element.toggleClass('test');
  19. // native
  20. element.classList.toggle('test');

position&width&height

  1. // position
  2. // jquery
  3. $element.position();
  4. // native
  5. element.offsetLeft
  6. element.offsetTop
  7. // offset
  8. // jquery
  9. $element.offset();
  10. // mip
  11. var util = require('util');
  12. util.rect.getElementOffset(element);

ajax

异步请求使用 fetch 和 fetch-jsonp

fetch
fetch-jsonp

  1. // get
  2. fetch(location.href).then(function (res) {
  3. return res.text();
  4. }).then(function (text) {
  5. fetchElement.innerHTML = 'fetch: ' + (text.search('mip-test') !== -1);
  6. });
  7. // jsonp
  8. var fetchJsonp = require('fetch-jsonp');
  9. fetchJsonp('xxx', {
  10. jsonpCallback: 'cb'
  11. }).then(function (res) {
  12. return res.json();
  13. }).then(function (data) {
  14. console.log(data);
  15. });

event

  1. // on、bind
  2. // jquery
  3. $element.on('click', fn);
  4. // native
  5. element.addEventListener('click', fn, false);
  6. // off、unbind
  7. // jquery
  8. $element.off('click', fn);
  9. // native
  10. element.removeEventListener('click', fn);
  11. // delegate
  12. // jquery
  13. $element.delegate(selector, 'click', fn);
  14. // mip
  15. var util = require('util');
  16. var undelegate = util.event.delegate(element, selector, 'click', fn);
  17. // mip undelegate
  18. undelegate();
  19. // trigger
  20. // jquery
  21. $element.trigger('click');
  22. // native
  23. var event = document.createEvent('MouseEvents');
  24. event.initEvent('click', true, true);
  25. element.dispatchEvent(event);
  26. // mip
  27. var util = require('util');
  28. element.dispatchEvent(event, util.event.create('click', data));

util

  1. var util = require('util');
  2. // extend
  3. // jquery
  4. $.extend(a, b);
  5. $.extend(true, a, b);
  6. // mip
  7. util.fn.extend(a, b);
  8. util.fn.extend(true, a, b);
  9. // isPlainObject
  10. // jquery
  11. $.isPlainObject(obj);
  12. // mip
  13. util.fn.isPlainObject(obj);
  14. // isArray
  15. // jquery
  16. $.isArray(obj);
  17. // native
  18. Array.isArray(obj);
  19. // trim
  20. // jquery
  21. $.trim(str);
  22. // native
  23. str.trim();

手机系统 & 浏览器内核 & 浏览器厂商判断

  1. var util = require('util');
  2. var platform = util.platform;
  3. // Trident engine
  4. platform.isTrident();
  5. // Gecko engine
  6. platform.isGecko();
  7. // Webkit engine
  8. platform.isWebkit();
  9. // iOS system
  10. platform.isIos();
  11. // Android system
  12. platform.isAndroid();
  13. // Get system version
  14. platform.getOsVersion();
  15. // Uc browser
  16. platform.isUc();
  17. // Chrome browser
  18. platform.isChrome();
  19. // Android browser
  20. platform.isAdr();
  21. // Safari browser
  22. platform.isSafari();
  23. // QQ browser
  24. platform.isQQ();
  25. // Firefox browser
  26. platform.isFireFox();
  27. // Baidu browser
  28. platform.isBaidu();
  29. // Baidu application browser
  30. platform.isBaiduApp();
  31. // WeChat application browser
  32. platform.isWechatApp();
  33. // Weibo application browser
  34. platform.isWeiboApp();
  35. // QQ application browser
  36. platform.isQQApp();

location.hash 获取

MIP页面URL支持的 hash 模式为:键值对以等号链接,多个 hash 以’&’链接。
使用 MIP.hash.get() 方法能够直接获取当前页面 hash。

  1. // 例:#a=12&b=&c==333
  2. MIP.hash.get('a') // '12'
  3. MIP.hash.get('b') // ''
  4. MIP.hash.get('c') // '=333'

parseCacheUrl

将 Cache URL 转化为原始 URL。

  1. var util = require('util');
  2. // input: https://www-mipengine-org.mipcdn.com/c/s/www.mipengine.org/
  3. // output: https://www.mipengine.org/
  4. var pageUrl = util.parseCacheUrl('https://www-mipengine-org.mipcdn.com/c/s/www.mipengine.org/')
  5. // input: https://www-mipengine-org.mipcdn.com/i/s/www.mipengine.org/static/img/mip_logo_3b722d7.png
  6. // output: https://www.mipengine.org/static/img/mip_logo_3b722d7.png
  7. var imgUrl = util.parseCacheUrl('https://www-mipengine-org.mipcdn.com/i/s/www.mipengine.org/static/img/mip_logo_3b722d7.png')

2、viewport 帮助

viewport 提供了视图相关的功能。

为什么要使用viewport?

1、提供一些视图相关的扩展功能
2、当页面被嵌入到iframe中,滚动以及页面相关的计算有一些bug

使用方式

  1. var viewport = require('viewport');
  2. // 获取 scrollTop
  3. var scrollTop = viewport.getScrollTop();
  4. // 设置 scrollTop
  5. viewport.setScrollTop(20);
  6. // 获取页面可视宽度
  7. viewport.getWidth();
  8. // 获取页面可视高度
  9. viewport.getHeight();
  10. // 获取页面实际宽度
  11. viewport.getScrollwidth();
  12. // 获取页面实际高度
  13. viewport.getScrollHeight();
  14. // 获取页面 Rect
  15. viewport.getRect();
  16. // 页面 scroll 事件
  17. viewport.on('scroll', function () {
  18. // code
  19. });
  20. // 页面 changed 事件
  21. // 当页面滚动结束,或者滚动速度比较低时,会触发 changed 事件
  22. viewport.on('changed', function () {
  23. // code
  24. });

3、引入jquery or zepto

考虑到 jquery 和 zepto 有一定需求。
所以mip也为使用它们提供了异步引入的方式。

引入方式:

  1. define(function (require) {
  2. var $ = require('jquery');
  3. // or
  4. var $ = require('zepto');
  5. });

4、组件提前渲染 prerenderElement

提前渲染 MIP 组件。

如果元素不在 viewport 内,强制触发元素的 viewportCallback firstInviewCallback 方法。

  1. var element = document.getElementById('mip-test');
  2. MIP.prerenderElement(element);