w***@163.com
w***@163.com
  • 发布:2016-11-30 18:13
  • 更新:2016-12-01 10:31
  • 阅读:1339

动态新增控件失效

分类:MUI

MUI 动态新增日期控件 或者动态新增选择器后,点击新增的控件没反应要怎么解决?

代码如下:

<div class="mui-content">
<button id="btn">新增选择器</button>
<br />
</div>
<script>
var num=0;
document.getElementById("btn").addEventListener("tap", function(){
var str = " <li class=\"mui-table-view-cell my-table-col-2\">"
+"<span>小区名称"+eval(num+1)+"</span>"
+"<div id='showCommunityIDPicker"+eval(num+1)+"'>"
+" <span id='showCommunityIDPickerVal"+eval(num+1)+"'>请选择</span>"
+" <span class=\"mui-icon mui-icon-arrowdown\"></span>"
+"</div>"
+"</li>";
var scriptStr2 = "<script>(function() {mui.init();mui.ready(function() {"
+" var communityIDPicker"+eval(num+1)+" = new mui.PopPicker();"
+" communityIDPicker"+eval(num+1)+".setData([{value: 'AAA',text: 'AAA董事长 叶文洁'}, {value: 'BBaaa',text: 'BBB总经理 艾AA'}]);"
+" var showCommunityIDPickerVal"+eval(num+1)+" = document.getElementById('showCommunityIDPickerVal"+eval(num+1)+"');"
+"jQuery('.mui-content').on('tap', '#showCommunityIDPicker"+eval(num+1)+"', function(event){"
+" communityIDPicker"+eval(num+1)+".show(function(items) {"
+" showCommunityIDPickerVal"+eval(num+1)+".innerText = items[0].text;"
+" });"
+" }, false)"
+" })})();<\/script>";
str = str+scriptStr2;

            var fragment = document.createDocumentFragment();  
            li = document.createElement('li');  
            li.className = 'mui-table-view-cell';  
            li.innerHTML = str;  
            fragment.appendChild(li);  
            document.querySelector(".mui-content").appendChild(fragment);  
        });  
    </script>
2016-11-30 18:13 负责人:无 分享
已邀请:
w***@163.com

w***@163.com (作者)

好吧,最后还是我自己回答自己的问题。
解决办法:利用js的冒泡方法去绑定事件
完整代码:
<!DOCTYPE html>
<html>

<head>  
    <meta charset="utf-8">  
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
    <title></title>  
    <!--标准mui.css-->  
    <link rel="stylesheet" href="../css/mui.min.css">  
    <!--App自定义的css-->  
    <link rel="stylesheet" type="text/css" href="../css/app.css" />  
    <!--<link href="../css/mui.picker.css" rel="stylesheet" />  
    <link href="../css/mui.dtpicker.css" rel="stylesheet" />-->  
    <link rel="stylesheet" type="text/css" href="../css/mui.picker.min.css" />  
    <style>  
        html,  
        body,  
        .mui-content {  
            height: 0px;  
            margin: 0px;  
            background-color: #efeff4;  
        }  
        h5.mui-content-padded {  
            margin-left: 3px;  
            margin-top: 20px !important;  
        }  
        h5.mui-content-padded:first-child {  
            margin-top: 12px !important;  
        }  
        .mui-btn {  
            font-size: 16px;  
            padding: 8px;  
            margin: 3px;  
        }  
        .ui-alert {  
            text-align: center;  
            padding: 20px 10px;  
            font-size: 16px;  
        }  
        * {  
            -webkit-touch-callout: none;  
            -webkit-user-select: none;  
        }  
    </style>  
</head>  

<body>  
    <header class="mui-bar mui-bar-nav">  
        <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>  
        <h1 class="mui-title">dtpicker(日期时间选择器)</h1>  
    </header>  
    <div class="mui-content">  

        <button id="btn">新增日期</button>  

        <div class="mui-content-padded">  
            <h5 class="mui-content-padded">常规示例</h5>  
            <button id='demo1' data-name="drPicker" data-options='{}' class="btn mui-btn mui-btn-block ">选择日期时间 ...</button>  
            <h5 class="mui-content-padded">设定年份区间</h5>  
            <button id='demo2' data-name="drPicker" data-options='{"type":"date","beginYear":2014,"endYear":2016}' class="btn mui-btn mui-btn-block">选择日期 ...</button>  
            <h5 class="mui-content-padded">设定选中的时间</h5>  
            <button id='demo7' data-name="drPicker" data-options='{"type":"hour","customData":{"h":[{"text":"上午","value":"上午"},{"text":"下午","value":"下午"},{"text":"晚上","value":"晚上"}]},"labels":["年", "月", "日", "时段", "分"]}' class="btn mui-btn mui-btn-block">选择时段 ...</button>  
            <div id='result' class="ui-alert"></div>  
        </div>  
    </div>  
    <script src="../js/mui.min.js"></script>  
    <!--<script src="../js/mui.picker.js"></script>  
    <script src="../js/mui.dtpicker.js"></script>-->  
    <script src="../js/mui.picker.min.js"></script>  
    <script>  
    var num=0;  
    document.getElementById("btn").addEventListener("tap", function(){  
        var str = "<button id='selectGraduateDate"+eval(num+1)+"' data-name=\"drPicker\"    data-options='{\"type\":\"date\",\"beginYear\":1980,\"endYear\":2016}' style='float: right; margin-right: 10%; margin-top: 2%; font-size: 12px; border: 0px; color: #03a9f5;' class='btn mui-btn mui-btn-block'>选择日期 ...</button>";  

        var fragment = document.createDocumentFragment();  
        li = document.createElement('li');  
        li.className = 'mui-table-view-cell';  
        li.innerHTML = str;  
        fragment.appendChild(li);  
        document.querySelector(".mui-content").appendChild(fragment);  
    });  

        (function($) {  
            $.init();  
            var result = $('#result')[0];  
            mui(".mui-content").on("tap",".btn",function(event){  
                var e = event || window.event;  
                var target = e.target || e.srcElement;  
                if(target.nodeName == "BUTTON" && this.getAttribute("data-name") == "drPicker"){  
                    var optionsJson = this.getAttribute('data-options') || '{}';  
                    var options = JSON.parse(optionsJson);  
                    var id = this.getAttribute('id');  
                    /*  
                     * 首次显示时实例化组件  
                     * 示例为了简洁,将 options 放在了按钮的 dom 上  
                     * 也可以直接通过代码声明 optinos 用于实例化 DtPicker  
                     */  
                    var picker = new $.DtPicker(options);  
                    picker.show(function(rs) {  
                        /*  
                         * rs.value 拼合后的 value  
                         * rs.text 拼合后的 text  
                         * rs.y 年,可以通过 rs.y.vaue 和 rs.y.text 获取值和文本  
                         * rs.m 月,用法同年  
                         * rs.d 日,用法同年  
                         * rs.h 时,用法同年  
                         * rs.i 分(minutes 的第二个字母),用法同年  
                         */  
                        result.innerText = '选择结果: ' + rs.text;  
                        /*   
                         * 返回 false 可以阻止选择框的关闭  
                         * return false;  
                         */  
                        /*  
                         * 释放组件资源,释放后将将不能再操作组件  
                         * 通常情况下,不需要示放组件,new DtPicker(options) 后,可以一直使用。  
                         * 当前示例,因为内容较多,如不进行资原释放,在某些设备上会较慢。  
                         * 所以每次用完便立即调用 dispose 进行释放,下次用时再创建新实例。  
                         */  
                        picker.dispose();  
                    });  
                }  
            },false);//,false  
        })(mui);  
    </script>  
</body>  

</html>

w***@163.com

w***@163.com (作者)

<!DOCTYPE html>  
<html>  

    <head>  
        <meta charset="utf-8">  
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />  
        <title></title>  
        <!--标准mui.css-->  
        <link rel="stylesheet" href="../css/mui.min.css">  
        <!--App自定义的css-->  
        <link rel="stylesheet" type="text/css" href="../css/app.css" />  
        <!--<link href="../css/mui.picker.css" rel="stylesheet" />  
        <link href="../css/mui.dtpicker.css" rel="stylesheet" />-->  
        <link rel="stylesheet" type="text/css" href="../css/mui.picker.min.css" />  
        <style>  
            html,  
            body,  
            .mui-content {  
                height: 0px;  
                margin: 0px;  
                background-color: #efeff4;  
            }  
            h5.mui-content-padded {  
                margin-left: 3px;  
                margin-top: 20px !important;  
            }  
            h5.mui-content-padded:first-child {  
                margin-top: 12px !important;  
            }  
            .mui-btn {  
                font-size: 16px;  
                padding: 8px;  
                margin: 3px;  
            }  
            .ui-alert {  
                text-align: center;  
                padding: 20px 10px;  
                font-size: 16px;  
            }  
            * {  
                -webkit-touch-callout: none;  
                -webkit-user-select: none;  
            }  
        </style>  
    </head>  

    <body>  
        <header class="mui-bar mui-bar-nav">  
            <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>  
            <h1 class="mui-title">dtpicker(日期时间选择器)</h1>  
        </header>  
        <div class="mui-content">  

            <button id="btn">新增日期</button>  

            <div class="mui-content-padded">  
                <h5 class="mui-content-padded">常规示例</h5>  
                <button id='demo1' data-name="drPicker" data-options='{}' class="btn mui-btn mui-btn-block ">选择日期时间 ...</button>  
                <h5 class="mui-content-padded">设定年份区间</h5>  
                <button id='demo2' data-name="drPicker" data-options='{"type":"date","beginYear":2014,"endYear":2016}' class="btn mui-btn mui-btn-block">选择日期 ...</button>  
                <h5 class="mui-content-padded">设定选中的时间</h5>  
                <button id='demo7' data-name="drPicker" data-options='{"type":"hour","customData":{"h":[{"text":"上午","value":"上午"},{"text":"下午","value":"下午"},{"text":"晚上","value":"晚上"}]},"labels":["年", "月", "日", "时段", "分"]}' class="btn mui-btn mui-btn-block">选择时段 ...</button>  
                <div id='result' class="ui-alert"></div>  
            </div>  
        </div>  
        <script src="../js/mui.min.js"></script>  
        <!--<script src="../js/mui.picker.js"></script>  
        <script src="../js/mui.dtpicker.js"></script>-->  
        <script src="../js/mui.picker.min.js"></script>  
        <script>  
        var num=0;  
        document.getElementById("btn").addEventListener("tap", function(){  
            var str = "<button id='selectGraduateDate"+eval(num+1)+"' data-name=\"drPicker\"    data-options='{\"type\":\"date\",\"beginYear\":1980,\"endYear\":2016}' style='float: right; margin-right: 10%; margin-top: 2%; font-size: 12px; border: 0px; color: #03a9f5;' class='btn mui-btn mui-btn-block'>选择日期 ...</button>";  

            var fragment = document.createDocumentFragment();  
            li = document.createElement('li');  
            li.className = 'mui-table-view-cell';  
            li.innerHTML = str;  
            fragment.appendChild(li);  
            document.querySelector(".mui-content").appendChild(fragment);  
        });  

            (function($) {  
                $.init();  
                var result = $('#result')[0];  
                mui(".mui-content").on("tap",".btn",function(event){  
                    var e = event || window.event;  
                    var target = e.target || e.srcElement;  
                    if(target.nodeName == "BUTTON" && this.getAttribute("data-name") == "drPicker"){  
                        var optionsJson = this.getAttribute('data-options') || '{}';  
                        var options = JSON.parse(optionsJson);  
                        var id = this.getAttribute('id');  
                        /*  
                         * 首次显示时实例化组件  
                         * 示例为了简洁,将 options 放在了按钮的 dom 上  
                         * 也可以直接通过代码声明 optinos 用于实例化 DtPicker  
                         */  
                        var picker = new $.DtPicker(options);  
                        picker.show(function(rs) {  
                            /*  
                             * rs.value 拼合后的 value  
                             * rs.text 拼合后的 text  
                             * rs.y 年,可以通过 rs.y.vaue 和 rs.y.text 获取值和文本  
                             * rs.m 月,用法同年  
                             * rs.d 日,用法同年  
                             * rs.h 时,用法同年  
                             * rs.i 分(minutes 的第二个字母),用法同年  
                             */  
                            result.innerText = '选择结果: ' + rs.text;  
                            /*   
                             * 返回 false 可以阻止选择框的关闭  
                             * return false;  
                             */  
                            /*  
                             * 释放组件资源,释放后将将不能再操作组件  
                             * 通常情况下,不需要示放组件,new DtPicker(options) 后,可以一直使用。  
                             * 当前示例,因为内容较多,如不进行资原释放,在某些设备上会较慢。  
                             * 所以每次用完便立即调用 dispose 进行释放,下次用时再创建新实例。  
                             */  
                            picker.dispose();  
                        });  
                    }  
                },false);//,false  
            })(mui);  
        </script>  
    </body>  

</html>

该问题目前已经被锁定, 无法添加新回复