以前总是鄙视技术理论,觉得只要能写代码就够了,没必要记住那些专业名词,现在才发现,专业名词有时也用得到,比如在自己总结某方面技术的时候就用得到,在交流技术实现时用得到
问:在IE里,怎么调起chrome浏览器打开指定网页?
答:
function start() {
var objShell = new ActiveXObject("wscript.shell");
var cmd = "cmd /c start chrome \"http://www.baidu.com\"";
var f = objShell.Run(cmd, 0); //相当于现在windows下按了windows+r,写cmd,然后运行start chrome \"http://www.baidu.com\",如果要启动360浏览器,需要用户安装时按照默认路径来,然后把cmd /c start chrome \"http://www.baidu.com\""改成360chrome,如果需要打开火狐浏览器,就把上面这句var cmd = "cmd /c start chrome \"http://www.baidu.com\"";改成var cmd = "cmd /c start firefox \"http://www.baidu.com\"";
objShell = null;
}
start();
问:for循环里,怎么禁止for循环以后的代码执行?
答:
以前,我会在for循环里让js报错,从而达到禁止for循环以后的代码执行,现在发现有1种更优雅的方式:
let schid = '';
get_schid:
for(let i = 0;i < doc_info.length;i++){
break get_schid;
}
if(schid == ''){
alert();
return;
}
如果列表没有数据,返回的数据用空字符串比空数组性能更好,所以,列表为空的时候让后端尽量给我空字符串
问:<input class="forbid_input" type="text" readonly="readonly">
IE浏览器,在input里按了backspace键,浏览器会跳到上一个页面,怎么办?
答:
<input type="text" readonly="readonly">
$("input[readonly]").keydown(function(e) {
e.preventDefault();
});
原文链接:https://blog.csdn.net/oatmeal2015/article/details/52846529?utm_source=blogxgwz3
今天遇到1个奇葩的问题,不知道怎么解决,然后一行一行删除js,结果就弄好了,以后遇到类似问题,也可以用这个方法(算是最后一根稻草了,哈哈)
问:IE9及其以下浏览器不支持placeholder,怎么办?
答:答案如下:
username_input是input的class名,这里的代码是针对input[type=text]的:
function isPlaceholderSupport() {
return 'placeholder' in document.createElement('input');
}
if(!isPlaceholderSupport()){
$('.username_input').val('请输入用户名');
$('.username_input').on('focus', focus1);
$('.username_input').on('blur', blur1);
function focus1(){
var x = $('.username_input').val();
if(x == "请输入用户名"){
$(".username_input").val("");
}
}
function blur1(){
var x = $('.username_input').val();
if(x == ""){
$(".username_input").val("请输入用户名");
}
}
}
如果是遇到input[type=password]时,上面的代码就不够了,如果遇到input[type=password],就写如下的代码:
<div class="support_placeholder">
<input class="password_input" type="password" placeholder="请输入密码" />
</div>
<div class="no_support_placeholder">
<input id="password2" onkeydown="enter(this.id);" class="denglu-input" type="text" name="password" onfocus="focus2()" value="请输入密码" style="display: block;"/>
<input id="password" onkeydown="enter(this.id);" class="denglu-input" type="password" onblur="blur2()" name="password" value="" style="display: none;"/>
</div>
js:
function isPlaceholderSupport() {
return 'placeholder' in document.createElement('input');
}
if(!isPlaceholderSupport()){
$('.no_support_placeholder').show();
$('.support_placeholder').hide();
}
else{
$('.support_placeholder').show();
$('.no_support_placeholder').hide();
}
function enter(name) {
if (event.keyCode == 13){
var display=$('#password2').css('display');
var display1=$('#password').css('display');
if(display1!='none'){
$('#password')[0].focus();
}else{
$('#password2')[0].focus();
}
}
}
function focus2(){
$("#password2").css({"display":"none"});
$("#password").css({"display":"block"});
$("#password").focus();
}
function blur2(){
var x = $("#password").val();
if(x==""){
$("#password").css({"display":"none"});
$("#password2").css({"display":"block"});
}
}
问:遇到布局问题时,常见的解决办法有哪些?
答:1.增加或者减少DOM元素层数
2.换css属性
3.用js控制样式
问:如何能在setTimeout或setInterval里的函数设置参数?
答:
方案1:
var str = 'aaa';
var num = 2;
function auto(num){
console.log(num);
}
setInterval('auto(num)',1000);
setTimeout('auto(num)',1);
方案2:
var num = 2;
function test(){
var str = 'bbb';
setTimeout(auto(str),1);
}
function auto(str){
return function(){
console.log(str);
}
}
test();
问:js如何获得div去掉滚动条部分的宽度?(原文链接:https://zhidao.baidu.com/question/487606067.html)
答:clientWidth:获取对象的宽度,不计算任何边距、边框、滚动条或可能应用到该对象的补白。
我发现几年前用过的一些插件的网站关门了,以后遇到好的插件,要把插件的源码、文档上传到自己的百度网盘上,如果真的很重要,在有道云笔记也备份一下,这样,即使百度倒闭了,有道云笔记没倒闭,还可以在有道云笔记上面找到自己想要的东西,要有‘防患于未然’的安全意识
问:table里,怎么给动态生成的奇数行tr设置背景颜色(需要兼容ie8)?问:网页中怎么预览word文档?问:chrome浏览器怎么调用IE?
答:
方案1:当每次创建完新的<tr>以后,再调用
$('.table1').find('tr:odd').css({
background : '#f00'
});
方案2:
思想与方案1类似,但是效率会高一点:
生成<tr>以后,如果是奇数行,就加上odd这个class,然后在css里给.odd加样式,这个方法更方便,效率更高
答:<iframe src='https://view.officeapps.live.com/op/view.aspx?src=http://storage.xuetangx.com/public_assets/xuetangx/PDF/1.xls' width='100%' height='100%' frameborder='1'> </iframe>
其中,src后面的是自己的线上word文档地址,必须是线上的
答:open('microsoft-edge://www.baidu.com')
问:chrome浏览器怎么调用edge?
答:open('RES://www.baidu.com');
chrome浏览器URL注册调用本地应用程序:https://www.cnblogs.com/glorysword/archive/2012/08/07/2626008.html?tdsourcetag=s_pcqq_aiomsg
问:怎么让dom元素滚动到某个位置?
答:dom.scrollTo(0,100);
问:window窗口怎么滚动到某个位置?
答:scrollTo(0,100);
当面对新技术时,我们要把新技术和旧技术进行对比,找出两者的相同点、不同点、优势、劣势,其中,我们要学习的是两者的相同点和优点,因为相同点和优点往往是精华
我最近发现,如果在学习过程中遇到困惑时,就抱着问其他人问题的心态,去想办法让对方理解自己的困惑时,往往一些问题就竟然解决了
复习js的时候,重点学习哪些东西?
记忆属性是用来做什么的,而不要去记忆那些完整的东西,不要指望自己把js的大部分属性记住,只要用到的时候知道大概去哪里找答案就行了,或者知道大概怎么去百度就行了
当删除某个dom元素会影响到布局时,为了快,可以把这个dom元素的宽高设置为0,这样,如果之前写的代码灵活性比较好,根据dom元素的宽高而设置其他dom元素的宽高的话,就不会影响到布局了
问:如果电脑开启了tomcat,用192.168.0.184的形式访问,电脑能访问但是手机不能访问,出现这个现象的可能的原因有哪些?
答:电脑开启了防火墙
答:这个在新版chrome浏览器里是做不到的,只能把当前页面变成空白页面,代码如下:
window.open("about:blank","_self");
window.close();
问:table的父元素width是200px,table设置width='100%',但是table的宽度大于父元素宽度(也就是table宽度大于200px),出现这个现象可能的原因有哪些?问:页面a和页面b都有可能跳到页面c,并且跳到页面c以后还要跳回去,怎么实现?问:项目需求频繁更改,程序员该怎么适应?问:如何判断用户登录的是否是xx浏览器?
答:table里某个tr的内容太多了,宽度必须超过200px的时候,table的宽度就大于200px了
答:
方案1:
页面a跳到页面c的时候写location.href='c?page=a',页面b跳到页面c的时候写location.href='c?page=b',这样,页面c可以根据查询字符串的值,跳回页面a或页面b
方案2:
这个方案更好,就是在页面c写location.href = document.referrer;
方案3:
这个方案最差,就是在页面a跳到页面c的时候,跳转页面前设置localstorage的page=a,页面b跳到页面c的时候,跳转页面前设置localstorage的page=b,在页面c里就知道是从哪个页面跳转过来的
方案4:
在页面c使用history.back(),这个方案的优势是,可以往前跳2层页面
答:
程序架构保留一定的灵活度,代码灵活性要好
代码要有可维护性、可扩展性
代码质量好,代码格式规范,有必要的注释,有良好的可读性、复用性
能用简单的办法实现,就尽量用简单的方法
答:判断用户登录的是不是某个浏览器,一般找到这个浏览器的UA,根据浏览器的UA是否有某个特殊值,来判断这个浏览器是不是某个浏览器
左滑删除功能,以前网上找了很多插件,没有一个好用,自己用jquery做了一下,比网上的插件都好用,思想如下,具体代码在百度网盘上:
获取鼠标按下、松开的位置,如果是从右往左的话,就显示右侧的删除按钮(按钮设置了position:absolute;right:按钮宽度的负值;显示按钮其实就是把right的值设置成0;),显示的时候加上过渡效果,反之,就隐藏右侧的按钮,就这么简单,自己都不敢相信,哈哈
从页面a跳到页面b,再跳回页面a,不要写location.href='页面a的路径',要写history.back();因为history.back();灵活性更好
问:input输入到右边框的时候禁止输入,怎么实现?(这是一个不正常的需求,但是从技术角度可以基本实现)
答:
思路:获取不到input,就搞个span标签来,这样大致可以获取用户输入内容的宽度了
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
<style>
*{
padding: 0;
margin: 0;
}
input, span{
border:none;
padding: 0;
margin: 0;
font-size: 16px;
}
</style>
</head>
<body>
<input type="text" value="">
<div>
<span></span>
</div>
<script src="js/jquery.js"></script>
<script>
var input_w = $('input').width();
$('input').keyup(function () {
if($('span').width() >= input_w){
$(this).prop('readonly', 'readonly');
return false;
}
$('span').html($(this).val());
});
</script>
</body>
</html>
答:https://www.babeljs.cn/repl/,用babel让es6的语法转成es5的
如果要全局替换某些代码,记得不要给插件的代码全局替换掉,否则可能会出现问题
今天一个网友跟我说到了一个情况:chrome可以请求,但是ie浏览器走的是error的回调函数,百度了很久,尝试了很多方法,都没成功,结果我把$.ajax改成原生js的请求,ie浏览器报错:‘拒绝访问。’我把请求改成jsonp,ie浏览器就能发送请求了,只是返回的数据格式不正确,但是离解决问题更近了一步,所以,遇到问题时,如果是用框架写的,改成原生js的写法,可以获得更多的报错信息
问:jsonp是什么?
答:jsonp请求demo:
html:
<script>
function doSomething(jsondata) {
console.log('jsondata', jsondata);
}
</script>
<script src="http://localhost/test/test1.php?callback=doSomething"></script>
php:
<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: UAPPID,UCHECK,UTOKEN,UTIME,Content-Type,Access-Token');
header("content-type:text/html;charset=utf-8");
$callback = $_GET['callback'];
$data = array('a', 'b');
echo $callback.'('.json_encode($data).')';
问:闭包的原理是什么?
答:内存一直没有释放,变量一直在堆内存里
以前在一家公司,面试官问我‘闭包的原理是什么?’,当时我说了我的理解以后,面试官说‘你只是说了一下实现方式,没有说原理’,当时我回去百度了,结果没百度到,也没问其他人,结果今天又在这个问题上跌倒了一次,以后要牢记这个问题,不能在这个问题上跌倒第3次
问:怎么证明浏览器请求html没有缓存、而请求引入的css和js文件有缓存?
答:
问:今天遇到1个问题,我把ie浏览器的脚本禁用了,广告全部消失了,图片也加载不出来了,这是正常的,但是我点击百度的‘百度一下’按钮,结果,去发送请求了,这是为什么呢?正常逻辑应该是给按钮绑定一个点击事件,如果我禁用js了,就不会发送请求呀
答:打开控制台发现这里是一个<input type="submit" id="su" value="百度一下" class="bg s_btn btnhover">,form 有 规范的,第一个 input button type 是 submit 默认触发 submit 事件。
问:如何判断2个数组是否相等?
答:下面的代码是我自己写的,如果数组里面还嵌套着数组,我的代码就失效了,实际项目中,如果需要判断2个数组是否相等,就去百度一下:
方法1(只能判断一维数组):
遍历属性名和属性值是否相等
let arr1 = [11, {name : 1}];
let arr2 = [11, {name : 13}];
let flag = true;
// 如果数组里都是基本类型,就调用compare1,如果都是对象,调用compare2
if(arr1.length != arr2.length){
flag = false;
}
for(let i = 0;i < arr1.length;i++){ //遍历arr1
if(typeof arr1[i] != 'object' && typeof arr1[i] != 'function'){
//如果arr[i]是基本类型,判断arr2里是否有这个值
//判断arr2里是否有arr1[i]的值
if(arr2.indexOf(arr1[i], 0) == -1){
flag = false;
}
}
else{
let arr1_i_key = Object.keys(arr1[i])[0]; //获取arr1的第i项的属性名、属性值
for(let j = 0;j < arr2.length;j++){ //遍历arr2
if(typeof arr2[j] == 'object' || typeof arr2[j] == 'function'){
let arr2_j_key = Object.keys(arr2[j])[0]; //获取arr2的第i项的属性名、属性值
if((arr1_i_key == arr2_j_key) && (arr1[i][arr1_i_key] == arr2[j][arr2_j_key])){
}
else{
flag = false;
}
}
}
}
}
console.log('flag', flag);
方法2(只能判断一维数组):
let arr1 = [1, 2, [2, 1]];
let arr2 = [2, 1, [1, 2]];
arr1 = arr1.sort();
arr2 = arr2.sort();
console.log(JSON.stringify(arr1) == JSON.stringify(arr2));
问:今天复习jsonp的时候,我觉得好奇怪,定义f()的<script>标签放在前面的话,就能调用f这个函数;如果把定义f()的<script>标签放在后面的话,就报错了,其中的原理是怎么样的?
网友评论