我有一个表单,只要其中一个字段获得焦点(即,用户单击或按 Tab 键进入该字段),就会显示一个带有有关该字段的额外信息的 div。非常简单:onFocus设置display: none;此信息窗格并将onBlur其删除。
我只希望在单击同一页面上的其他元素时触发这些事件,但在切换到另一个窗口或选项卡时它们也会触发。每次看到页面上的内容来来去去都非常烦人<Alt>-<Tab>。
JS有什么办法区分这两种blur事件吗?
编辑: 我做了一个codepen来说明这个问题。打开它,单击文本输入字段,然后按 alt-tab 切换到另一个窗口,可以看到一些文本消失了。
这是有问题的代码:
<input id="foo" />
<p>
Lorem ipsum dolor <span id="bar">sit amet consectetur</span>
</p>
Run Code Online (Sandbox Code Playgroud)
.hidden {
display: none;
}
Run Code Online (Sandbox Code Playgroud)
const inputField = document.getElementById('foo')
const hiddenSpan = document.getElementById('bar')
inputField.addEventListener('focus', () => hiddenSpan.classList.add('hidden'))
inputField.addEventListener('blur', () => hiddenSpan.classList.remove('hidden'))
Run Code Online (Sandbox Code Playgroud) 在我.bash_profile,我有vim命令别名/Applications/MacVim.app/Contents/MacOS/Vim.
对于我.gitconfig文件中的以下行,
[core]
editor = vim
Run Code Online (Sandbox Code Playgroud)
git运行系统vim而不是遵循上面指定的别名.如果我手动更改它以匹配Vim上面MacVim 命令的完整路径,它可以正常工作.
有没有办法.gitconfig按照bash别名,而不是必须设置完整的MacVim路径?(我将所有用户配置文件在多台计算机上同步,其中一些不运行MacVim.)
我的理解是单元测试应该孤立地测试类,关注粒度行为并尽可能使用双精度/模拟替换其他类的对象。(如果我在这里错了,请纠正我。)
我正在写一个名为MatchList. MatchList::new接受两个参数,每个参数都是另一个名为 的类的实例MatchPhrase。MatchPhrase包含一些MatchList严重依赖的行为(即,如果您提供除 a MatchPhraseto以外的任何内容MatchList::new,您将得到一堆“未定义方法”错误)。
我当前的(天真的?)测试设置使用let语句来分配变量以用于我的示例:
let(:query) { MatchPhrase.new('Good Eats') }
let(:candidate) { MatchPhrase.new('Good Grief') }
let(:match_list) { MatchList.new(query, candidate) }
Run Code Online (Sandbox Code Playgroud)
我如何编写这个单元测试?我认为它应该在不调用MatchPhrase类的情况下完成吗?这甚至可能吗?
作为参考,这里是MatchList类的样子:
class MatchList < Array
attr_reader :query, :this_phrase, :that_phrase
def initialize(query, candidate)
super(query.length)
@query = query
@this_phrase = query.dup
@that_phrase = candidate
find_matches until none?(&:nil?)
end
private
def find_matches
query.each.with_index do |this_token, i|
next unless self[i].nil?
that_token …Run Code Online (Sandbox Code Playgroud) 当我偶然发现这段代码时,我正在查看Solitaire Cipher的测验摘要:
def triple_cut
a = @deck.index( 'A' )
b = @deck.index( 'B' )
a, b = b, a if a > b
@deck.replace( [ @deck[(b + 1)..-1],
@deck[a..b],
@deck[0...a] ].flatten )
end
Run Code Online (Sandbox Code Playgroud)
我不明白为什么有一个单独的方法replace.为什么不做以下事情呢?
@deck = @deck[(b + 1)..-1] +
@deck[a..b] +
@deck[0...a]
Run Code Online (Sandbox Code Playgroud)
为什么要将两个单独的方法(replace和flatten)一起添加到一起时遇到麻烦呢?我没有遇到任何问题.
我正在构建一个带有用于身份验证的 Devise 的 Rails 应用程序,它的默认数据库迁移设置以下列:
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
Run Code Online (Sandbox Code Playgroud)
设置null: false和default: ""同时的目的是什么?
我的理解是,null: false有效地使一个值成为必需:即,尝试NULL在该列中保存具有值的记录将在数据库级别失败,而不依赖于模型的任何验证。
但是然后default: ""基本上通过NULL在保存之前将值转换为空字符串来撤消。
我知道对于可选列,您希望拒绝NULL值只是为了确保该列中的所有数据都属于同一类型。但是,在这种情况下,电子邮件和密码绝对不是用户身份验证模型上的可选属性。我确定模型中有验证以确保您无法创建电子邮件地址为空的用户,但是您为什么要default: ""在这里设置呢?它是否提供了一些好处或防止了一些我没有考虑过的边缘情况?
我想要:
while循环的条件传递,具体来说,我有一个数组,我希望#reject!某些元素来自相当复杂的逻辑.后续调用#reject!可能会删除先前传递中未删除的元素.当#reject!最终停止查找要拒绝的元素时,它将返回nil.此时,我希望循环停止并继续执行程序.
我以为我可以做以下事情:
while array.reject! do |element|
...
end
end
Run Code Online (Sandbox Code Playgroud)
我还没有尝试过它,但是这个构造抛出了vim的ruby语法高亮显示器用于循环(即,它认为第一个do用于while语句,并认为第二个end实际上是封装方法的结束).我也尝试将其重写为while附加到begin...end块的内联修饰符,
begin; end while array.reject! do |element|
...
end
Run Code Online (Sandbox Code Playgroud)
但它仍然以同样的方式搞砸了突出显示.在任何情况下,感觉就像是滥用while循环.
我能想到的唯一方法就是将方法调用指定为proc:
proc = Proc.new do
array.reject! do |element|
...
end
end
while proc.call do; end
Run Code Online (Sandbox Code Playgroud)
虽然有效,但感觉很笨拙,尤其是尾随do; end.
有没有优雅的方法来实现这一目标?
ruby ×3
alias ×1
bash ×1
config ×1
devise ×1
dom-events ×1
git ×1
immutability ×1
javascript ×1
loops ×1
mysql ×1
null ×1
rspec ×1
unit-testing ×1
validation ×1