【问题标题】:Use jQuery's end() in my plugins在我的插件中使用 jQuery 的 end()
【发布时间】:2012-02-27 14:23:33
【问题描述】:

如何将 jQuery 对象的堆栈复制到另一个 jQuery 对象,这样即使返回完全不相关的对象,我也可以在我的插件中使用 end?示例:

$(myselector)
    .next()             // Destructive operation
        .doSomething()
    .end()              // Goes back to "myselector"
    .doSomethingElse(); // Works fine!

$.fn.myPlugin = function() {
    return $(unrelated); // No stack, can't call "end" on it
};

$(myselector)
    .myPlugin()         // Destructive operation
        .doSomething()
    .end()              // Goes back to nowhere, since the stack is empty
    .doSomethingElse(); // Doesn't work

我想修改$(unrelated) 对象以包含this 的堆栈,所以第二个示例可以工作。这是 jsFiddle 中完整的 example

【问题讨论】:

标签: jquery jquery-traversing


【解决方案1】:
$.fn.myPlugin = function(related) {
    if ( related == "getRelated" )
        return this.pushStack($(this.data("related")).get()); // Want to preserve stack
    return this.data("related",related);
};

您需要将元素推入堆栈,以便 end() 回到它。

【讨论】:

  • 谢谢,pushStack 工作正常!但是为什么get,真的有必要吗? (我的例子是 jsFiddle 使用和不使用它)
  • 我添加了 get(),因为没有 get(),它与执行类似 $($(domElement)) 之类的操作相同,返回的结果与 $(domElement) 相同。
  • 哦,我明白了,这是为了防止原始对象被修改(以防我在代码的其他部分依赖它的堆栈),对吧?还没想好,谢谢! (虽然在这个例子中它是不必要的,因为它不是一个 domElement 而是一个存储在数据中的选择器;但最好意识到这种可能性)
【解决方案2】:

在我看来,您编写插件的方式似乎扰乱了 jQuery 的逻辑,因为您返回了 jQuery 可能没有预料到的东西。这只是一个猜测,因为我根本不了解 jQuery。

也许你可以在 .doSomething() 中做你想做的事?

【讨论】:

  • AFAIK jQuery 在其方法中不依赖end,更多的是为了用户方便。它允许以接近声明性语法的方式链接调用。所以,我想做的不会“破坏”任何东西,只是以不可预见的方式扩展它......
【解决方案3】:

如果您查看 $( '#a' ) 上的数据,它只是一个表示 '#c' 的字符串,而不是实际的 jQuery 对象。我为你更新了代码http://jsfiddle.net/89gkD/3/

【讨论】:

  • 谢谢,但请注意我在退回之前如何将其包装在 $() 中。 (证明它以这种方式工作的证据是 C 实际上变成了绿色 - 它是 end 没有工作)无论如何,这只是一个例子,这种技术的实际使用可能会返回几乎任何东西(例如:由插件动态创建的无 id 元素,在 DOM 中与它无关)。
猜你喜欢
  • 2011-06-23
  • 2020-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2012-09-25
相关资源
最近更新 更多