android webkit和html的10位数字

6 篇文章 0 订阅
3 篇文章 0 订阅
前提:
基于Android4.0.1 webkit中会默认
10位数字首位为1或者0时不会有焦点
11位数字只有首位为1时会有焦点
这样会导致如果在页面中增加一个div,text为随便一个十位数就会有焦点可以移动上去。


分析:对比cachenode的type看看,有焦点时的和没焦点时的数字是不是有区别。对比发现了区别。
在BuildFrame的时候根据textnode的内容确定cachenode的type。它有一套分析方法,主要是两个函数:
bool isFocusableText(NodeWalk* walk, bool more, Node* node, CachedNodeType* type, String* exported) const
从字面意思上就可以知道是为了确定这个textnode是不是一个需要有焦点的node。这个函数中最重要的部分就是嵌套循环部分,CachedNodeType的种类为最外循环的次数。


FoundState FindPartialNumber(const UChar* chars, unsigned length, FindState* s)
这个函数是用来检测是否符合电话号码的规则的。


最终如果确认为电话号码,就会设置cacheNode的type为PHONE_CACHEDNODETYPE。最终会将此数字串当作手机号码显示为拨号链接。


其实解决这个问题也很简单:
设置一个meta标签就可以解决问题
<meta name="format-detection" content="telephone=no"/>


从代码角度看,如何会影响到cachenode部分。
在void HTMLMetaElement::parseMappedAttribute(Attribute* attr)函数中解析name为content时进行process()--这时name="format-detection"已经保存在了属性中。
里面有else if (equalIgnoringCase(name(), "format-detection"))
        document()->processMetadataSettings(m_content);
这样一句话,可以看到直接跳转到document中的processMetadataSettings,这时的参数为telephone=no。
继续跟踪代码到
void Document::processArguments(const String& features, void* data, ArgumentsCallback callback)
前面的几个小的while循环是解析“telephone=no”,将key和value分开。函数最后调用settings的setMetadataSettings函数:
else if (key == "telephone") {
if (value == "no") {
    m_format_detection_telephone = false;
}
设置m_format_detection_telephone为false。
Settings还有一个接口是获得这个bool值的:bool formatDetectionTelephone() const


调用这个接口的地方是void WebViewCore::updateFrameCache(),它设置了
if (!settings->formatDetectionTelephone())
    builder.disallowPhoneDetection();


直接影响到了cachebuilder中的mAllowableTypes。

搜索这个变量,就可以发现正好在开头提到的isFocusableText函数中的循环if语句中存在。

真相大白。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值