- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下代码,它侦听输入元素,特别是在用户按下“ Enter”键时执行回调:
...
document.getElementById('human_input').onkeyup = (function (indicate) {
return function(e) {
var e = e || window.event; // for IE8
if (e.keyCode === 13) { // if user presses 'Enter' key*
indicate('User has submitted text');
}
}
})(indicate);
keyCode
参考
here。]
indicate
的作用实际上不是这里的重点,而是将一些代码应用于参数
'User has submitted text'
以便将其显示在某处。
fillHidden()
的黑盒脚本函数在某些指定点填充了
hidden_input
字段。
document.getElementById('hidden_input').value = 'All filled out.'; // for example
document.getElementById('hidden_input').onkeyup = (function (indicate) {
return function(e) {
var e = e || window.event; // for IE8
if (e.keyCode === 13) { // if user presses 'Enter' key
indicate('User has submitted text');
}
}
})(indicate);
fillHidden()
代码执行此操作:
document.getElementById('hidden_input').value = 'All filled out.'; // for example
document.getElementById('hidden_input').onkeyup({keyCode: 13}); // simulate keypress
最佳答案
这都是非常...抽象。
一切都很好。
提出这样的抽象解决方案并不一定是SO的目标,因为有上百万种方法可以实现它们。
但是,有几点要点:
除非您以某种方式将模拟代码链接到用户生成的事件,否则浏览器可能会阻止您的模拟接替用户
(想象一下,让页面上的任何JS随时模拟任何按键或鼠标单击的浏览器)。
这通常意味着您紧密联系在一起,使用了一些非供消费者使用的库,使用了用户必须安装/运行或破坏的特定于浏览器的插件(即:FireFox / Chrome / IE)。选择一个(或多个)。
带有回调的自定义事件通常是允许您使程序保持独立但使它们一起运行的功能。
Zakas在Sandboxing上进行了一些精彩的演讲,但这些都是非常企业级的,最终游戏类型的事情。它们很棒,并且库构建者和系统工程师应该完全考虑它们,但是对于平均页面而言,最好用库来完成需要编写的100行,而不是构建一个完整的框架它既将每个模块包装在一个外壳中,又将自身注入该模块中。
这就是Pub-Sub(和观察者)/主持人(或中介者)发挥作用的地方。
根据库的不同,上述任何一种也可以称为“发射器”或“生成器”等。
上面的每一项都是以基本相同的方式创建的,并且执行相同的操作。
目的是将结果传递给想要听的听众。
演讲者选择何时通知听众,以及告诉他们什么。
观众选择随时收看,等待下一个广播(可能永远不会到来,但至少他们对此有所注意),或者他们可以选择收看并停止收听广播。
那么,它们之间的区别就是“说话者”如何知道正在发生的事情。
发布者-订阅者
在publisher-subscriber
中,说话者是使事情发生的对象。
看Twitter。
您注册一个Twitter帐户。拥有之后,您就可以关注任何人。
每当他们发推文时,您都会收到通知。
任何人都可以关注您,以便在您发送任何推文时都会收到通知。
执行该操作的人将该操作发布给任何想要收听该操作的订阅者。可能有3000个订阅者和一个发布者(新闻通讯),或者3000个发布者和一个订阅者...
可能有一些发布者不订阅,或者订阅者不发布...……但这就是范例。
观察者
在observer
中,您所谈论的是一个与完成工作的事物相关的对象。
可能会很紧。它可能很松。但是有一件事正在做某事,有一件事确切地知道它在做什么。然后,人们会向观察程序发出错误,以进行更新。
想想棒球时代,人们在广播中收听比赛。
观察者将是无线电评论员。
他不是那个击球或偷垒的人。他是展位中的一员,他看到了所有发生的事情,知道了这一切的含义,并将其转变为用户友好的信息,供所有在家听的人使用。
如今,玩家可以在制作过程中直接向其所有粉丝(pub-sub
)发出推文,我相信FourSquare会找到一种方法来使他们的地理位置降低到每个基准的准确性,手动更新三垒手的王者身份(这一次,不是在狭窄的Z28中的杰夫)。
调解人/主持人
在这种情况下,我们谈论的是每个人都知道的对象,但没人知道彼此。
想象一下通话中的广播节目。
大家都知道表演。每个人都可以参加演出,并与主持人交谈。但是除了巧合,没有人对其他听众一无所知。
它与pub-sub
有点不同,因为每个人都是发布者,但是您不必知道某人的Twitter句柄就可以收到他们的来信。您可以说Hey Twitter, any time anybody in the world mentions #browns, let me know. I'm starving.
。
它与observer
有点不同,因为在主持人监视正在执行工作的人员时,任何人都可以随时进行工作。
哪一个是正确的?
这完全取决于您的需求以及您实际打算如何处理。
这是我们制作主持人的方法:
var Moderator = function () {
var events = {},
notify = function (evtName, data) {
var evt = events[evtName];
if (!evt) { return; }
evt.forEach(function (func) { func(data); });
},
listen = function (evtName, callback) {
events[evtName] = events[evtName] || [];
events[evtName].push(callback);
},
ignore = function (evtName, callback) {
var evt = events[evtName];
if (!evt) { return; }
evt.forEach(function (func, i, arr) {
if (func === callback) { arr.splice(i, 1); }
});
};
return { ignore : ignore,
listen : listen,
notify : notify };
};
var Game = function () {
var game_moderator = Moderator(),
scoreboard = Scoreboard(),
messages = MessageBoard(),
player_one = Player(),
player_two = Player();
function initialize () {
player_one.initialize(game_moderator);
player_two.initialize(game_moderator);
game_moderator.listen("player:death", scoreboard.update);
game_moderator.listen("player:death", messages.add_kill);
game_moderator.listen("chat:input", messages.add_msg );
}
function start() {}
/* update... draw... etc... */
return {
load : load,
initialize : initialize,
start : start
};
};
var game = Game(),
loading = game.load();
loading.done(function () {
var initializing = game.initialize();
initializing.done(game.start);
});
Player
可能看起来像这样:
var Player = function (name) {
var system,
health = 30,
damage = [],
attack = function () { /* ... */ },
hurt = function (amt, type, from) {
health -= amt;
damage.push({ amount : amt, type : type, from : from });
},
die = function () {
var killing_blow = damage[damage.length - 1];
killing_blow.player = name;
system.notify("player:death", killing_blow);
},
update = function () {
if (health <= 0) { die(); }
},
draw = function () {},
initialize = function (sys) { system = sys; };
return {
initialize : initialize,
update : update,
draw : draw,
hurt : hurt
/* ... */
};
};
Game.initialize
函数,我们可以看到我们有一个记分板和一个消息面板,它们都将与“ player:death”事件相关联。
player_one
对
player_two
一无所知,
scoreboard
对任何事情一无所知,只是偶尔会调用它的
.update
方法并传递杀死信息,并且
messages
会得到各种各样的爱,但这就是其中的一种每个人都是一个陌生人
hidden-input
,为什么不构建观察者呢?
keyup
事件侦听器和
keydown
事件侦听器的观察器。
keydown
事件每秒会触发数十次-您可能不希望这么做...因此在有新键时发出警报添加,或在释放按键时发出警报)。
hidden-input
订阅它。
hidden-input
已满时,或者您的要求正在运行... ...并且您要触发事件时,请使用全局主持人(或位于
hidden-input
的事件或任何有意义的事件。
"hidden-input-filled"
的事件。
hidden-input
的事物,而这是唯一应了解其事件的事物,并且
hidden-input
还应该能够了解它们的某些事物,则将其设为
hidden-input
。
关于javascript - (模拟按键的缺点是什么?是否有更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14387645/
据我所知,根本不为元素呈现 HTML,或添加 display:none,似乎具有完全相同的行为:两者都使元素消失并且不与 HTML 交互。 我正在尝试禁用和隐藏一个复选框。所以HTML的总量很小;我无
我刚刚读了Android Architecture Tutorial: Developing an App with a Background Service (using IPC) .基本上是 让服
我有两个查询具有相同的结果,现在我想知道哪个查询更优化? 在选择中: select t1.*, sum(t2.value) as total_votes from table1 t1 left joi
有人告诉我,对于 I/O 绑定(bind)的应用程序,非阻塞 I/O 会更好。对于 CPU 密集型应用程序,阻塞 I/O 会好得多。我找不到这种说法的原因。试过谷歌,但很少有文章只是触及这个话题而没有
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我有一个算法可以在数字列表中寻找好的对。一个好的配对被认为是索引 i 小于 j 且 arr[i] 1: # Finding the mid of the array
我从 API 收到一个 json,我需要解析并修改一个属性值。问题是,我收到的 json 数据的嵌套结构不一致,我无法控制它。 这将禁止我指定在特定深度(如 parsedJson.children[0
我有 451 个城市的坐标。现在我想计算每个城市之间的距离,然后根据该距离对一些结果进行排序。现在我有两个选择: 我可以运行一个循环来计算每个可能的城市组合的距离并将它们存储到一个表中,这将产生大约
对于返回相同结果的不同查询,我有两个查询计划我想知道是否有人可以告诉我哪个“更好”,以及为什么。 SELECT * FROM bids order by (select ranking from us
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我有一个二维数组。我需要尽可能快地对其执行一些操作(函数每秒将被调用十几次,所以让它变得高效会很好)。 现在,假设我想获取元素 A[i][j],简单地使用 A[i][j] 在速度上有什么不同吗和 *(
在声明或使用字符串的代码中,我通常会看到开发人员这样声明它: string randomString = @"C:\Random\RandomFolder\ThisFile.xml"; 代替: str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why don't CSS resets use '*' to cover all elements? 我正
如果我有一个包含许多重复项的 python 列表,并且我想遍历每个项目,而不是重复项,最好使用一个集合(如 set(mylist),或者找到另一种方法来创建没有重复的列表?我想只是循环遍历列表并检查重
在阅读常量接口(interface)反模式时,我发现没有实例的最终常量类比常量接口(interface)更好。 请解释一下怎么做? public interface ConstIfc { publ
我正在查看我继承的一些旧代码,我真的不喜欢某些地方的风格。我真的不喜欢它的外观的一件事是: bool func() { bool ret = true; ret &= test1();
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我经常发现自己试图使用 boost/QT 信号解耦对象。实现这一点的简单方法是针对我要通信的每个具体类型,创建一个新的信号和插槽签名并连接所有相关对象。这导致了访问者模式,理想情况下我想发出一个访问者
我正在 https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html 上阅读有关 lambda 的内容 在方法
public List getInts() { List xs = new ArrayList(); xs.add(1); // return Collections.unmo
我是一名优秀的程序员,十分优秀!