垃圾sf

垃圾sf 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

不好意思各位,由于本人对sf很失望,就这样吧,此号废弃,而且我也放弃了sf。既然整个sf管理层不知道是势利还是智障,我也没什么好说的。我看不到sf的未来。

个人动态

垃圾sf 回答了问题 · 2015-12-03

js 如何只触发最外层元素事件

首先,冒泡的顺序是从鼠标直接点击的那个元素开始,一层一层往window对象冒泡的。这是冒泡的顺序。
如果已经冒泡到了body,那之前的那些元素的click委托早就执行完毕了。

阻止捕获这个词,我没听说过,这种事貌似不可能吧,而且我也刚搜了一下,没有结果。你只能阻止冒泡,而且这个功能就够了,如果阻止捕获都可以做到,这是不是太霸道了点。

然后给你提个解决方案吧:
虽然我还不理解你想干什么,不过你既然想禁用页面所有元素的点击事件,你可以这样做
在满足你的时间点或者其他条件的地方:
body根节点下创建一个div,样式自然是

width: 100%;
height: 100%;
position: absolute;
z-index: 100000; /* 只要保证不被其他元素覆盖即可 */
background: none;

然后如果必要,再给body一个overflow: hidden;

这样你点什么都不行了~

关注 7 回答 3

垃圾sf 回答了问题 · 2015-12-02

解决关于 call() 的问题

我天,你这里问题很多啊。。我一个一个给你解释哈

一. 首先先不说别的

User.call(this, name, point);

某种角度相当于:

User(name, point);

只不过是把执行User时上下文环境替换成了当前上下文环境

二. 你这Company里,name尚且可以在函数显式声明的参数列表中找到,但是point并没有声明,所以运行到这里找不到point所以报错很正常。

三. 我猜你想写的其实是,this.namethis.point,所以你并不需要在User参数列表中写name(当然,也不需要写point),你既然通过call的方式调用的,运行时UserCompany是同一个this,所以User中自然也能取到Company中的this.namethis.point
e.g.:

function A(hehe, lala) {
  console.log(this.abc);  // 123
  console.log(this.def);  // 456
  console.log(hehe);  // '呵呵'
  console.log(lala);  // undefined
}
function B() {
  this.abc = 123;
  this.def = 456;
  var temp = '呵呵';
  A.call(this, temp);
}
new B();

四. 顺便说一句,var this.name是什么鬼??var是声明指针名的(即变量名,我习惯叫指针

你的问题很乱,所以我回答的也很乱。不过希望可以帮到你 :P

关注 6 回答 4

垃圾sf 赞了回答 · 2015-12-01

解决js 二元运算 放在class里报错

item.support_count 后面那个分号删掉。

分号不是 ? : 运算符的一部分。分号的意思是结束一个语句。

关注 3 回答 2

垃圾sf 回答了问题 · 2015-12-01

对sf失望了, 请问哪里可以注销自己的账号, 请求删除本账号及所有提出的问题和回答, 谢谢!

呵呵,我太能理解你为什么要注销账号了,是不是有很多人都在喷你?
先把自己基础打好然后再来这上面回答问题吧,你现在除了能糊弄糊弄新手(哦,也许还能糊弄住自己),还能做甚?

不过话说回来,你这分刷的可够快的,一两周前你还4k呢。
有点恍然大悟了,好不容易刷了这么多分,你会舍得扔掉?无非变相求关注刷人气罢了,这么一想就说得通了。

你也别跟我急眼,咱之前的事儿看见的人应该也不在少数,我也懒得说,心里都明白。我只是想说啊,如果你真心想离开,以后别上了就可以了,眼不见为净嘛,这岂不是很简单?但我猜你肯定还是很快就会看到我这留言的,因为你舍不得。
对不起啊,我又一不小心爆出你那点小心理了。

(各位观众别误会,我跟别人不会这个语气说话,我只是看不惯那些半瓶子水出来误人子弟,你好心给指出来,人家还反过来咬你一口这种人)

关注 11 回答 7

垃圾sf 回答了问题 · 2015-11-26

解决国内如何才能快速访问http://stackoverflow.com/

当然是要翻墙。

而且好用的翻墙方式也肯定是要付费的,免费的就不要想了,谁会免费的去维护一堆需要自己付费的东西(比如goAgent)。

最方便的方式就是通过vpn了,各个终端,无论电脑还是手机甚至各种pad都是有vpn的,只需要配置一下就可以了。
(我在用的是云梯,非广告,打听一下好用的vpn就那么几个)
当然你也可以买应用,比如我曾经用过mac版的鱼摆摆,感觉还是可以的。
windows上不了解。

关注 10 回答 7

垃圾sf 提出了问题 · 2015-11-26

解决上传文件问题(iframe方式)

需求:

  1. 兼容ie8/9

  2. 上传文件

  3. 页面无刷新

  4. 之后执行回调,获取服务器端的响应内容

为了兼容性,所以不能用H5FormData
暂时能想到的就是通过iframe来实现。但是现在碰到个不知道该怎么解决的问题。

先看下我现在的页面结构
图片描述

我在[type="file"]上绑定了change事件,change后触发form提交

  • 当我提交的方式为post的时候,如上图所示,服务器端返回的所有内容都被装进了body下,由浏览器自动生成的pre标签中(目测是因为浏览器的安全机制,不知道这里该怎么处理)

  • 当我改成get提交的时候,iframe内可以正常显示返回的html内容(甚至包括<!DOCTYPE),但是因为get方式的限制,提交不了较大的文件啊(印象中get只支持255字节)

所以暂时总结一下就是:

  • post方式,可以正常上传文件,但是无法处理返回值(因为跨域 + 浏览器安全机制不能添加脚本)

  • get方式,无法上传文件

所以,跪求满足需求的方案。。。

关注 4 回答 2

垃圾sf 赞了回答 · 2015-11-26

解决jquery 数据格式解析

图片描述

就问一句:之前的数据结构谁写的?扇他……

关注 4 回答 3

垃圾sf 赞了回答 · 2015-11-26

解决git忽略已经被提交的文件

tl;dr: 正确的做法应该是:git rm --cached logs/xx.log,然后更新 .gitignore 忽略掉目标文件,最后 git commit -m "We really don't want Git to track this anymore!"

具体的原因如下:

另一答案虽然能达到(暂时的)目的,但并非最正确的做法,这样做是误解了 git update-index 的含义,而且这样做带来的最直接(不良)后果是这样的:

  1. 所有的团队成员都必须对目标文件执行:git update-index --assume-unchanged <PATH>。这是因为即使你让 Git 假装看不见目标文件的改变,但文件本身还是在 Git 的历史记录里的,所以团队的每个人在 fetch 的时候都会拉到目标文件的变更。(但实际上目标文件是根本不想被 Git 记录的,而不是假装看不见它发生了改变)
  2. 一旦有人改变目标文件之后没有 git update-index --assume-unchanged <PATH> 就直接 push 了,那么接下来所有拉取了最新代码的成员必须重新执行 update-index,否则 Git 又会开始记录目标文件的变化。这一点实际上很常见的,比如说某成员换了机器或者硬盘,重新 clone 了一份代码库,由于目标文件还在 Git 的历史记录里,所以他/她很可能会忘记 update-index

为什么会这样?答案就在 Git 的 man pages 里:

首先,git update-index 的定义是:

Register file contents in the working tree to the index(把工作区下的文件内容注册到索引区)

这句话暗含的意思是:update-index 针对的是 Git 数据库里被记录的文件,而不是那些需要忽略的文件。

接着看关于 --assume-unchanged 的几句相关的描述:

When the "assume unchanged" bit is on, Git stops checking the working tree files for possible modifications, so you need to manually unset the bit to tell Git when you change the working tree file. This is sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e.g. cifs).

大致意思是:

应用了该标识之后,Git 停止查看工作区文件可能发生的改变,所以你必须 手动 重置该标识以便 Git 知道你想要恢复对文件改变的追踪。当你工作在一个大型项目中,这在文件系统的 lstat 系统调用非常迟钝的时候会很有用。

我们知道 Git 不仅仅是用来做代码版本管理的,很多其他领域的项目也会使用 Git。比如说我公司曾经一个客户的项目涉及到精密零件图纸文档的版本管理,他们也用 Git。有一种使用场景是对一些体积庞大的文件进行修改,但是每一次保存 Git 都要计算文件的变化并更新工作区,这在硬盘慢的时候延迟卡顿非常明显。

git update-index --assume-unchanged 的真正用法是这样的:

  1. 你正在修改一个巨大的文件,你先对其 git update-index --assume-unchanged,这样 Git 暂时不会理睬你对文件做的修改;
  2. 当你的工作告一段落决定可以提交的时候,重置改标识:git update-index --no-assume-unchanged,于是 Git 只需要做一次更新,这是完全可以接受的了;
  3. 提交+推送。

另外,根据文档的进一步描述:

This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files).

这段描述告诉我们两个事实:

  1. 虽然可以用其来达成楼主想要的结果,但这是不讲究的做法(coarse);
  2. 同样的事情更应该用 .gitignore 文件来实现(针对未追踪的文件)。

随之而来的问题是:为什么我增加了 .gitignore 里的规则却没有效果?

这是因为我们误解了 .gitignore 文件的用途,该文件只能作用于 Untracked Files,也就是那些从来没有被 Git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。

之所以你的规则不生效,是因为那些 .log 文件曾经被 Git 记录过,因此 .gitignore 对它们完全无效。这也正是开头那段简短答案所做的事情:

  1. 从 Git 的数据库中删除对于该文件的追踪;
  2. 把对应的规则写入 _.gitignore_,让忽略真正生效;
  3. 提交+推送。

只有这样做,所有的团队成员才会保持一致而不会有后遗症,也只有这样做,其他的团队成员根本不需要做额外的工作来维持对一个文件的改变忽略。

最后有一点需要注意的,git rm --cached 删除的是追踪状态,而不是物理文件;如果你真的是彻底不想要了,你也可以直接 rm+忽略+提交。

关注 74 回答 8

垃圾sf 赞了回答 · 2015-11-26

目前流行的面向对象编写方式是什么样子的?

别拿基于类的 OO 语言的观念来看待 JavaScript,因为它是基于原型的

有太多的书/教程“强行”把 JavaScript 往类型式 OO 语言上靠,ES2015 整出个 Class 语法糖也是为了满足这种不知所谓的“同比心”(后记:对,我这句话说的太激进了些,我承认)。可是 OO 是面向对象,不是面向类呀!!!

所以,你告诉我:在你的应用里 Person 重到什么程度才需要你创建一个“类”出来?你要这个“类”的什么好处?继承?封装?多态?有多少客户端应用程序的代码是真的需要这些类型语言强调的特色的?用不到的话为啥非要创造“类”?

当然,如果你是 generic 库/框架的作者,那么你可以无视上面那段话(如果你是的话,你当然明白我的意思)。

流行的方式?没有/不知道,针对具体的应用规模选择你的“武器”吧,真正上规模的应用有多少人能做到从底层架构开始全部自己封装的?有必要写这样的基础类吗?即使你要做和后端类似的 ORM,Person 这样的粒度又未免太细了一些,你要写的也得是 AdapterSerializerMapper 这样的东西呀。

我有一个“人”的对象:

var person = {
  greeting(who) {
    console.log(this.name + ' 向 ' + who.name + ' 问好!');
  }
}

我要一个小明和一个小红:

var xm = Object.create(person);
var xh = Object.create(person);

xm.name = '小明';
xh.name = '小红';

xm.greeting(xh);    // 小明 向 小红 问好!

80% 的时间,我们都在写着这样的代码,要那个貌似“类”的构造器有毛用处?(知道怎么用的不用跳出来喊,我也知道)

请先掌握 面向对象 ,然后再去分辨 基于类的 OO基于原型的 OO 它们之间的异同,不要受 Java 语言那种教学习惯的误导把本末倒置了。

声明:为避免撕逼,我并没有说 Java 不好的意思,我的意思是大多数人把它“教”坏了,包括书/教程/老师……


我一个同事问了我一个问题:

你这样做,会不会造成 greeting 方法的重复定义?另外 name 等属性我是希望每一个实例都会有的,这样搞的话会不会在实例化的时候很不方便?

我认为这个问题问得很具有代表性,充分体现了那些惯常的 OO 教学法是如何把人给教傻了的……

首先,啥叫基于原型?

Object.create(prototype),如你所见,这个方法创造出的对象就是扩展了你传入的 prototype 的,也就是原型链。如果你用构造器模式,你会弄出一个 Person.prototype 这样的对象,本质上它和我直接创建的 person 对象没有什么区别(区别当然有,但是在这里不重要)。

OO 的本质,不是继承/封装/多态,而是 (把)一切都(看作)是对象!,即使它真的不是对象(有些不完全 OO 语言会有一些原始类型不太符合它自身对于 Object 的定义,比如 JavaScript 里就有这样的东东,我们叫它们原生类型),你也要把它看作对象。

因此 var person = {}Person.prototype 本质上没啥区别,因为归根结底它们都是一个对象而已,而 Object.create 就是要你给一个对象做原型,然后给你返回一个对象,它最近的原型链就是你传入的那个对象。看看这个:

图片描述

这就是上面基于 person 创造出的小明和小红,greeting 方法确实是通过原型引用的,绝不会重复定义。这个简单的例子揭示了基于原型的真正内涵,Constructor.prototype 固然也是一种实现方式,但绝非必须要这么做(对比 Java,类是你构造对象的唯一途径)。

如果你把类看作是实力对象的“模版”,那么这个“模版”在 JavaScript 里就是原型,而原型就是一个单纯的对象,它不是类,也不需要变成“类”。

其次,操作属性时是否方便?

如果你定义一个构造器,唯一的方便之处在于构造器本身是一个函数,调用函数的时候可以传参,所以可以“看似很方便的”初始化实例对象的默认属性。然而这种方便是有代价的!

  1. 你需要一个对象来接受这些属性,也就是 this;可是动态语言的 this 是运行时决定的,你很难确保它是你想要的对象——所以就有了 new 操作符,它干了啥我回答过好几次就不说了,搜索/MDN……而 new 本身又带来一些问题(去搜),所以才搞出了很多不用 new 但是保留构造器的“奇技淫巧”。对应到具体的项目中你需要问问自己:需要吗?值得吗?

  2. 动态类型的特点就是不需要静态检查,放在这里就意味着:每一个实例对象不需要严格遵守模版的规则,不是说你构造器里预设了三个属性,那么我的实例对象就必须有这三个属性的。那么问题来了,如果属性没有或者不够怎么办?好吧,检查传参/使用对象构造传参等等技巧又来了……当然了你懂这些技巧不是坏事,但是懂了就一定需要这么做吗?值得吗?

就算你真的想初始化方便点,也应该构想更上一层的抽象,比如说一个 Adapter 专门用来处理和 API 的对接(这是绝大部分前端项目的数据来源),然后由它去生成实例对象,这时候实例对象是什么类型并不重要(是不是 Person 在大部分时候我并不关心,真要关心也不必自建构造器)。

前端开发的重点是在 UI 编程上,我经常对后端转前端/实习生强调这个观念——不是说数据结构/算法等等不重要,而是比起这些东西,作为前端工程师你首先得打好 UI 编程的基础,然后再去深入学习和研究这些东西在前端上的实践。对于初学者,别太去纠结“如果不搞个‘类’会不会逼格不够高”这类的问题,反之我更加建议你多用用那些开源的库,去体会它们的接口调用和层次处理,然后再去理解它们在底层为你做的封装,这样的学习多了之后你自然会明白什么时候我需要什么东西。

用动机去驱动解决方案,而不是先预设解决方案来对应一切动机。 前者是 OO,后者则是基于 xxx 的对 OO 系统的实现。

关注 5 回答 3

垃圾sf 回答了问题 · 2015-11-24

解决为什么input checkbox有 checked='checked'还是没选中?

虽然你的问题问的不明不白的,但是我也许猜到了你卡住的点。

如果用jQuery来写的话:
应该是用

$(element).prop('checked', true/false);

而不是

$(element).attr('checked', true/false);

如果我这么讲,也许你就懂了,其实也就相当于:

element.checked = true/false;

而并不是

element.setAttribute('checked', true/false/'checked');

应该很好理解吧?希望可以帮到你~

关注 5 回答 2

认证与成就

  • 获得 64 次点赞
  • 获得 28 枚徽章 获得 1 枚金徽章, 获得 8 枚银徽章, 获得 19 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-07-30
个人主页被 1.2k 人浏览