0

我想创建两个 JQuery 函数。其中一个将使用在另一个函数中创建的数据。说:

jQuery.fn.myScroller = function (child) {
    var $moveable = this.children(child);
    var $children = this.children(child).children();

    posl = posl.replace('px', '');
    post = post.replace('px', '');
    var varList = [];
    $children.each(function () {
        var currVar = {};
        currVar.w = $(this).width();
        varList.push(currVar);
    });
    // I want to save varList variable somehow.
    this.varList = varList; // (1)
};

jQuery.fn.scrollUnitLeft = function () {
    // Now I need to use this varList if this function called
    // But the following returns undefined.
    // However, I've saved it inside this at (1)
    console.log(this.varList)
// More code...
}


$('#main_div').myScroller("#dummydiv");
$('#main_div').scrollUnitLeft();

正如我在代码中的注释中解释的那样,这不起作用。

我怎样才能做到这一点?

4

4 回答 4

1

按照建议创建名称空间或全局变量对我来说看起来并不干净。您已经在扩展 jQuery,因此将其设为 jQuery 变量:

jQuery.fn.varList = varList;

编辑:我真的不知道 jQuery 内部。如果fn仅用于函数,则将其放入jQuery自身或编写getter

jQuery.fn.getVarList = function () {
    return varList;
}
于 2013-01-16T17:49:39.027 回答
0

您对this我的理解看起来有点错误(请原谅我,您可能比我更有经验)!this指函数的调用者。两次都是 div main_div。尝试使用在两个函数之外声明的全局变量或data在第一个函数中的 div 上使用属性,并在第二个函数中访问该值。

于 2013-01-16T17:48:47.500 回答
0

当您运行 jQuery 函数时,this指的是每种情况下使用的 jQuery 对象实例。

在您的代码中,您创建了两个 jQuery 对象实例(每个$(...)调用一个),因此数据在第一个实例中设置,因此对第二个实例不可用。

如果您要在同一个 jQuery 对象实例上运行这两种方法,它们将按预期工作。

jQuery.fn.mySet = function(){
  this.myVar = this.attr('id');
};

jQuery.fn.myGet = function(){
  console.log(this.myVar);
}

$('#a_div').mySet();
$('#a_div').myGet(); // outputs 'undefined'

var $other_div = $('#other_div');
$other_div.mySet();
$other_div.myGet(); // outputs 'other_div'

为了实现您的意图,您必须将数据保存在 jQuery 对象实例之外的其他地方。jQuery 提供了一种通过该方法执行此操作的.data()方法。此方法允许您将数据附加到 DOM 元素。检查其文档

jQuery.fn.myRealSet = function(){
  this.data('myVar', this.attr('id'));
};

jQuery.fn.myRealGet = function(){
  console.log(this.data('myVar'));
}

$('#final_div').myRealSet();
$('#final_div').myRealGet(); // outputs 'final_div'

你可以在这里测试这个片段:http: //jsfiddle.net/HPjYn/

编辑:我还不能评论其他人的答案,但是按照建议添加一个 jQuery 原型变量将使数据可以从任何 jQuery 对象实例中获得,我认为这不是它的本意。

于 2013-01-16T17:55:42.667 回答
0

您可以在全局范围内创建命名空间:

window.yourNamespace = {};

然后将您的varList变量放在该名称空间中:

yourNamespace.varList = []; //Whatever you want here

这样,变量将可用于您的两个函数(或任何函数)。

于 2013-01-16T17:47:26.993 回答