RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 625993
Accepted
Pavel Mayorov
Pavel Mayorov
Asked:2020-02-10 14:34:17 +0000 UTC2020-02-10 14:34:17 +0000 UTC 2020-02-10 14:34:17 +0000 UTC

如何使用具有动态内容的 jquery 插件或为什么 javascript 在 AJAX 之后下降

  • 772

我将几个超级插件连接到页面:

$("*[data-foo]").foo();
$(".bar").bar();
$("p a b i").baz();

但是通过 AJAX 加载后,代码停止工作!怎么解决?!

javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Pavel Mayorov
    2020-02-10T14:34:17Z2020-02-10T14:34:17Z

    说“代码停止工作”是不正确的。因为代码没有开始工作。当你写的时候$(селектор).метод()——这意味着一个单一的方法调用。此方法适用于当前页面上与传递的选择器匹配的所有元素。

    通常他们说为了修复错误,通过ajax刷新页面后,再次执行代码。但这并不总是正确的。

    重新执行视图$(".bar").bar();调用bar不仅会在新元素上调用插件,还会在旧元素上调用插件。充其量,这将是浪费时间。但在最坏的情况下,由于重复调用,某些东西会损坏(如果您订阅了事件,那么某些东西肯定会损坏!)。因此,您只需将插件应用于更新的容器。

    还有一个关于如何在更新后调用这些插件的问题。通常他们会尝试通过服务器响应中的内联脚本来执行此操作——但在这种情况下,该脚本无法访问正在更新的元素。有必要查看更新本身发生的代码 - 并在那里进行编辑。


    以上是一般原则。下面我将编写一种方法,您可以尝试使代码在一个简单的案例中工作。

    1. 我们将页面的所有“改进”收集在一个地方:

      applyPlugins();
      
      // ...
      function applyPlugins() {
        $("*[data-foo]").foo();
        $(".bar").bar();
        $("p a b i").baz();
      }
      
    2. 我们更改结果函数,使其仅在传递给它的容器内起作用:

      applyPlugins($(document));
      
      function applyPlugins($cnt) {
        $cnt.find("*[data-foo]").foo();
        $cnt.find(".bar").bar();
        $cnt.find("p a b i").baz();
      }
      

      这里我们使用了find查找子元素的方法。

      重要的!函数applyPlugins不得访问传递给它的容器之外的元素$cnt!

    3. 我们在代码中找到执行动态内容更新或元素创建的那些地方。

      这可能是一个电话.html(...):

      $.ajax({
          // ...
      
          success: function (data) {
            $("#some_block").html(data);
          }
      });
      

      在这种情况下,您需要在html调用之后添加一个调用applyPlugins:

      $.ajax({
          // ...
      
          success: function (data) {
            applyPlugins($("#some_block").html(data));
          }
      });
      

      这可能是一个电话.load():

      $("#some_block").load("http://some/url");
      

      在这种情况下,您需要在那里添加一个带有回调函数的参数:

      $("#some_block").load("http://some/url", function () {
        applyPlugins($(this));
      });
      

      它也可能是别的东西。但我仍然希望你能找到这个地方——这是你的代码,而不是别人的:)


    如果用于插件的选择器通过动态容器,上述方法将不起作用:

    $(".foo .bar .baz").somePlugin();
    
    $(".bar").load(...);
    

    在这种情况下,尝试直接覆盖视图中的 applyPlugins$cnt.find(".foo .bar .baz").somePlugin()将失败,因为容器.foo的.bar子容器都没有被更新。

    在这种情况下,您可能应该更加注意更新或加载的内容和方式,而不是盲目地使用 applyPlugins 技巧。

    或者你可以尝试做这样的事情来为所有情况提供 - 但这段代码将很难理解和调试:

    $cnt.find(".foo .bar .baz").somePlugin();
    $cnt.filter(".foo, .foo *").find(".bar .baz").somePlugin();
    $cnt.filter(".foo .bar, .foo .bar *").find(".baz").somePlugin();
    

    (这会检查当前容器是一个元素.foo还是它的子元素,如果是,则.foo .bar .baz跳过路径中的第一个元素。此代码假定一个元素.foo不能嵌套在另一个元素中。与 相同.bar。)


    PS 虽然我只谈到了插件,但答案也适用于事件订阅。但这不是最好的方法——因为有更简单的方法。大多数事件都是弹出式的 - 因此它们可以在文档根目录中捕获。并且 jQuery 具有用于过滤弹出事件的内置机制。例子:

    $(document).on("click", "a[data-href]", function (e) {
        // ...
    })
    

    此处理程序将监听对具有属性集的任何链接的点击,data-href而不管它们以何种方式或何时出现在页面上。

    • 16

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5