欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

问题&提示&小tips

程序员文章站 2022-05-13 19:56:59
...

前端:

问题&提示

——————————————————————————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时,会不滚动。

问题&amp;amp;提示&amp;amp;小tipsoverflow: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

相关标签: 文档