Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.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
JQuery/Javascript钩子_Javascript_Jquery_Events_Hook - Fatal编程技术网

JQuery/Javascript钩子

JQuery/Javascript钩子,javascript,jquery,events,hook,Javascript,Jquery,Events,Hook,我正在写一个附加组件。我需要以某种方式修改现有的javascript/jquery。它根据输入计算价格。伪代码(我需要修改的原始js): 我需要修改计算出的价格。因此,我需要以如下方式修改原始js: modified price = triggerEvent('modifyThePrice', price) 换句话说:我需要调用一个钩子,其他javascript可以在那里完成他们的工作,并在需要时修改价格(或者类似于带有返回语句的事件) 根据要求,我还将添加更精确的代码 $('form

我正在写一个附加组件。我需要以某种方式修改现有的javascript/jquery。它根据输入计算价格。伪代码(我需要修改的原始js):

我需要修改计算出的价格。因此,我需要以如下方式修改原始js:

    modified price = triggerEvent('modifyThePrice', price)
换句话说:我需要调用一个钩子,其他javascript可以在那里完成他们的工作,并在需要时修改价格(或者类似于带有返回语句的事件)

根据要求,我还将添加更精确的代码

$('form#buy').bind('price-update', function(){
/*
* a LOT of code, getting input, calculating price. at the end we have a var 
*price which is numeric
*/

//What I need to do now
var modified_price = modifyPrice(price);
});
只是modifyPrice(price)必须调用页面上的每个其他js,这样每个人都有机会进行交互

对于你们这些了解wordpress的人:我需要做一些在wp中可以做的事情,包括:

$modified_price = apply_filters('modify_price', $price);
每个人都可以将函数绑定到“修改价格”挂钩


我希望这有助于理解这个问题,这个怎么样。首先,过滤器模块:

var filter = {

    filters: {},

    add: function (tag, filter) {
        (this.filters[tag] || (this.filters[tag] = [])).push(filter);
    },

    apply: function (tag, val) {
        if(this.filters[tag]){
            var filters = this.filters[tag];
            for(var i = 0; i < filters.length; i++){
                val = filters[i](val);
            }
        }
        return val;
    }
}
以及应用过滤器:

name = filter.apply('modify_name', name);

或者,下面是使用dom事件的方法:

$(window).on('modify_name', function (e, data) {
    data.name = 'MR. ' + data.name;
});

var data = {};
data.name = 'joe';
$(window).trigger('modify_name', data); 
注意:
jQuery.trigger
不会从事件侦听器返回值,因此挂钩必须直接更改数据,而不是返回数据。此外,在Javascript中,除了对象之外,不能通过引用传递值。因此,为了传递数据进行修改,我们必须首先将其存储在对象中,然后将对象传递给钩子


这个怎么样。首先,过滤器模块:

var filter = {

    filters: {},

    add: function (tag, filter) {
        (this.filters[tag] || (this.filters[tag] = [])).push(filter);
    },

    apply: function (tag, val) {
        if(this.filters[tag]){
            var filters = this.filters[tag];
            for(var i = 0; i < filters.length; i++){
                val = filters[i](val);
            }
        }
        return val;
    }
}
以及应用过滤器:

name = filter.apply('modify_name', name);

或者,下面是使用dom事件的方法:

$(window).on('modify_name', function (e, data) {
    data.name = 'MR. ' + data.name;
});

var data = {};
data.name = 'joe';
$(window).trigger('modify_name', data); 
注意:
jQuery.trigger
不会从事件侦听器返回值,因此挂钩必须直接更改数据,而不是返回数据。此外,在Javascript中,除了对象之外,不能通过引用传递值。因此,为了传递数据进行修改,我们必须首先将其存储在对象中,然后将对象传递给钩子


这个简单的JavaScript钩子系统支持名称空间,它将把所有钩子函数存储在一个名为
钩子的对象中:

var hooks={};//把所有的钩子都放在这里
功能开启(名称,fn){
name=name.split('.');
如果(!hooks[name[0]])hooks[name[0]={};
var i=name[1]| | Object.key(hooks[name[0]]).length;
hooks[name[0]][i]=fn;
}
功能关闭(名称){
如果(!name){
返回挂钩={};
}
name=name.split('.');
如果(名称[1]){
删除钩子[名称[0]][名称[1]];
}否则{
删除钩子[名称[0]];
}
}
函数触发器(名称、参数){
name=name.split('.');
如果(!hooks[name[0]])hooks[name[0]={};
如果(名称[1]){
if(hooks[name[0]][name[1]])hooks[name[0]][name[1]].apply({},param);
}否则{
for(钩子[name[0]]中的变量i){
hooks[name[0]][i].apply({},param);
}
}
}

添加
单击
挂钩
添加一个ID为foo的钩子

移除所有
单击
挂钩
移除一个ID为foo的钩子

触发所有
单击
挂钩
触发器
单击
用ID`foo钩住`

这个简单的JavaScript钩子系统支持名称空间,将所有钩子函数存储在一个名为
钩子的对象中:

var hooks={};//把所有的钩子都放在这里
功能开启(名称,fn){
name=name.split('.');
如果(!hooks[name[0]])hooks[name[0]={};
var i=name[1]| | Object.key(hooks[name[0]]).length;
hooks[name[0]][i]=fn;
}
功能关闭(名称){
如果(!name){
返回挂钩={};
}
name=name.split('.');
如果(名称[1]){
删除钩子[名称[0]][名称[1]];
}否则{
删除钩子[名称[0]];
}
}
函数触发器(名称、参数){
name=name.split('.');
如果(!hooks[name[0]])hooks[name[0]={};
如果(名称[1]){
if(hooks[name[0]][name[1]])hooks[name[0]][name[1]].apply({},param);
}否则{
for(钩子[name[0]]中的变量i){
hooks[name[0]][i].apply({},param);
}
}
}

添加
单击
挂钩
添加一个ID为foo的钩子

移除所有
单击
挂钩
移除一个ID为foo的钩子

触发所有
单击
挂钩
触发器
单击
用ID`foo钩住`

您应该发布您试图修改的相关代码,这样更容易理解您正在寻找的内容。您应该发布您试图修改的相关代码,这样更容易理解您正在寻找的内容。感谢您的努力!这是一个很好的解决方法。但是,难道没有更简单的方法,我不需要实现吗?如果你写了一些你知道会为哪些地方编写插件的东西,那么必须有一种“正常”的方式让其他人有机会修改你的代码。你可以使用
dom
事件,但这不是一个“干净”的解决方案,原因如下:a)
jQuery。trigger
不会从侦听器返回值,因此,您必须直接更改钩子中的值。b) 在JS中,除了对象之外,不能通过引用传递值。因此,每当您想要应用过滤器时,您必须首先将数据存储在对象中,然后触发过滤器,传递它可以更改的对象。c) 这会很难看:
$(window).on('modify_name',function(e,data){data.name='newname';})请参阅-&非常感谢您的努力!这是一个很好的解决方法。但是,难道没有更简单的方法,我不需要实现吗?如果你写了一些你知道会为哪些地方编写插件的东西,那么必须有一种“正常”的方式让其他人有机会修改你的代码。你可以使用
dom
事件,但这不是一个“干净”的解决方案,原因如下:a)
jQuery.trigger
不会从侦听器返回值