zoukankan      html  css  js  c++  java
  • 让我们来写一个v-model吧

    今天后端用到了一个插件,导致了整个页面没法滑动,通过控制台报错
    [Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See https://www.chromestatus.com/features/5093566007214080
    然后查看源码发现 document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false); 此行报错
    这个错误在最后会说明 想要看错误的直接往下翻
    这个只是简单介绍一下 最后会放文档地址 有兴趣的继续研究

    addEventListener

    根据mdn的说法 addEventListener 是将一个监听器注册到一个EventTarget对象上(这是啥?我也不太清楚 说的是泛指 包括元素 文档还有window对象等等,稍后进行研究)

    语法

    target.addEventListener(type, listener, options);

    type:监听的事件类型
    listener:监听事件触发时调用的方法
    options:上面回调的有关方法调用时可选参数

    用到的type类型

    type : input 这个可以监听 input select textarea的更改

    让我们开始吧

    新建html 写入以下内容

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>简单的v-model</title>
    </head>
    <body>
        <input type="text" id="input">
        <button onclick="setdata()">点我赋值</button>
        <p id="value"></p>
        <script>
            let data = {value:""};
            let input = document.getElementById("input")
            let view = document.getElementById("value")
            //监听input值输入事件
            input.addEventListener("input",(el)=>{data.value = input.value})
            //监听data值变化
            Object.defineProperty(data,'value',{
                get(){
                    return value
                },
                set(text){
                    value = text
                    input.value = text
                    view.innerText = data.value
                }
            })
            // js测试修改值
            function setdata(){
                data.value = "这是点击赋值"
            }
        </script>
    </body>
    </html>
    

    根据之前的介绍 大致已经能理解了
    let input = document.getElementById("input") 获取input的dom对象
    input.addEventListener 添加监听事件
    监听类型为input
    触发方法为给data.value赋值
    接下来就是拦截对象的赋值操作
    Object.defineProperty
    第一个参数就是要定义的对象 我们是data
    第二个参时要定义或修改的名字
    第三个参数为定义的修改或者描述
    get方法就是读取这个属性值时候触发的方法 如果没有 读取这个方法的时候就是undefined
    set方法就是设置时候触发的方法 如果没有将无法设定值 传入的参数为修改的值
    这个this指向不一定时定义的对象 这句看不懂 哪位大佬能解释下
    详细可以参考mdn 在最后会放连接

    然后基本代码已经介绍完毕了。有问题留言,感觉这个监听方法很好用的。

    问题解决办法

    最后的最后说一下解决办法,因为dom level-2的时候options只有一个传参 是 useCapture 当时解释是如果true的时候会向上冒泡而不会触发EventListener() 就是现在 options的passive
    所以 最后解决将第三个参数更换为{passive:false}
    悄悄说一句 第三个参数只是flase时在ios还是可以正常使用的

    上述代码预览地址

    codepan 预览地址

    参考文章

    mdn addEventListenerj介绍
    mdn EventTarget介绍
    mdn defineProperty介绍
    csdn JS监听变量变化

  • 相关阅读:
    你必须用角色管理工具安装Microsoft .NET Framework 3.5
    LINQ 小心Access to modified closure 问题
    .net BCL获取所有磁盘的信息
    对象的序列化和反序列化及其实现和使用
    对于CSDN博客文章不能爬取的问题
    IO与文件读写Java的IO流架构
    对象的深复制与浅复制 实现Cloneable接口实现深复制 序列化实现深复制
    博客园文章爬取代码
    【HtmlParser】HtmlParser使用
    爬虫简单示例,用httpClient4.2.1实现(转载)
  • 原文地址:https://www.cnblogs.com/pplok/p/12812290.html
Copyright © 2011-2022 走看看