Javascript 将数据从事件处理程序传递回调用方

Javascript 将数据从事件处理程序传递回调用方,javascript,jquery,Javascript,Jquery,我怎样才能做到这一点 $(window).bind('done', function (e) { e.result = "my data"; }); var state = $(window).trigger('done'); equal("my data", state); 当前.trigger返回JQuery对象 更新 事件是从另一个模块触发的,所以我不能使用闭包。您必须了解事件处理程序在JavaScript中是异步的。这意味着对异步函数的调用没有输出,也没有返回值。从异步函数获

我怎样才能做到这一点

$(window).bind('done', function (e) {
    e.result = "my data";
});

var state = $(window).trigger('done');
equal("my data", state);
当前
.trigger
返回JQuery对象

更新


事件是从另一个模块触发的,所以我不能使用闭包。

您必须了解事件处理程序在JavaScript中是异步的。这意味着对异步函数的调用没有输出,也没有返回值。从异步函数获取数据的唯一方法是传入回调,该回调将在输出可用时调用,或者在等待的事件发生时调用


jQuery为此提供了一个相当优雅的
deferred
API。我不知道它是如何与事件处理程序一起工作的,因为我不太使用jQuery,但我想这是您应该追求的,而不是这个。。讨厌。

您必须了解事件处理程序在JavaScript中是异步的。这意味着对异步函数的调用没有输出,也没有返回值。从异步函数获取数据的唯一方法是传入回调,该回调将在输出可用时调用,或者在等待的事件发生时调用

jQuery为此提供了一个相当优雅的
deferred
API。我不知道它是如何与事件处理程序一起工作的,因为我不太使用jQuery,但我想这是您应该追求的,而不是这个。。讨厌。

Frits是正确的——事件处理程序无法返回值。你可以把它想象成给警察的匿名举报:打电话的人给警察留下了一些信息,警察用这些信息做了些什么。来电者可能触发了警方的回应,但警方不知道信息来自何处,来电者对其信息的使用方式没有影响

也就是说,你可以很容易地做你想做的事情,你只需要重新安排一下

var state = null;

$(window).bind('done', function (e) {
    state = "my data";
    equal("my data", state);
});

$(window).trigger('done');
Frits是正确的--事件处理程序无法返回值。你可以把它想象成给警察的匿名举报:打电话的人给警察留下了一些信息,警察用这些信息做了些什么。来电者可能触发了警方的回应,但警方不知道信息来自何处,来电者对其信息的使用方式没有影响

也就是说,你可以很容易地做你想做的事情,你只需要重新安排一下

var state = null;

$(window).bind('done', function (e) {
    state = "my data";
    equal("my data", state);
});

$(window).trigger('done');

必须将JS代码的一部分移动到模块化(移动到可以插入的单独文件),如果使用模块,则必须在一个地方重置knockout.JS列表

所以这个代码:

    var treeSettings = eval(knockoutContext).Tree;

    if (oldData === listArray) {
        oldData = options.isObservable && !(treeSettings && treeSettings.IncludeChildren && treeSettings.IsBeingReconstructed) ? listArray().slice(0, rows.length) : [];
        listArray(oldData);
    }
变成这样:

    if (oldData === listArray) {
        oldData = options.isObservable ? listArray().slice(0, rows.length) : [];
        $(document).trigger('OnTheMove_OfflineJSBeforeListArrayReused', {knockoutContext : knockoutContext, callback : function(){ oldData = [];}});
        listArray(oldData);
    }
和在单独的文件中

$(document).on('OnTheMove_OfflineJSBeforeListArrayReused', function (e, options) {
    var treeSettings = eval(options.knockoutContext).Tree;
    if (treeSettings && treeSettings.IncludeChildren && treeSettings.IsBeingReconstructed) {
        options.callback();
    }
});

我知道处理程序和回调函数是异步的,似乎仍然可以正常工作。

必须将JS代码的一部分移动到模块化的位置(移动到可以插入的单独文件),如果使用模块,则必须在一个位置重置knockout.JS列表

所以这个代码:

    var treeSettings = eval(knockoutContext).Tree;

    if (oldData === listArray) {
        oldData = options.isObservable && !(treeSettings && treeSettings.IncludeChildren && treeSettings.IsBeingReconstructed) ? listArray().slice(0, rows.length) : [];
        listArray(oldData);
    }
变成这样:

    if (oldData === listArray) {
        oldData = options.isObservable ? listArray().slice(0, rows.length) : [];
        $(document).trigger('OnTheMove_OfflineJSBeforeListArrayReused', {knockoutContext : knockoutContext, callback : function(){ oldData = [];}});
        listArray(oldData);
    }
和在单独的文件中

$(document).on('OnTheMove_OfflineJSBeforeListArrayReused', function (e, options) {
    var treeSettings = eval(options.knockoutContext).Tree;
    if (treeSettings && treeSettings.IncludeChildren && treeSettings.IsBeingReconstructed) {
        options.callback();
    }
});

我知道处理程序和回调是异步的,但似乎仍然可以正常工作。

我也在寻找这个。尽管原则上,从处理程序获取数据是错误的。无论如何,以下是想法

不,您无法从处理程序获取数据。因为

但是如果您使用的是JQuery,(很可能)

  • 由于返回值将作为JQuery中的event.result存储在事件对象中,并且此事件对象通过所有处理程序传递,因此在处理程序中,您可以通过此“event.result”获取以前的处理程序结果

  • 原始事件触发器如何

    Jquery将通过以下代码将原始事件包装到另一个事件对象中

    // Make a writable jQuery.Event from the native event object
    event = jQuery.event.fix( event );
    
    原始事件存储为event.originalEvent。如果确实需要将一些信息传递回原始事件触发器函数。解决方案是将值放入该对象的属性中

    event.originalEvent.xxxx = xxxx;
    

  • 我也在找这个。尽管原则上,从处理程序获取数据是错误的。无论如何,以下是想法

    不,您无法从处理程序获取数据。因为

    但是如果您使用的是JQuery,(很可能)

  • 由于返回值将作为JQuery中的event.result存储在事件对象中,并且此事件对象通过所有处理程序传递,因此在处理程序中,您可以通过此“event.result”获取以前的处理程序结果

  • 原始事件触发器如何

    Jquery将通过以下代码将原始事件包装到另一个事件对象中

    // Make a writable jQuery.Event from the native event object
    event = jQuery.event.fix( event );
    
    原始事件存储为event.originalEvent。如果确实需要将一些信息传递回原始事件触发器函数。解决方案是将值放入该对象的属性中

    event.originalEvent.xxxx = xxxx;
    

  • 您正在查找
    e.originalEvent.result=“我的数据”?没有e.originalEvent属性(使用JQuery 1.5.1),您正在查找
    e.originalEvent.result=“我的数据”?没有e.originalEvent属性(使用JQuery 1.5.1)