【问题标题】:Forcing jQuery to limit its scope to some div强制 jQuery 将其范围限制为某个 div
【发布时间】:2016-07-06 16:50:26
【问题描述】:

有没有办法将$ 替换为$_sub 之类的东西,其动作包含在div 中?例如,我想将$_sub 注入一个函数,而不是使用$,该函数使用$_sub 将其范围限制在div 内,同时保留可以在$ 上调用的方法(例如我应该可以做到$_sub.ajax())

<a href="#">Outside </a>
<div id="contents" >
    <a href="#">Inside </a>
</div>

function modify($_sub) {
    var inner_a = $_sub("a"); //should return only the inner <a>
}

context 在这种情况下对我不起作用。我希望函数认为$_sub 就像$。我可以更改函数签名以将$_sub 重命名为$,这样函数甚至都不知道它使用的是实际$ 的范围受限版本。

【问题讨论】:

  • 设计一种使用选择器而不是 jquery 来限制作用域的方法,因为它在整个 DOM 上加载和工作,而不是在 DOM 树中的特定节点上。
  • 只需将上下文作为第二个参数传入...stackoverflow.com/questions/16422478/…
  • $_sub = $ 会将 jquery 引用复制到新变量。但它的范围不仅仅局限于它可以访问的 dom 元素。为什么不限制选择器中父基的范围?你想完成什么
  • 您可以使用更具体的选择器。例如:$_sub("#contents a") 将抓取 #contents 元素内的任何 a 元素。
  • 为什么不呢? var $_sub=$('#contents'); $_sub.find('a');

标签: jquery scope


【解决方案1】:

使用context:jQuery( selector [, context ] )

只需传递第二个参数。

在您的示例中,它将是: var inner_a = $("a", "#contents") 相当于$("#contents").find("a")

What is "context" in jQuery selector?

【讨论】:

  • context 在这种情况下对我不起作用。我希望函数认为 $_sub 就像 $.我可以更改函数签名以将 $_sub 重命名为 $,这样函数甚至都不知道它正在使用实际 $ 的范围受限版本
【解决方案2】:

其他答案中提到的上下文选项似乎更理智,但如果你真的不能使用它,你可以改为 curry 一个函数来自动提供上下文,然后将 curried 函数传递给你的 modify 函数:

var curry = function() {
  var args = Array.prototype.slice.call(arguments);
  var fn   = args[0];
  var after = args.slice(1);

  return function() {
    return fn.apply(this, after.concat(
      Array.prototype.slice.call(arguments)));
  };
};    

var _$_sub = function(context, sel) {
  return $(context).find(sel);
}

var $_sub = curry(_$_sub, '#content');

function modify($$) {
  var inner_a = $$("a");
  console.log(inner_a.text());
}

modify($_sub);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="">Outside</a>
<div id="content">
  <a href="">Inside</a>
</div>

【讨论】:

  • 但是 curried 函数返回一个 jquery 元素而不是 jquery 函数($)。所以我认为你不能在 $$ 上调用通常会在 $ 上调用的方法(例如,$$.ajax 将不起作用)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2015-11-25
  • 2022-01-16
  • 2021-05-03
  • 2011-10-22
相关资源
最近更新 更多