Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 模拟按键的(dis)优点是什么?有更好的办法吗?_Javascript_Design Patterns_Event Handling_Dom Events - Fatal编程技术网

Javascript 模拟按键的(dis)优点是什么?有更好的办法吗?

Javascript 模拟按键的(dis)优点是什么?有更好的办法吗?,javascript,design-patterns,event-handling,dom-events,Javascript,Design Patterns,Event Handling,Dom Events,假设我有以下代码,它侦听输入元素,特别是在用户点击Enter键时执行回调: [*keyCodereference.] 指示所做的并不是这里的重点,而是将一些代码应用于参数“用户已提交文本”以在某处显示它 现在,如果我想让一些脚本以同样的方式监听一个“不可见的输入”,该输入不是由人填写的,而是由代码的一个单独部分填写的,该怎么办 假设一个名为fillHidden()的黑盒脚本函数在某个指定点填充hidden\u输入字段 document.getElementById('hidden_input

假设我有以下代码,它侦听输入元素,特别是在用户点击Enter键时执行回调:

[*
keyCode
reference.]

指示
所做的并不是这里的重点,而是将一些代码应用于参数
“用户已提交文本”
以在某处显示它

现在,如果我想让一些脚本以同样的方式监听一个“不可见的输入”,该输入不是由人填写的,而是由代码的一个单独部分填写的,该怎么办

假设一个名为
fillHidden()
的黑盒脚本函数在某个指定点填充
hidden\u输入
字段

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
还是这种做法不好?有人对如何做这件事提出了疑问,甚至有人质疑,但我找不到任何关于模拟按键的实际优点或其他方面的东西


有没有更好的方式、模式或互锁的回调系统可以让这些模块在分离的同时进行交互?我看过尼古拉斯·扎卡斯(Nicholas Zakas)将这种体系结构称为“松耦合”的视频,还有一本我称之为JavaScript模式的书(Stefanov,2010)暗示了订阅者/出版商模式的可能性。与模拟按键相比,这些功能有什么优势,特别是当模拟按键与用户一侧的事件具有某种对称性时?在模拟按键时,人们可能会遇到什么样的缺点/危险?

这一切都非常。。。摘要。
这一切都很好

提出这样的抽象解决方案并不一定是SO的目标,因为有无数种方法可以实现它们

但是,有几个关键点:

  • 除非您以某种方式将模拟代码链接到用户生成的事件,否则浏览器很可能会阻止您的模拟接管用户
    (想象一下浏览器允许页面上的任何JS在任何时候模拟任何按键或鼠标点击)。
    这通常意味着您被紧密地绑定在一起,使用一些不适合消费者使用的库,使用用户必须安装/运行的特定于浏览器的插件(例如:FireFox/Chrome/ie),或者使用bust。选择一个(或多个)

  • 自定义事件(带有回调)通常允许您将程序分开,但让它们一起工作。
    Zakas在沙箱方面做了一些很棒的演讲,但这些都是非常企业级的,游戏结束类型的东西。它们是很棒的,库建造者和系统工程师应该完全考虑它们,但是为了制作平均页面,最好是完成你需要写的100行,而不是建立一个完整的框架,一个既封装了外壳中的每个模块的库,又注入到该模块中。p>
  • 这就是酒吧助理(和观察员)/主持人(或调解人)发挥作用的地方。
    根据库的不同,上述任何一项也可以称为“发射器”或“发生器”等等

  • 以上每一项都是以基本相同的方式创建的,并且做相同的事情。
    目标是将结果传达给想要聆听的观众。
    演讲者选择何时通知听众以及告诉他们什么。
    观众可以选择随时收听,等待下一次广播(可能永远不会到来,但至少他们已经注意到了),也可以选择不收听,停止收听广播

    因此,他们之间的区别在于“演讲者”如何知道正在发生的事情

    发行者订户


    在发布者订阅者中,说话者是使事情发生的对象

    看看推特。
    你注册了一个Twitter帐户。一旦你拥有了它,你可以跟随任何你想要的人。
    任何时候他们发推特,你都会得到通知。
    任何人都可以关注你,这样你在推特上的任何时候,他们都会得到通知

    执行该操作的人将该操作发布给希望听到该操作的任何订阅者。可能有3000个订阅者和一个出版商(时事通讯),或者3000个出版商和一个订阅者。。。 可能会有出版商不订阅,或者订阅者不发布。。。但这就是范式

    观察者


    在观测者中,你所说的是一个物体,它与做功的物体相耦合。
    可能很紧。它可能松了。但是有一种东西在做什么,有一种东西确切地知道它在做什么。然后,人们窃听观察者的更新

    想想棒球时代,人们通过广播收听比赛。
    观察员将是电台评论员。
    他不是那个击球或偷垒的人。他是摊位上的那个人,他看到了一切,知道这一切意味着什么,并将其转化为用户友好的信息,供所有在家聆听的人使用

    现在,玩家可以在制作游戏时直接向所有的粉丝发推特(
    pub sub
    ),我相信FourSquare会找到一种方法让他们的地理位置精确到每基地的准确度,不必再去更新谁是三垒之王(这一次,他不是Jeff,在他狭窄的Z28里)

    调解人/主持人


    在这种情况下,我们讨论的是一个每个人都知道的对象,但没有人知道彼此

    想象一下一个广播谈话节目

    大家都知道这个节目。每个人都可以打电话进来,和主持人交谈。但除了巧合,没有人知道其他听众的情况

    它和我的有点不同
    document.getElementById('hidden_input').value = 'All filled out.'; // for example
    document.getElementById('hidden_input').onkeyup({keyCode: 13}); // simulate keypress
    
    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);
    });
    
    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
            /* ... */
        };
    
    };