web开发中所遇到的问题总结

web开发中所遇到的问题总结

jquery miniui开发问题:

2017/3/28
  1. 当你用了Class="mini-button" id="btn1"这样可以用mini.get("btn1").getValue()来获取值,如果是id="obj" 这样就直接用document.getElementById("obj").value来获取。

  2. 数据验证

监听处理控件的"validation"事件,自定义验证规则和错误描述信息:

      function onUserNameValidation(e) {
         if (e.isValid) {  
           if (isEmail(e.value) == false) { 
            e.errorText = "必须输入邮件地址";             
            e.isValid = false; 
           }
       }
   } 
  1. 使用mini.Form组件对多个控件进行验证:

var form = new mini.Form("#form1");form.validate();

加载表单

    $.ajax({

    url: "../data/FormService.aspx?method=LoadData",  

    type: "post",

    success: function (text) {         

        var data = mini.decode(text); //mini.decode(data) 反序列话为对象        

        form.setData(data); //设置多个控件数据   

        }

});

提交表单
//提交表单数据

var form = new mini.Form("#form1");
var data = form.getData();      //获取表单多个控件的数据`
var json = mini.encode(data);   //序列化成JSON`
$.ajax({
url: "../data/FormService.aspx?method=SaveData",
type: "post",
data: { submitData: json },
success: function (text) {
    alert("提交成功,返回结果:" + text);

}

});
清除表单

form.clear();

重置表单

form.reset();

  1. checkRecursive Boolean 是否联动选择父子节点。比如选中父节点,自动全选子节点。 false √ √ √

autoCheckParent Boolean 是否自动选择父节点。比如选中子节点,将父节点也自动选中。

后台开发沟通问题:

  1. 项目文件夹的规范统一。

  2. 所有的标签的元素和属性都必须小写 ,尽量用驼峰命名,不用中文名。项目中有name用了大写,后台就麻烦,还得重新修改。tab和空格不要乱用

  3. 在jquery mini UI中用 mini.Form(),可以快速序列化,只支持input标签,并且加入class=“mini-”前缀,不然没法获取到value值,用form.getData()就可以获取到 {key:value,...}

mini.encode(data);序列化为json, 其他的比如用select用option。就要用

$.extend({},bccFormData,{'see': $("input[type='radio']:checked").val()})方法。

  1. 表单验证onvalidation="onUserNameValidation",加vtype 不需要自己写正则,可以自定vtype="email;rangeLength:5,20;"
function onUserNameValidation(e) {
    if (e.isValid) {  
        if (isEmail(e.value) == false) { 
            e.errorText = "必须输入邮件地址";             
            e.isValid = false; 
       }
    }
} 

注:使用mini.Form组件对多个控件进行验证:

var form = new mini.Form("#form1");

form.validate();

  1. input传值获取name /id 都必须有class"mini-"

  2. 主页面index.html与子页面之间iframe,子页面要获取父值就要加上window.parent.get.mini();

  3. sender与EventArgs 它们的用处主要在多个不同的对象需要调用同一个方法时。比如,如果你有两个BUTTON控件,需要调用同一个方法,此时你就可以用sender来确定是哪一个BUTTON调用了当前的方法。而使用e就可以获得不同BUTTON传入的不同的调用参数。

      如果是自定义的函数、方法,不需要处理这些参数时,就可以不带这些参数。

e:存放一些传递参数  EventArgs 顾名思义就是关于这个事件的一些参数

前端开发中的一些实用工具

jsbin

jsfiddle

codepen

  • 前端常用开发工具

vscode

sublime

atom

  • 浏览器

chrome:开发

IE,Firefox: 产品环境浏览器

  • 版本管理工具

svn

Git

  • node相关

安装node.js

安装yarn

  • 文档书写

markdown

  • 原型设计工具

Axure

前端开发中所用到的框架

  • 移动端开发使用的框架

amazeui

sui mobile

ant design mobile

angular.js

Bootstrap

zepto很少用

jQuery Mobile

  • 设计模式

详细视图

  • chrome开发者工具文档

chrome开发者工具文档中文版

项目开发平日总结

2017/3/30
  1. 清除input框中的text文本mini.get(ID).setText("")

  2. 更新tabs中url,返回时要更新form表单中的值,通过传值决定,待解决.....

  3. 绑定事件时,出现一直绑定时,要先解绑,再绑定 unbind.....bind

2017/4/1
  1. mini-tabs如何调用每个tab中的js方法

调用tab中的js方法

  1. 如何判断tabs.addTab(tab) 的时候 子页面加载完成了

  2. 获取到tabs对象,怎么才能获取下面的tab页中的数据

  3. tabs.addTab(tabA)后,tabA的内容何时加载

  4. tabs从整体页面调用子页面的方法

  5. tabs能否不自动加载子页面的内容

  6. javascript的封装思想

2017/4/5
  1. jquery miniUI中form表单的封装思路,持续开发中,var valuechang=function(id){return ......}此方法的调用。
2017/4/6
  1. 展开收起的切换,用toggle(),addclass,removeclass或者使用hide(),show()方法改变元素的style
2017/4/10
  1. 用amazeui 框架布局问题,局限性是太过于规整,无法实现灵活性强的开发,API太过于散乱琐碎,需要再次封装(个人看法)
2017/4/12
  1. angluar页面间路由跳转、在路由中获取jquery元素问题,不在同一控制器中采用$rootScope声明全局变量获取元素
2017/4/17
  1. (1)chrom浏览器解决本地跨域报错 给chrome添加启动参数:--allow-file-access-from-files,这样本地ajax请求就不会报跨域错误。还可以解决本地file加载文件

(2)导致iframe和父页无法相互访问,window.open打开的页面使用opener为null的问题,参考:chrome本地测试访问iframe,parent,opener null解决办法

注意:如果给chrome添加多个启动参数,每个启动参数“--”之前要有空格隔开,如"C:\Program Files\Google\Chrome\Application\chrome.exe" --enable-file-cookies --allow-file-access-from-files)

  1. 通过addclass、removeclass,运用class的优先级添加切换样式的改变

  2. 通过::before :after改变添加样式,三角之间的切换,定位。就是通过border画各种图形

2017/4/18
  1. 解决锚点(angluar)平滑滚动到最顶部问题:

    $rootScope.jumpTop=function(id){

       var pos = $(id).offset().top

       $("html,body").animate({scrollTop:pos},1000)

      }
  1. a标签href不跳转 禁止跳转

(1) 标签属性href,使其指向空或不返回任何内容。如:

[点此无反应javascript:void(0)](javascript:void(0);)

[点此无反应javascript:](javascript:;)

(2) 标签事件onclick,阻止其默认行为。如:

`return false;

return false;`

用法格式如下:

a).javascript:void (expression)

b).javascript:void expression

你以使用 void 操作符指定超级链接。表达式会被计算但是不会当前文档处装入任何内容。所以,javascript:void(0)仅仅表示一个死链接。

标签事件onclick="return false;"在HTML代码中,无论你在哪里放置了onclick事件,并且返回值为false时,那么该处的默认行为将不会执行。这里的默认行为是指没有Onclick事件时原本的行为。

最后,我们来回顾下a标签的三种用法:

`W3School

index

top`

注意:只有一个href="#"是不可以的

因为#包含了一个位置信息,默认的锚是#top 也就是网页的上端。锚是指网页中具体位置。

例如:

首先我们在网页body内最上面添加一个``

我们再到body内,需要出现点击后转到顶部位置添加,[回到顶部](http://www.jianshu.com/writer#top)

点击回到顶部即可让滚动回到顶部。

2017/4/22
  1. 在click之后改变其他样式,之后其他地方click自身,再点击click时无反应,此时在第一个click中需要遍历要改变的那个属性DOM元素

  2. 在跨页面传参时要传data,比如mini.open:

父页面://弹框严重性

     function openseverity(e) {

        var currentRow = grid.getSelected();

        var row = grid.indexOf(currentRow);

        var  id=grid.data[row]["id"];

        var btnEdit = this;

        console.log(btnEdit);

        console.log(id);

        mini.open({

            url: "severity.html",

            width: 800,

            height: 500,

            onload: function () {

                var iframe = this.getIFrameEl();

                var data={id:id};

                iframe.contentWindow.SetData(data);

            },

            ondestroy: function (action) {

                if (action == "ok") {

                    var iframe = this.getIFrameEl();

                    var data = iframe.contentWindow.GetData();

                    data = mini.clone(data);

                    btnEdit.setValue(data.id);

                    btnEdit.setText(data.text);

                }

            }

        });

    }

子页面://接收父页面传过来的数据

function SetData(data) {

          console.log(data);

          //跨页面传递的数据对象,克隆后才可以安全使用

          data = mini.clone(data);

          $.ajax({

              url: "data/possiblity.json?&id="+data.id,

              cache: false,

              success: function (text) {

                  console.log(text);

                  var o = mini.decode(text);

                  form.setData(o);

                  form.setChanged(false);

              },

              error:function(){

                  console.log("错误");

              }

          });

      }
2017/5/15

前端开发项目目录:

avatar
  1. 注册七牛云服务

  2. 引入images 链接

2017/5/16

1.trigger()方法的使用: trigger() 方法触发被选元素的指定事件类型。trigger() 方法触发被选元素的指定事件类型。trigger() 方法触发被选元素的指定事件类型。

  1. 选择改变有默认值的效果
    请选择: 男:女: 提交

        var feedbackCfg = {

            '0': {

                label: 'haha',

                placeholder: '11',

                value: ''

            },

            '1': {

                label: '33',

                placeholder: '33',

                value: ''

            }

        };

        $(".feedbackCnt").css({

            "display": "none"

        })

        $(".div").css({

            "margin": "0 auto",

            "width": "400px",

            "height": "400px",

            "background": "#e7e7e7"

        });

        var sd = $(".div").find('input[type="radio"]');

        sd.on("click", function (event) {

            if (event.target.checked) {

                console.log(feedbackCfg);

                $(".feedbackCnt").show();

                $("label").eq(0).html(feedbackCfg[event.target.value].label);

                feedbackCfg[event.target.value === "1" ? "0" : "1"].value = $("textarea").val();  

                $("textarea").attr('placeholder',  
  feedbackCfg[event.target.value].placeholder).val(feedbackCfg[event.target.value].value);

            }

        })
  1. 判断JS对象是否拥有某属性

两种方式:

(1). in 运算符

var obj = {name:'jack'};

alert('name' in obj); // --> true

alert('toString' in obj); // --> true

可看到无论是name,还是原形链上的toString,都能检测到返回true。

(2). hasOwnProperty 方法

var obj = {name:'jack'};

obj.hasOwnProperty('name'); // --> true

obj.hasOwnProperty('toString'); // --> false

`

2017/5/24
  1. 动态添加的元素获取不到,绑定事件失败(采用deleget live绑定元素事件,用each遍历document元素)。
    $(document).on("click",".btnDel",function(){
        $(this).parent().remove();
    });
  1. select中option的清空(用is()方法)
      $(document).find(".open .selectpicker").each(function(i,ele){
            $(ele).children("li").each(function(j,el){
                if($(el).is(".selected")){
                    $(el).removeClass("selected");
                    $(".pull-left").html("没有一项被选中");
                    $("button.selectpicker").attr("title","没有一项被选中");
                }
            })
        })。 
  1. 模态框关闭时传值未结束,提前关闭问题(采用hide.bs.modal解决)。
    $('#myModal').on('hide.bs.modal', function () {
    })

模态框打开时时执行事件

    $(".modal").on("shown.bs.modal", function (){
    })
2017/5/27
  1. 获取form表单时,将数据转化为json字符串 ,报错

解决方法:JSON.stringify()方法 将数组,对象转成json

  1. 行内标签设置display:block后采用float布局,又有横行的margin的情况,ie6间距bug

解决方法:在display:block;后面加入display:inline;display:table;

2017/6/1
  1. idea安装配置tomcat时,do nothing ,导致idea有时重启服务不能更新文件(重新配置tomcat update classes and resources)
2017/6/2
  1. vue.js中 组件先注册,才能使用,如果反过来会报错。

  2. 路由嵌套会将其他组件渲染到该组件,而不是进行整个页面跳转router-view本身就是将组件渲染到该位置,要进行页面跳转,就要将页面渲染到根组件,在起始配置路由:
    var App = Vue.extend({ root });

    router.start(App,'#app');

2017/6/6
  1. 使用jQuery的ajax异步请求时,后台的代码执行成功,不执行success回调,但却执行error回调函数。

解决方法:费了好大的劲才发现在ajax执行send方法之前,就已经访问了一次后台。纳闷呀。

经过分析前台代码发现当使用ajax的事件源是button(button在form中,默认是自动提交的)或href时,使用Jquery的Ajax时就会出现这种问题,最后将Button加上了一个type="button"该问题就解决了。开心飞起。。。。

  1. 处理object,json方法:
    function _json2str(o) {
            var arr = [];
            var fmt = function(s) {
                if (typeof s == 'object' && s != null && s != 'null') return _json2str(s);
                return /^(string|number)$/.test(typeof s) ? "'" + s + "'" : s;
            };
            var fmt2 = function(s) {
                if (typeof s == 'object' && s != null && s != 'null') return _json2str(s);
                return s;
            };
            for (var i in o)
            {
                console.log(i);
                console.log("o",o);
                arr.push("" + fmt(o[i].attr("name")) + ":" + fmt2(o[i].val()));
            }
            return '{' + arr.join(',') + '}';
        }
2017/6/9
  1. 返回json对象:
    function isArray(object){

        return object && typeof object==='object' && Array == object.constructor;

    }
  1. 判断对象(数组:是否为空数组)
 function isEmpty(value) {
   return (Array.isArray(value) && value.length === 0) ||  
    (Object.prototype.isPrototypeOf(value) && Object.keys(value).length === 0);
}
  1. 判断某个对象是不是数组
    function isArray(obj) {
      return obj && ( typeof obj === 'object') && (obj.constructor == Array);}

//eleNum变量初始值为0,用来统计数组元素个数

var eleNum = 0;

//递归计算某个数组元素是不是下一维数组,如果是,则继续递归下去;如果不是,统计元素个数。

    function recursion(obj) {
    if (isArray(obj)) {
    for (var j = 0; j < obj.length; j++) {
    if (!isArray(obj[j])) {
    eleNum++;
    continue;
    }
    recursion(obj[j]);
    }
    } else {
    eleNum++;
    }
    }

//arr为要计算数组元素个数的一维或多维数组,通过调用递归函数recursion返回数组元素个数

    function getArrNElementNum(arr) {
    if (arr == null) {
    return 0;
    }
    recursion(arr);
    return eleNum;
    }
2017.6.26
  1. 人大项目中问题:每次遍历编号查询时都会出现两次那边,时间查询也是。

问题所在:遍历时用了"||",导致其中一个为true也会再次遍历。

解决方法:采用单个遍历元素


    if($(elem).is("input[name=minCode]")){

                    textArray.push($(elem).parent().parent().find("label").html()+':大于'+$("input[name=minCode]").val());

                }if($(elem).is("input[name=maxCode]")){

                    textArray.push($(elem).parent().parent().find("label").html()+':小于'+$("input[name=maxCode]").val());

                }if($(elem).is("input[name=userYearStart]")){

                    textArray.push($(elem).parent().parent().find("label").html()+':大于'+$("input[name=userYearStart]").val());

                }if($(elem).is("input[name=userYearEnd]")){

                    textArray.push($(elem).parent().parent().find("label").html()+':小于'+$("input[name=userYearEnd]").val());

                }
  1. miniui中的不需要的元素可以将其display:none
2017.6.27

1、 采用bootstarp中form-group代替ul>li布局人大项目中基本查询和高级查询。

解决:小屏设备,单条100%宽度的变化问题,行列对齐问题

2017.6.28
  1. 如果你的参数不确定 那么最好的方法就是传入一个函数 在返回一个执行这个函数的函数 也就是函数编程思想 这个执行函数还可以绑定这对象的作用域 这样灵活性就大大提高了
    var obj = {
    a: 'a',
    test:function(fn){
        return function(...args) {
            fn.apply(this, args)
        }.bind(this)
      }
    }
    var newFn = obj.test(function(b) {
    console.log(this.a + b)
    })
    newFn("dz")
// 相当于obj + 'b'
2017.6.30
  1. jsonp跨域问题

        function handleResponse(response) {
            alert("you are at IP address " + response.ip + ", which is in " + response.city + ", " + response.region_name);
        }
        var script = document.createElement("script");
        script.src = "http://freegeoip.net/json/?callback=handleResponse";
        document.body.insertBefore(script, document.body.firstChild);
        $(function () {
            $(" ", {
                "class": "test",
                "text": "jquery1.8",
                "click": function () {
                    $(this).toggleClass("text");
                }
            }).appendTo("body")
        })
    ```

2. js中的localstion方法

//简单跳转

 function gotoPage(url) {   

  var url ="url?catalogid="+catalogID;

   window.location =url;  

 }

//为单个页面传递参数

function goto_catalog(iCat) {
  if(iCat<=0) {
  top.location = "url";
    } else {
  window.location ="url?catid="+iCat;
  }
}

// 对指定框架进行跳转页面

function goto_iframe(url) {
 parent.mainFrame.location ="url";
} 

######2017.7.14

1. position 定位元素,如果子级元素层级要高于父级,父级就不能设置position。子级:`position:absolute/relative/fixed,z-index:1;`

2. 兼容所有浏览器的渐变:

.gov .mini-layout-region-center  .mini-layout-region-body{
  width: 100%;
  background: -moz-linear-gradient(top, #21618e 0%, #0dbd74 100%);
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#21618e), color-  stop(100%,#0dbd74));
  background: -webkit-linear-gradient(top, #21618e 0%,#0dbd74 100%);
  background: -o-linear-gradient(top, #21618e 0%,#0dbd74 100%);
  background: -ms-linear-gradient(top, #21618e 0%,#0dbd74 100%);
  background: linear-gradient(to bottom, #21618e 0%,#0dbd74 100%);
  filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#21618e',endColorstr='#0dbd74',GradientType=0 );
  }
:root .gradient{filter:none;
  width: 100%;
}

3. mini-col布局:间隔可以在col-12里面再layout-row中分,margin:"间隔值

`

#### 人大建议

                                未确定承办单位

                                [12](http://www.jianshu.com/writer)

                        .......`

######2017.8.3

1. 跨页面数据获取数据:子页面需要获取到form表单中的数据回显,但是base.js中的mounted,无法获取到,所以要通过list表格中的当前行数据获取传入form表单。子页面添加deps:[{key:"data"}]模块,并且扩展方法,list页面直接调用。

用法实例:form 页面:

var ebapForm = ebapBase.get({
    id:'form',  
    key: 'form',  
    settings:{  
        save: "/noticeInfo/save",  
        set:  "/noticeInfo/findById"  
    },  
    deps: [  
        {  
            key: 'pcc.data',  
        }  

    ],  

    mounted: function (moduleIns) {  

        var depsData=moduleIns.moduleDeps.pccdata;  

        var form=moduleIns.getIns();  

        mini.parse();  

        return $.extend(moduleIns, {  

            setRowsData: depsData.setRowsData,  

            getRowsData: depsData.getRowsData,  

            perform: function(){  

                mini.get("fileupload").setText(ebapForm.getRowsData("filename")); //将文件名set进上传的input框中(在进行数据回显的时候)  

                mini.get("delFileId").setValue(ebapForm.getRowsData("id"));  

                //$(".fileVersion").attr("id",mini.getbyName("uploadFileUid").getValue());  

            },  

            delFile:function () {  

            },  

        })  

    }  

}); 

var ebapList = ebapBase.get({  

    id: 'datagrid',  

    key: 'list',

    settings:{  

        add:"/noticeInfo/form",  

        edit:"/noticeInfo/form",  

        del: "/noticeInfo/delete?id=",  

    },  

    openCfg:{  

        width: 800,  

        height: 210,  

    },  

    created: function(ins) {  

        if (ins) {  

           ins.reload();  

            ins.on('drawcell', function (e) {  

                var record = e.record,  

                    column = e.column,  

                    field = e.field,  

                    value = e.value;  

                if (field == "title") {  

                    e.cellStyle = "font-weight:bold;cursor:pointer;"  

                    e.cellHtml = '[' + value + '](javascript:void(0))';  

                }  

            });  

        }  

    },  

    mounted: function (moduleIns) {  

        var grid = moduleIns.getIns();  

        ebapUtils.eventProxy({  

            context: $('.gov'),  

            tagName: 'a',  

            cls:"ebap-showEdit" ,  

            cb: function(targetInfo) {  

                var id = grid.getSelected().id;  

                ebapList.edit({  

                    edit:{  

                        title:'回复通知单',  

                        mode:{  

                            url:'/noticeInfo/noticeUnitForm?id='+id,  

                        },  

                        callback: function(opts) {  

                           opts.context.ebapForm.setRowsData(opts.selectedRows);  

                           opts.context.ebapForm.preOnloadForm();  

                        }  

                    }  

                });  

            }  

        });  

        return $.extend(moduleIns, { 

            fuzzyquery: ebapUtils.fuzzyquery,  

            openmenu: ebapUtils.columnfilter(grid).toggle,  

            search:function() {  

                var key = mini.get("key").getValue();  

                grid.load({ loginName: '%' + key + '%' });  

            }  

        });  

    }  

});

######2017.8.20

1. $.fn.test=text function(){}

注释:【在 jQuery 中,fn 其实就是 JavaScript 中 propotype 的一个别名,$ 是 jQuery 的别名,所以

$.fn.pluginName 等同于 jQuery.prototype.pluginName】,扩展jquery方法所用。

用法:
$.fn.setRedText = function() {

return $(this).css("color", "red");

};

$("p").setRedText();

######2017.8.24

1. 监听打开的弹窗,关闭后刷新页面

function openWin(url,text,winInfo){
var winObj = window.open(url,text,winInfo);  

var loop = setInterval(function() {       

    if(winObj.closed) {      

        clearInterval(loop);      

        //alert('closed');      

        parent.location.reload();   

    }      

}, 1);     
}

######2017.11.17(丰台quzhenfu项目-上传文件) 

1. 文件上传功能在IE中的兼容(前端文件大小限制,ie10以上或者非IE)

var userAgent = navigator.userAgent;
var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera; //判断是否IE浏览器
var reIE = new RegExp("MSIE (\\d+\\.\\d+);");

reIE.test(userAgent);

var fIEVersion = parseFloat(RegExp["$1"]);

if(!isIE || fIEVersion>=10){

    if(inputFile.files.length > 0 && inputFile.files[0].size>(4*1024*1024)){

        ebapUtils.tipbox({

            type:"warning",

            msg:"附件大小不能大于4MB!"

        });

        return;

    }

}

######2017.11.29(北京shizhenfu项目-承办单位选择) 

1.默认树选择最后一级可以选中,父级选中没有默认不能选中,提交不能有空字段。(思路:遍历树节点:是否含有该字段)

adds:function (number) {

var node = this.config.$tree.getSelectedNode();

if (node.hasOwnProperty("pid")) {

    var ids = [], texts = [];

    ids.push(node.id);

    texts.push(node.text);

    var data = {};

    data.id = ids.join(",");

    data.text = texts.join(",");

    var gridDataLength=this.config.$grid.getData().length;

    var gridData=this.config.$grid.getData();

    var boolean=false;

    var items = mini.clone(data);

    if(number == null){

        for (var i = 0;i

            if (gridData[i].id == items.id) {

                boolean=true;

            }

        }

            if(gridDataLength.length  > number){

                alert("您最多可以选"+number+"项");

            }else{

                for (var i = 0;i

                    if (gridData[i].id == items.id) {

                        boolean=true;

                    }

                }

                if( boolean==false){

                    this.config.$grid.addRow(data);

                }

            }

        }else {

            alert("您最多可以选"+number+"个承办单位,如果要选择多个承办单位,请联系政府用户。");

        }

    }

}

}

2. 跨页面传值,提交树节点值。

 GetData:function () {

var data = this.config.$grid.getData();

var ids = [], texts = [];

for (var i = 0, l = data.length; i < l; i++) {

    var node = data[i];

    ids.push(node.id);

    texts.push(node.text);

}

var data = {};

data.id = ids.join(",");

data.text = texts.join(",");

return data;

}

######2017.12.12(北京shizhenfu项目-主办多文件跨页面上传文件)

1. 遍历所有 array[{"key":value}],去重

function uniq(array){

    var unique = {};

    array.forEach(function(gpa){ unique[ JSON.stringify(gpa) ] = gpa });

    array = Object.keys(unique).map(function(u){return JSON.parse(u) });

    return array;

      }

2. 生成array[{name:{"key":value}}.....]

```var array=[];var data={};var filename=iframe.contentWindow.ebapForm.getFileName();data.inputFile=iframe.contentWindow.$("#fileupload > input:file")[0];data.inputValue=iframe.contentWindow.mini.get("fileupload").getValue();console.log(fileId)
  1. 检测对象中是否含有某个元素(i.hasOwnProperty(ch)):
      removeFile:function(i){

        $(i).parent().remove();

        var ch=$(i).parent().attr("id");

        fileArray.forEach(function(i){

            if(i.hasOwnProperty(ch)){

                fileArray.remove(i);

            }

        });

    },
2017.12.15
  1. 遮罩拖拽

(1)原生:

 
        if(document.getElementById('theme-popover')) {

        var theme= document.getElementById('theme-popover');

        theme.onmousedown = function(ev) {

        var oevent = ev || event;

        var distanceX = oevent.clientX - theme.offsetLeft;

        var distanceY = oevent.clientY - theme.offsetTop;

        document.onmousemove = function (ev) {

            var oevent = ev || event;

            theme.style.left = oevent.clientX - distanceX + 'px';

            theme.style.top = oevent.clientY - distanceY + 'px';

        };

        document.onmouseup = function () {

            document.onmousemove = null;

            document.onmouseup = null;

        };}}

(2)jquery:

    $(document).mousedown(function(){

        $(this).mousemove(function(e){

            $("#theme-popover").css({ "left": e.pageX+"px", "top": e.pageY+"px" });

            $(document).mouseup(function(){

                $(this).unbind('mousemove');

            })

        })

    });
2017.12.26
  1. Array.concat() 方法用于连接两个或多个数组http://www.w3school.com.cn/jsref/jsref_concat_array.asp.

eg: data.recodeList=data.recodeList.concat(ret.data.recode); concat() 方法用于连接两个或多个数组。

2017.12.27renda建议公开
  1. 移动端开发,IOS、iPhone,表单input元素获取焦点时页面被放大的解决办法。

  2. ie8下a标签中的图片出现边框

解决:img{border:none;}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269