一 DOM元素获取

1 原生js方式获取元素:

1.querySelector获取元素(Id名/Class名/tag标签名),如 document.querySelector('.mui-content');

  1. //获取当前页面元素中Class类名为'mui-icon'的元素下的图片元素,并修改img的src属性
  2. document.querySelector('.mui-icon img').setAttribute('src', '../images/sun.png');
  3. //在当前元素父元素中查询id为'List'的元素
  4. var placeholder = this.element.parentNode.querySelector('#List');

2.querySelectorAll 获取元素集合(Class名/tag标签名),如 document.querySelectorAll('.mui-content');

  1. //获取当前页面元素中所有button(按钮)元素,return一个数组
  2. var btn = document.querySelectorAll('button');
  3. //获取当前元素中所有button(按钮)元素,return一个数组[一般用于函数方法中]
  4. var btn = ele.querySelectorAll('button');

3.常用的 getElementById/getElementsByClassName/getElementsByTagName

  1. //获取id为'offCanvasShow'的关闭侧滑菜单按钮
  2. document.getElementById('offCanvasShow');
  3. //获取当前页面元素中Class类名为'mui-show-loading'的加载框
  4. var toast=document.getElementsByClassName('mui-show-loading');
  5. //获取placeholder元素中所有<span>标签数组中下标为1(第2个)元素的文本
  6. placeholder.getElementsByTagName('span')[1].innerText

2 mui()方式获取元素:

除了mui自带方法,我们在用的过程中,要和原生方法一样获取元素,需要多留心一下mui(‘.title’)获取的是一个集合数组,需要通过添加下标的方式来获取元素。

  1. //获取Class为'title'的元素
  2. mui('.title')[0];
  3. //获取id为'test'的元素
  4. mui('#test')[0];

3 js/mui获取元素对比:

1.HTML示例元素:

  1. <ul class="mui-table-view mui-table-view-chevron">
  2. <li class="mui-table-view-cell" chapter-id="2849117">第一章:发现秘密</li>
  3. <li class="mui-table-view-cell" chapter-id="2849118">第二章:视频</li>
  4. </ul>

2.获取宽高

  1. //js方式获取第一个li元素高度
  2. document.getElementsByTagName("ul")[0].getElementsByTagName("li")[0].offsetHeight;
  3. //mui方式获取第一个li元素高度
  4. mui("ul li")[0].offsetHeight;

3.添加或删除Class属性(Class类),mui和原生是相同的

  1. //js方式给第一个li元素添加删除Class属性
  2. var obj = document.getElementsByTagName("ul")[0].getElementsByTagName("li")[0];
  3. obj.classList.add("mui-active");
  4. obj.classList.remove("mui-active");
  5. //单个class情况下可以使用的方式
  6. obj.setAttribute("class", "mui-active");
  7. //mui方式给第一个li元素添加删除Class属性
  8. mui("ul li")[0].classList.add("mui-active");
  9. mui("ul li")[0].classList.remove("mui-active");
  10. //或者直接重置所有Class类名
  11. mui("ul li")[0].className = "mui-table-view-cell mui-active";
  12. mui("ul li")[0].className = "mui-table-view-cell";
  13. //单个class情况下可用
  14. mui("ul li")[0].setAttribute("class", "mui-active");

注意:JQ的addClass()/removeClass()方法在原生及mui中是无效的。

4.设置或获取CSS属性

  1. //js设置css属性的几种方式
  2. var obj = document.getElementsByTagName("ul")[0].getElementsByTagName("li")[0];
  3. obj.style.backgroundColor= "black";
  4. obj.style.cssText = "background-color:black; display:block;color:White;"
  5. //mui设置方式和原生js相同
  6. mui("ul li")[0].style.backgroundColor= "black";
  7. mui("ul li")[0].style.cssText = "background-color:black; display:block;"

5.拓展:关于CSS样式,若整个页面中有大量CSS样式需要替换设置(比如换肤的需求),建议采用点击替换CSS外联文件的方式

  1. <link href="css1.css" rel="stylesheet" type="text/css" id="css"/>
  2. <div class = "themesChange">切换主题</div>
  3. <script>
  4. mui('body').on('tap','.themesChange',function(){
  5. changeStyle4();
  6. });
  7. function changeStyle4() {
  8. var obj = document.getElementById("css");
  9. obj.setAttribute("href","css2.css");
  10. }
  11. </script>

二 数据绑定

mui 目前没有自己特定的数据绑定方式,数据主要是用mui 封装好的ajax获取json数据,然后用原生js拼接,把html代码加载到页面。

1 mui.ajax()

mui框架基于htm5plus的XMLHttpRequest,封装了常用的Ajax函数,支持GET、POST请求方式,支持返回json、xml、html、text、script数据类型; 本着极简的设计原则,mui提供了mui.ajax方法,并在mui.ajax方法基础上,进一步简化出最常用的mui.get()、mui.getJSON()、mui.post()三个方法。
使用方法和jquery大致相同,具体文档可查看官网API: http://dev.dcloud.net.cn/mui/ajax/

  1. mui.ajax('http://server-name/login.php',{
  2. data:{
  3. username:'username',
  4. password:'password'
  5. },
  6. dataType:'json',//服务器返回json格式数据
  7. type:'post',//HTTP请求类型
  8. timeout:10000,//超时时间设置为10秒;
  9. headers:{'Content-Type':'application/json'},
  10. success:function(data){
  11. //服务器返回响应,根据响应结果,分析是否登录成功;
  12. ...
  13. },
  14. error:function(xhr,type,errorThrown){
  15. //异常处理;
  16. console.log(type);
  17. }
  18. });

1-1.以mui.ajax方法示例来说明需要强调的几点:

1.headers:指定HTTP请求的Header,数据类型(如:Json);
2.data:发送到服务器的业务数据,一般是对象或字符串,类似Ajax函数的header参数(如:发送请求token或者必要参数)

1-2.mui.ajax参考地址一览:

官网API: http://dev.dcloud.net.cn/mui/ajax/
mui.ajax()方法中的XMLHttpRequest: http://ask.dcloud.net.cn/article/865
mui.getJSONP()实现Web跨域: http://ask.dcloud.net.cn/article/833

2 数据拼接绑定流程

1.请求获取到服务器返回的数据data
2.获取到目标元素
3.将目标元素的内容(子元素)清空【视情况而定,如果是加载更多,则不需要此操作】
4.创建一个临时dom片段,用来存放循环创建的数据(非必需)
5.使用mui.each()来循环data,创建子元素
6.使用appendChild()方法将循环创建的子元素添加到临时dom片段中
7.使用appendChild()方法将临时dom片段添加到目标元素中

使用代码片段演示说明如下:

  1. function chapterList() {
  2. var obj = {
  3. bookid: bookid,
  4. num: num
  5. }
  6. mainapi('chapterList', obj, function(res) {
  7. //1.获取到服务器返回的数据
  8. var chapter = res.data.chapter;
  9. totalnum = res.data.totalnum;
  10. //2.两种方式任选一种获取到目标元素
  11. //var ul = mui('.mui-content ul')[0];
  12. var ul = document.body.querySelector('.mui-table-view');
  13. //3.将目标元素的内容重置为空(清空目标元素)
  14. ul.innerHTML = '';
  15. //4.创建一个dom片段,用来存放循环的数据
  16. var frag = document.createDocumentFragment();
  17. //5.使用mui.each()循环data,创建子元素li
  18. mui.each(chapter, function(index, item) {
  19. var viptext = item.isvip ? '<span class="mui-badge mui-icon mui-icon-locked"></span>' : '';
  20. var li = document.createElement('li');
  21. li.classList = 'mui-table-view-cell';
  22. li.innerHTML = item.name + viptext;
  23. li.setAttribute('chapter-id', item.id);
  24. li.setAttribute('chapter-vip', item.isvip);
  25. //6.将每次循环生成的li推荐临时dom片段中
  26. frag.appendChild(li);
  27. });
  28. //7.将临时dom片段推入目标元素中,数据拼接绑定完成
  29. ul.appendChild(frag);
  30. });
  31. }

扩展:appendChild() 方法向节点添加最后一个子节点。