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 顾名思义就是关于这个事件的一些参数

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

  • Browsersync:省时的浏览器同步测试工具,同步浏览器

  • bejson:在线,JSON,JSON校验,格式化

  • jsonohyeah:模拟后端接口数据工具、url自动生成

  • nodemon:node进程管理工具,修改node代码,会自动重启

  • webpack:流行的打包工具

  • gulp:前端任务管理工具

  • 前端在线编辑器

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

前端开发项目目录:

web开发中所遇到的问题总结_第1张图片
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);}`
    
  2. 判断某个对象是不是数组

`

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")

    })

`
  1. 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%;

}`
  1. 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+"个承办单位,如果要选择多个承办单位,请联系政府用户。");

        }

    }

}

}`
  1. 跨页面传值,提交树节点值。

`

 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;

      }`
  1. 生成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;}

你可能感兴趣的:(web开发中所遇到的问题总结)