问题&提示&小tips

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29238009/article/details/76582069

前端:

问题&提示

——————————————————————————2017.8.2

1. 网页适配时候,如果元素width height 没有固定(百分比显示),那么需要测试不同窗口大小时候的显示情况(调整浏览器大小,缩放浏览器,修改计算机分辨率,更换浏览器测试等)

——————————————————————————2017.8.8

1.设置margin的时候,记得要写上position。。。不然margin不知道相对什么层面进行偏移。(看起来好简单但是老是忘记T.T)

——————————————————————————2017.8.17

1. 如果外部变量A=0在ajax里面赋值A=1,之后变量A在ajax以外还需要使用的话,例如流程为:

function main(){

var A = 0;

  ajax(

...................

success:function(){

A = 1;

}

..................

);

func_b(A);

}

那么此时func_b获取的A的值为0,而不是1。

因为ajax是异步的,所以脚本不会等ajax走完整个流程再进行下一步,那么在初始化A之后,开始了ajax,那么就会跳过ajax,然后直接执行func_b,此时func_b获取的A的值为0,然后等ajax异步完成后A的值才会变成1。

解决方法:1.将ajax设为同步    2. 将需要使用ajax处理的数据的脚本段落整合到ajax里面,例如把func_b写进ajax里面。

——————————————————————————2017.8.26

1. $("#xxx")和document.getElementById(‘xxx’)并不是完全相同的

例如现在有<input type="file" id="attachment" name="attachment" multiple>

然后现在要检查input里面有多少个文件,使用length属性,那么$('attachment').length是获取不了input里面的文件数量的,

而document.getElementById(‘attachment’).length则可以正确获取文件数量。

因为$返回的是jQuery对象,另外那个返回的是dom对象,而多文件input的length是属于dom的一个属性,那么前者则不能正确获取文件数量。

可以进行两者间的转换,$('#attachment')[0].length则可以获取jQuery中的dom,从而正确获取length属性。

dom转换成jQuery可以使用$(document.getElementById(‘xxx’))的方法,这样就能获取jQuery对象,可以进行jQuery的操作



小tips:

——————————————————————————2017.8.19

1.


var btns = '<button class="btn">1</button><button class="btn">2</button><button class="btn">3</button>';
现在需要将btns插入html中,但是事先需要处理
用$(btns).find('button').first()是处理不了里面的元素的
那么采用下面这种方法能够处理还没有插入html的元素

var div = $('<div></div>');
div.append($(btns));
 
 
var first = div.find('button').first();
现在first就是获取到的第一个button的dom了,可以用这种方法将btns中的N个元素都逐一取出来做特定的处理(任何jQuery处理都可以,就当已经在html上了,实际上却还没有写入页面),然后逐一append到需要插入的元素中


—————————————————————————2017.8.23

1. 可以用$.ajaxSetup来预设所有$.ajax都会通用的属性,例如laravel中通信要在头部加上X-CSRF-TOKEN,本来是每个ajax的beforeSend都要写上

request.setRequestHeader("X-CSRF-TOKEN", $('meta[name="csrf-token"]').attr('content'));

但是现在可以用下面代替,写一个在script前头,后面写的ajax就都会带上ajaxSetup的设置了(ajaxSetup:设置AJAX的全局默认设置

$.ajaxSetup({
   headers: {
      'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
   }
});

更多ajax详细参数列表可以看我转载的这个文章

http://blog.csdn.net/qq_29238009/article/details/77506048


2.  jQuery中html() 和 text()的小区别:

html() : html页面代码:<div><span>Hello</span></div>

jquery代码:$(“div”).html();

结果:<span>Hello</span>


text() : html页面代码:<p><span>Hello<span><div> fine</div></p>

jquery代码:$(“p”).text();

结果:Hello   fine


——————————————————————————2017.9.14

1.有些操作会跳转到空白页再执行的,页面无用,跳转效果有用(如下载,验证,弹出打印)的操作,使其不跳转也能实现。在本页面上内嵌一个iframe元素,相当于嵌入一个新的页面,隐藏起来,那么就不会跳转,但是会在本页面上产生跳转的效果。


——————————————————————————2017.9.22

modal在用js动态加载了超过一页的dom时,会不滚动。

overflow:auto !important

加上这个css就会自动滚动了,算是bug???

——————————————————————————2017.12.29

1.昨天遇到一个对象的问题。在js里面,我有一个全局多维数组变量data,我在一个函数A里面用一个局部变量a取出一部分使用,a=data['item'],后面又运行了函数B,在B里面也用到了局部变量b取出data的一部分,b=data['item']。然后发现在b里面处理的数据,初始值不同了。然后我把A方法注释掉就可以了,那么我猜测应该是改到了全局变量,还好我代码不太长,找一下最可能的就是a = data['item']这里是取地址了。这真的是大学毕业后第一次遇到深浅拷贝的问题了。然后我查了下百度,问了下一个前端的朋友,这里给出个解释。

js里面json,数组,对象这些都算是object?反正就是用到这些东西,直接变量等号变量,都是取地址的操作,就是浅拷贝。那么深拷贝的话,我这个朋友给了我一个很技巧性的方法,就是a = JSON.parse(JSON.stringify(data))。

我的理解就是把data转成字符串,字符串是不会共享地址的,那么这个data字符串就去到一个新的地址了,然后再将data字符串转成json对象,这样又去了一个新的地址了,那么现在这个a就和原来的data不同地址了


——————————————————————————2018.2.25

1. 

$(document).ready() 与window.onload是有区别的,

可以看看这个文章:http://www.jb51.net/article/21628.htm

===========================================================前端后台分割线==================================================================

后端:

——————————————————————————2017.8.10

1.根据laravel分页(http://laravelacademy.org/post/3246.html#ipt_kb_toc_3246_4),虽然以前项目里没有把page带进查询构建器中指定第几页,但是这里2.1中写着只要参数有写?page=xxx,那么laravel会默认检查并且带入分页器(paginate)里查询。。。所以不用觉得在代码里面找不到page参数感到奇怪

1.1(补充)也可以在获取了collection集合后,用forPage($page,$limit)获取特定的页数


——————————————————————————2017.8.25
1. laravel 的Storage门面默认地址是storage/app,这是因为config/filesystems.php中的local根目录是storage_path('app'),所以用Storage这个门面都是从storage/app这个目录开始操作的。可以把根目录storage_path('app')改成你需要的地址


——————————————————————————2017.9.2

1.laravel中当你原本use 了一个东西,例如 我use App\Service\MyService,然后我需要更改命名空间了,例如我要吧MyService放到A文件夹里面,那么我放进去,在MyService里面把namespace改成了App\Service\A\MyService,在原本用这个MyService的地方把use 改成 use App\Service\A\MyService,它居然还会报错,说class not found,但是如果你新增一个命名空间下的新类则没这个问题。我查了下网,觉得这是同名类则会从原来的缓存中获取,不会重新加载,而新增类则会从新加载进去。

解决方法:改好命名空间和use后,在项目运行下 

composer dump-autoload -o

然后就能正确找到你要的类了


——————————————————————————2017.9.12

1. 最近用了下PHPExcel这个插件做表,然后发现自己保留的两位小数,例如5.00插进表格里面变成了5,在表格里面手写5.00也没用。

我用的是普通的setCellValue。解决方法是使用setCellValueExplicit,像普通的setCellValue就可以了,因为第三个参数有默认值,会强制转换成字符串在Excel里面,可以自己看看那个类


——————————————————————————2017.9.20

1. fpdf的MutilCell,在中文+长字符(数字、符号和字母)的情况下,如果连续长字符长度大于一整行的width,就会死循环!使用这个换行的cell的时候,要么得保证绝对不会出现这种情况,要么就自己写一个换行的cell。不然线上服务器就会当机了!


——————————————————————————2017.10.11

1. 有些操作是不能在中途做的,需要在脚本结束的时候执行。例如,在return之前删除图片,就找不到文件,return之后不能删除,因为脚本结束了,不继续执行了。那么这个时候我们在代码return之前注册个函数

register_shutdown_function([new after_script_func($img_path),'end']);

使用到的类大概是这样的


class after_script_func{
    private $file;
    function __construct($file){
        $this->file = $file;
    }
    public function end(){
        unlink($this->file);
    }
}

这样在脚本运行的时候,img还是在的,然后在脚本结束的时候,就会删除掉它,就算你已经return了,因为register_shutdown_function的东西是在脚本结束然后在返回response之前执行的(大概是这个意思吧)


————————————————————————————2017.10.18

1. json_decode的时候,最好第二个参数带上true。如果你的json是有多层结构的话,因为有些环境版本不加true手工转换类型没问题,有些环境会有问题,哪怕都是PHP大版本都是5或者7,可能每个小版本都不同。而且这样发生的问题是不会抛出错误的!所以下次代码涉及json_decode然后出错然后没报错的话,就试试参数2写true看看吧




————————————————————————————2017.10.23

1. 这两天经历了一次爆内存的状况,线上服务器一个线程上线256M,然后就爆掉了,这段脚本是一段循环脚本,不是无限循环吧,但是循环次数很高,所以生成了很多变量没有释放,然后组长给我说了下代码里面我需要释放的内存。

(1)、 file_get_content 或者其他方式获取到大文件输入流,例如 $file = file_get_content($address); 在使用完$file后需要将它unset掉,不然在这个request结束之前,都会一直占用内存。

(2)、生成的对象,$obj = new Obj(); 这里$obj要unset掉。但是这样也得看对象的结构,如果是对象成员变量(例如 public $a; private $b)就会被释放变量,如果不是成员变量好像也不会被释放内存,所以自己写对象的时候要考虑好这点,是否存在大文件变量,有的话尽量写成成员变量。然后组长跟我说了下还有种写法是在__destruct()里面将大变量释放掉,这样你在unset对象的时候里面的内存也都基本被释放出来了。

我将这些东西都释放掉后,脚本内存使用量减少了1/3 - 1/2,但是还是有一大半内存没释放,因为这里我用了个第三方的插件,那没办法了,起码自己写的代码内存泄露问题基本解决了。如果整个脚本都是自己写的话,比较好得去控制变量的释放的话,内存应该没有问题了。

1.1 补充上面的内存问题。在其他博客上看到这个问题,有的时候unset并不会释放内存,这里先给出总结:

(1)变量在占内存超过256个字节的时候才能被释放内存,就是说太小的变量不会被释放

(2)所有指向这个内存地址的变量被unset掉才能释放内存。

现在给出第二点的大概解释:php是用C写的,所以变量都是一个地址关系而已,指向变量所在的内存位置。所以unset只是把变量指向地址的关系给取消了,并且将内存地址连接数减1,当没有变量指向这个地址的时候,连接数为0,php则会回收这个内存空间。就是说 $a = '123'; $b= &$a; unset($a);并不会释放内存,还要unset($b)才能释放这个'123'字符串占用的内存。


—————————————————————————————2017.10.31

1.tips也算warning吧。如果旧函数方法在多处使用了,用新函数方法替换旧函数方法的时候,要注意输入和输出是不是完全一样的,不能只考虑正常情况,异常情况输出也需要一致。。。像是旧函数方法有初始化,输入为空的时候能返回东西,新的如果没有初始化,那么正常使用的时候没有问题,输入为空的时候没有初始化就报错了。需要多方面测试后才能用新方法,并且对比两种语法。


2. in_array好像有个bug?还是array_keys,array_merge有个bug的,反正就是php数组这些函数有点问题。当

$arr1 = ['A','B'];   

$arr2_1 = ['A'=>1]; 

$arr2_2 = ['B'=>1]; 

$arr2 = array_keys(array_merge($arr2_1,$arr2_2));

照道理来说arr1和arr2应该是一样的,

in_array('A',$arr1);    //返回true

in_array('C',$arr1);   //返回false

$arr1是没问题的,但是$arr2有问题了

in_array('A',$arr2);    //返回true

in_array('奥',$arr2); //返回true

是的,这样的arr2无论什么都返回true,就算是

in_array('奥',$arr2,true);  也是返回true,整个就不能用了,所以要使用in_array的时候,尽量显性写出这个数组来吧,如果有人知道是什么原因麻烦告诉我一下(๑१д१)<


——————————————————————————————————2018.1.3

1.就上面那个in_array的问题,我居然又中弹啦!!!!!!!!!!!!!

事情是这样的:有个逻辑要改,当字段str在数组arr的时候,做一些处理,不在数组的时候直接返回str,不用处理。然后我习惯性的就用in_array($str,arrayt_keys($arr)),做判断了,如果返回true,那么我要用到$arr[$str],里面只有键值0/1/2/3这样的数字,我测试的时候也好好的,然后就提交上线了。然后没两分钟就报错了。原来是str可能不仅为数字,我测试的时候就用0和100测试了,一个在数组一个不在数组,想着如果是中文或者其他东西的话,也应该是和100一样直接返回了。然后就报错了,说某个中文字段不在数组下标内。一测试,写中文进去,果然错了!以前用中文做键名都没问题,为什么现在就有问题了?

原因就是我上次说的in_array。。。。。这个东西如果是写中文进去判断,都会返回true,所以原本只有0,1,2,3的键值,没有中文键值,但是返回true,就进入处理了,然后arr[str]就说找不到str这个中文键值了。。。。。。。。。


再补充一下,刚才又测试了下,好像是如果arr存在0下标,然后in_array('中文',arr),就会恒返回true,如果把0下标去掉,那么in_array判断就正常了

——————————————————————————————————2018.1.19

1. 昨天群里面同事说线上没关debug,就不太理解debug关不关有什么区别,因为本地做测试一直debug=true,刚刚试了下,debug为true时,有错误会直接抛出Exception的那个详细错误页面,如果改成false,就会返回error的页面,在laravel里面就是那个Be Right Back的view。线上关掉debug,用户知道有问题打不开网页,但是就不会莫名其妙看到错误代码啦。



——————————————————————————————————2018.3.23

1. laravel 的 model关联查询(with)时候,

在model中,使用骆驼命名法为关联查询的model命名的时候,在controller中使用的是下划线连接的键名。

例如:public function testRow()
    {
        return $this->hasOne('App\Models\testRow', 'xxx', 'yyy');
    }

数据集合携带这个with的变量就是test_row

猜你喜欢

转载自blog.csdn.net/qq_29238009/article/details/76582069
今日推荐