- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 JavaScript 和 JQuery 中有一个钢琴键盘对象,如下所示:
function Keyboard(name, size, xPos, yPos, octaves) {
this.name = name;
this.size = size;
this.setDimensions = function (){};
this.highlightKeyboard = function (){};
...
etc.
}
它有很多方法来设置尺寸,使用 div 作为按键生成键盘,生成引用 div 类的主要和次要音阶,等等。
我编写了 4 种方法,用于在按下某个键时突出显示大调音阶,在按下不同的键时突出显示小调音阶,并使用其他两个键突出显示大调和小调三和弦。它们都有效,但在编写它们之后,我意识到所有 4 个方法都使用了很多相同的代码,因此我一直在尝试通过将大部分代码引入主 Keyboard 对象中的单独方法中来进行整合,以便我可以重复调用它们。
我现在遇到的问题是如何让 $(document).keypress
对象与外部代码很好地配合。
我想要的是这样的(部分代码示例 - 我省略了生成键盘的所有代码以及其他所有不相关的内容,因为除了这个问题之外它似乎工作正常):
function Keyboard(name, size, xPos, yPos, octaves) {
this.getMajorTonic = (function(userNote) {
// code to determine myTonic
return myTonic;
});
this.setMajScale = function(myTonic) {
var scale = [];
// code to determine scale[];
return scale;
};
this.setScaleClasses = function(scale) {
// code to determine scale_classes[]
return scale_classes;
};
this.highlightKeyboard = function (scale, scale_classes){};
// code to add highlighted classes to my divs based
// on the values in scale and scale_classes
};
this.findMajorScales = function(userNote);
var myTonic = this.getMajorTonic(userNote);
var scale = this.setMajScale(myTonic);
var scale_classes = this.setScaleClasses(scale);
var highlightKeyboard = this.highlightKeyboard;
$(document).keypress(function (event) {
if (event.which === 109) {
highlightKeyboard(scale, scale_classes)
}
});
};
}
var keys = new Keyboard("piano", 1, 0, 0, 2);
keys.findMajorScales("E");
期望的效果是,当我加载页面时,它会生成一个空白键盘,但是当我按下“m”键时,它会使用 this.highlightKeyboard
方法突出显示 E 大调音阶。所以我想将 this.findMajorScales
方法传递给一个不带参数的 this.highlightKeyboard
方法,然后填写参数并在按“m”键时执行该方法被按下。大多数东西都可以工作,包括 ($document).keypress
对象,它执行其他代码,只是不执行带有正确参数的 this.highlightKeyboard
方法。
我该如何实现这个目标? .bind 与它有什么关系吗?我真的不知道它是否适用于这里或者我是否需要做其他事情。
非常感谢!
jack
最佳答案
So I want to pass the this.findMajorScales method a this.highlightKeyboard method with no arguments, and then have the arguments filled in and the method executed when the "m" key is pressed.
您正在监听 M,所以您遇到的唯一问题是在正确的上下文中调用 highlightKeyboard
。
考虑
var foo = {bar: function () {return this}),
bar = foo.bar;
foo.bar()
将返回什么? (foo
)bar()
将返回什么? (window
或 null
或抛出错误等)
有几种方法可以解决这个问题,您已经提到了 Function.prototype.bind
从概念上来说,使用 Function.prototype.call
可能更容易, Function.prototype.apply
或者甚至通过使用另一个标识符来传递 this
变量。
无论哪种情况,处理程序中的默认 this
将不再是 Keyboard 的实例,因为事件来自 document
使用Function.prototype.bind
你有几个选择
var highlightKeyboard = this.highlightKeyboard.bind(this);
$(document).keypress(function (event) {
if (event.which === 109) {
highlightKeyboard(scale, scale_classes);
}
});
// or binding args ahead of time too
var highlightKeyboard = this.highlightKeyboard.bind(this, scale, scale_classes);
$(document).keypress(function (event) {
if (event.which === 109) {
highlightKeyboard();
}
});
// or binding the handler
$(document).keypress(function (event) {
if (event.which === 109) {
this.highlightKeyboard(scale, scale_classes);
}
}.bind(this));
使用Function.prototype.call
或.apply
,需要引用this
var highlightKeyboard = this.highlightKeyboard;
var me = this;
$(document).keypress(function (event) {
if (event.which === 109) {
highlightKeyboard.call(me, scale, scale_classes);
}
});
仅使用对this
的引用
var me = this;
$(document).keypress(function (event) {
if (event.which === 109) {
me.highlightKeyboard(scale, scale_classes);
}
});
<小时/>
最后,还有一个解决方案是编写一个函数来生成您想要的内容,这与 .bind
所做的非常相似,但在不支持 的环境中受支持。绑定(bind)
(读取:遗留)
$(document).keypress(function (me) { // this function generates the inside one
return function (event) { // this is the function used as the handler
if (event.which === 109) {
me.highlightKeyboard(scale, scale_classes);
}
};
}(this)); // passing in `this` as param `me`
关于javascript - javascript .bind 可以上升多个级别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31190985/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!