【小贴士】zepto find元素以及ios弹出键盘可能让你很头疼
前言
在此,我不得不说移动端的兼容问题很多,并且很令人头疼,这不,这个星期又有两个让我逮着了,一个是使用zepto过程中出现的问题,一个是ios虚拟键盘的问题
我这里做一次记录,以免以后忘了,同时希望对后面做移动开发的朋友有一定帮助,首先,我们调一个简单的来说
zepto与querySelectorAll
首先,W3C提供了新的查询接口,querySelector与querySelectorAll
其中querySelector返回的是一个对象选择第一个对象,querySelectorAll返回的一个集合(NodeList)
以百度首页来说,会出现这样的现象:
其他地方可能还会说道queryselectorAll的BUG,那些我暂且不关注,这简单拷贝下别人的就说下我遇到的问题
<div id="test1"><a href="http://www.hujuntao.com/">设计蜂巢</a></div>
<p id="bar">111</p>
<script>
var d1 = document.getElementById('test1'),
obj1 = d1.querySelector('div a'),
obj2 = d1.querySelectorAll('div a');
obj3 = $(d1).find('div a');
console.log(obj1) //<a href="http://www.hujuntao.com/">设计蜂巢</a>
console.log(obj2.length) //1
console.log(obj3) //null
</script>
从这个例子来说,querySelectorAll实现是有问题的,但是我们暂时不关注他
因为,我们的项目是单页应用,所以不可避免的,view与view之间可能出现id重复,这个时候使用zepto的选择器会不会遇到问题呢?
var el = $('#el')//获取元素
var node = el.find('......')
答案当然是会的,并且是在IOS7下面会遇到问题,不得不说乔帮主一死,丐帮堕落了......
前段时间Arron做过一个研究
var element = $('<div id = "aaron">...填充大量结构...</div>'); $(root).html(element) $('#aaron') //为空
这个是很简单的一段代码,按照常规的认识,JS主线程与GUI的渲染线程是互斥的,所以在执行JS的时候,GUI应该就是挂起的, 同理执行GUI的时候亦然, 因为JS可以动态操作节点,所以如果我们在GUI绘制的时候做操作明显就会打乱了,所以互斥的解释也合理
但是实际上这样并不能直接获取到$('#aaron'),PC上基本不会出现,常规的办法都是加setTimeout
这个例子旨在说明在移动端获取元素会出问题,这不这个星期我马上遇到了一个问题,并且和上面的情况还不一样呢:
在IOS7下面,View之间的切换后,如果此时操作了DOM,并且view之间有一个重复id元素,并且我们还会用到
则此时this.$el.find('#id')这个会选取到两个元素......
PS:其中$el为backbone render时候返回的html元素,
这是一个什么问题呢?简单来说如下:
<div id="foo">
<p id="t">This is a sample error</p>
</div>
<div id="foo1">
<p id="t">This is a sample error</p>
</div>
var el = document.getElementById('#foo')
el.querySelectorAll('#t')
这个在IOS7下有一定几率会返回一个数组,并且里面装的是两个元素(意思是两个id为t的元素都被选出来的了......)
这个就是我们遇到的一个问题,应该说这个问题很隐蔽,于是我就看了下zepto里面的实现:
zepto.qsa = function(element, selector){
var found,
maybeID = selector[0] == '#',
maybeClass = !maybeID && selector[0] == '.',
nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked
isSimple = simpleSelectorRE.test(nameOnly)
return (isDocument(element) && isSimple && maybeID) ?
( (found = element.getElementById(nameOnly)) ? [found] : [] ) :
(element.nodeType !== 1 && element.nodeType !== 9) ? [] :
slice.call(
isSimple && !maybeID ?
maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class
element.getElementsByTagName(selector) : // Or a tag
element.querySelectorAll(selector) // Or it's not simple, and we need to query all
)
}
element存在的情况最后使用querySelectAll选取元素,我们这里不是dom不存在而是多选了一个dom,所以这里需要针对ios7做一个适配
zepto.qsa = function(element, selector){
var found,
maybeID = selector[0] == '#',
maybeClass = !maybeID && selector[0] == '.',
nameOnly = maybeID || maybeClass ? selector.slice(1) : selector, // Ensure that a 1 char tag name still gets checked
isSimple = simpleSelectorRE.test(nameOnly)
var doms = (isDocument(element) && isSimple && maybeID) ?
( (found = element.getElementById(nameOnly)) ? [found] : [] ) :
(element.nodeType !== 1 && element.nodeType !== 9) ? [] :
slice.call(
isSimple && !maybeID ?
maybeClass ? element.getElementsByClassName(nameOnly) : // If it's simple, it could be a class
element.getElementsByTagName(selector) : // Or a tag
element.querySelectorAll(selector) // Or it's not simple, and we need to query all
)
//这里需要做判断.......判断逻辑自己去搞
var _tmp = [];
if(ios7 && element){
for(var i = 0, len < doms.length; i < len; i++) {
if(element.contains(doms[i])) _tmp.push(doms[i])
}
return _tmp;
} else { return doms }
}
这里代码做一下处理,针对IOS7应该就没问题了.......于是进入今天第二个话题
这里给出测试地址:http://sandbox.runjs.cn/show/w5q7inp1
手机弹出虚拟键盘
之前忧患深第一次出剑时候,他说了一句:你见过吾之六凡灭剑么?然后出剑
于是,在此我想问一句:你见过IOS弹不出来键盘么......尼玛真的弹不出来啊!!!碰上fastclick的话更有不一样的感觉
我们在手机上想弹出键盘,需要的就是让文本框获取焦点,文本框获取焦点便会弹出键盘,但是我这里提出一个问题
弹出键盘==文本框获取焦点
文本框获取焦点!=弹出键盘
经过我的研究一定要这种情况下才会弹出键盘:
① 文本框获取焦点 ② 手指触屏(网页区域,混合开发触屏app头不能让webview弹出键盘) ③ 没有延迟(不会ajax回调,不会延迟)
我这里举一个例子,并且此例子与fastclick还有一定关系,如果没有关系这里就没有意义了:
http://sandbox.runjs.cn/show/0bmobuyy
如果你使用ios访问这个链接,你会发现,其中的input已经获取了焦点,这个时候你快速的点击文本框就不会弹出键盘
这个情况导致的原因就是文本框已经获取焦点了,再去点击就不会弹出键盘,当然这个情况只是在使用fastclick的情况下
但是,弹出键盘还是得满足以上情况,缺一不可
结语
今天没有用公司的电脑,状态不好,暂时到此
【小贴士】zepto find元素以及ios弹出键盘可能让你很头疼的更多相关文章
- ios 弹出键盘 视图向上平移
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardwillAppear:) name:U ...
- ios兼容 input输入时弹出键盘框 页面整体上移键盘框消失后在ios上页面不能回弹的问题
前端h5混合开发手机端ios 当有input输入时,手机下方弹出键盘使页面上移,当输入完成,键盘消失后页面显示回到原位,但实际不能点击(可点击上方区域,有反应),也就是说实际是没有回弹. 解决办法: ...
- IOS弹出视图 LewPopupViewController
LewPopupViewController是一款IOS弹出视图软件.iOS 下的弹出视图.支持iPhone/iPad. 软件截图 使用方法 弹出视图 1 2 3 4 5 PopupView *vie ...
- 安卓弹出键盘隐藏fixed定位相关的元素(obj必须是class)
//安卓弹出键盘隐藏fixed定位相关的元素(obj必须是class) function displayFixed(obj){ var h = document.body.scrollHeight; ...
- mui搜索框在ios平台上点击多次才弹出键盘的解决方法
今天使用Hbuilder调试手机端时,发现搜索框在安卓系统下,点击一次就可以弹出键盘 但是在iso下非常的不规律,要点击多次 代码实现如下: <div class="mui-input ...
- IOS开发之自定义系统弹出键盘上方的view(转载)
这篇文章解决的一个开发中的实际问题就是:当弹出键盘时,自定义键盘上方的view.目前就我的经验来看,有两种解决方法.一个就是利用UITextField或者UITextView的inputAccesso ...
- (Vue)移动端点击输入框,弹出键盘,底部被顶起问题
(Vue)移动端点击输入框,弹出键盘,底部被顶起问题:https://www.jianshu.com/p/210fbc846544 问题描述:Vue开发中,当我们相对于父视图的底部布局子控件时,需要用 ...
- 关于UITextfield弹出键盘解决方案
解决的问题:当你点击一个UITextfield时,不想让其弹出键盘,如果你觉得不就是取消其第一响应者嘛,resignRespond一下不就行了嘛,确实,如果你只是在其编辑完成后让其键盘消失,那这个就够 ...
- fullpage插件在移动端弹出键盘页面特殊处理
fullpage插件大家都很熟悉 jquery一款全屏上下滑动的插件. 最近做公司一个活动移动端使用fullpage插件填写input的时候遇见一个问题,手机自带的键盘弹出的时候会把页面顶出去,页面错 ...
随机推荐
- struts深入原理之RequestProcessor与xml
和配置文件相对应的代码(struts1) public void process(HttpServletRequest request, HttpServletResponse response) ...
- Android 学习之路
转载:http://stormzhang.com/android/2014/07/07/learn-android-from-rookie/ 这篇博客背后的故事 一路走来很不容易,刚好知乎上被人邀请回 ...
- CSS3 过渡特性创建信封效果的联系表单
最近给大家分享 CSS3 效果比较多,都是充分运用了 CSS3 来实现的.通过 CSS3 的新特性,我们创作出好的交互和效果的可能性大大增加.这篇文章中,我想与大家分享使用 CSS3 过渡特性实现的信 ...
- 搭建PHP开发环境
通过两种方式搭建PHP开发环境,而这种开发环境实际是:Apache+MySQL+PHP. 第一种: 通过套件来安装和配置php开发环境. Apache+MySQL+PHP开发环境的搭建(一) 第二种 ...
- asp.net中打印指定控件内容
1.写一个PrintHelper类using System;using System.Data;using System.Configuration;using System.Web;using Sy ...
- plsql导入excel时报错:ORA-01036: 非法变量名/编号
导入oracle数据,选择工具->odbc导入->Excel 然后关于日期的插入出错,修改后如下:
- 基于HTML5树组件延迟加载技术实现
HT for Web的HTML5树组件有延迟加载的功能,这个功能对于那些需要从服务器读取具有层级依赖关系数据时非常有用,需要获取数据的时候再向服务器发起请求,这样可减轻服务器压力,同时也减少了浏览器的 ...
- 书写高效的CSS
一.使用高效是CSS ①:使用外联样式替代行间样式或内嵌样式. 不推荐使用内联样式:<style></style> 不推荐使用内嵌样式:<p style="&q ...
- ASP.NET Core 1.0到底是什么?
ASP.NET Core1.0 是微软的下一代ASP.NET框架.我们将ASP.NET升级到最新版本我们会发现最高级的版本是ASP.NET 4.6对应的FrameWork版本是4.6.1. 那么很多人 ...
- 【原创】Kakfa serializer包源代码分析
这个包很简单,只有两个scala文件: decoder和encoder,就是提供序列化/反序列化的服务.我们一个一个说. 一.Decoder.scala 首先定义了一个trait: Decoder[T ...