工作不忙的时候,要学会总结。吃一堑长一智,道理如此;
1.关于移动端,页面宽度超出屏幕宽度的问题;
布局时候不注意,对元素宽度设置100%,再设置padding或者margin就会出现这个问题;
解决方案就是去掉margin和padding,再low点,取消padding改用 ;来怼;其实还是要根据页面实际情况再加样式;
<h3 style="width: 100%;height: 3rem;line-height: 3rem;background-color: #f5f4f9;color:#999;font-weight: normal;"> 一个标题</h3>//这是body里面的一个标题;
2.工作中遇到如下需求,点击输入框弹出自定义弹窗,输入框是input标签;
但是在移动端,input会默认触发手机的虚拟键盘,如何阻止手机虚拟键盘弹起呢?
目前我试过有两个方案,一个是给input添加readonly属性,另一个就是在input事件处理方法前面添加一句document.activeElement.blur() 。
使用readonly方式来阻止虚拟键盘弹出应该是最简单最优雅的方式了。readonly 属性规定输入字段为只读。只读字段是不能修改的。不过,用户仍然可以使用 tab 键切换到该字段,还可以选中或拷贝其文本。
值得一提的是它的取值,只要声明了readonly属性,不管取什么值都可以,比如readonly=””、readonly=”readonly”、readonly=”abc”都是一样的
优点:简单
缺点:在iOS的Safari中无效(未做更多情况测试)
document.activeElement是一个Web API接口。MDN上的解释是:它返回当前页面中获得焦点的元素,也就是说,如果此时用户按下了键盘上某个键,会在该元素上触发键盘事件,该属性是只读的。
document.activeElement属性始终会引用DOM中当前获得了焦点的元素。元素获得焦点的方式有用户输入(通常是按Tab键)、在代码中调用focus()方法和页面加载。
它里面有很多方法,在浏览器控制台查看,可以看到有很都方法;
那么document.activeElement.blur()为什么可以阻止虚拟键盘弹出呢?原因是:当你点击input的时候,document.activeElement获得了DOM中被聚焦的元素,也就是你点击的input,而调用.blur()方法,blur我相信大家都知道吧,就是取消聚焦。获得被聚焦的元素然后强制blur以达到没有聚焦的样子、、、感觉绕了。
优点:支持Android、iOS
缺点:需要添加额外的JS代码
<div class="calendar"> <div> <input type="text" id="datePicker" class="date_picker" placeholder="点击选择入住日期"> </div> </div> //js代码 $("#datePicker").focus(function(){ document.activeElement.blur(); });
3.关于文件上传到服务器问题;
如果上传的文件是图片,可以在当前页面设置图片预览;
$("#avatarSlect").change(function () { var obj = $("#avatarSlect")[0].files[0];//获取文件信息; var fr = new FileReader();//window内部有一个FileReader的构造函数; fr.onload = function () { $("#avatarPreview").attr('src', this.result); console.log(this.result); $("#avatar").val(this.result); }; fr.readAsDataURL(obj);
//FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL。
//Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件。
//使用Data URL的好处是,您不需要额外再发出一个HTTP 请求到服务器端取得额外的资料;
//readAsDataURL方法会使用base-64进行编码,编码的资料由data字串开始,后面跟随的是MIME type,然后再加上base64字串,逗号之后就是编码过的图像文件的内容。
})
4.页面间的跳转传参问题;
//获取地址栏参数 function GetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return unescape(r[2]); return null; } function NEWGetQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); var r = window.location.search.substr(1).match(reg); if (r != null) return decodeURIComponent(r[2]); return null; }
这两个函数都是获取url中的参数;分别使用unescape()和decodeURIComponent()进行解码;
可以使用 unescape() 对 escape() 编码的字符串进行解码。(ECMAScript v3 反对使用该方法,应用使用 decodeURI() 和 decodeURIComponent() 替代它。)
一张图看懂encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别;这篇文章解释得更清楚点;
5.一个bug理解同步和异步;
<script> test(); var m = 1; function test() { setTimeout(() => { console.log(m)//1 }, 1000); // console.log(m)//undefined } </script>
先贴上代码;
同步执行test函数,因为JS执行,变量m声明提前而赋值不会提前,所以直接打印出来的m值为undefined。
异步打印m,此时的JS开始执行异步队列,m已经被赋值,所以打印出1;
6.复制完内容后,在Android端微信H5内的input无法粘贴,而ios是可以的;
<textarea class="inputTitle" rows="1" type="text" id="title" placeholder="请输入标题" οnfοcus="setText()">
</textarea>
js:function setText() {document.querySelector('#title').value = ' '};
我遇到这个奇妙的问题,textarea在focus的时候,不输入任何内容,安卓手机长按不出现粘贴;目前的处理方法就是在focus的时候设置value为' '(一个空格);这样长按就会出来粘贴了;不是最优,但是亲测有效;