【发布时间】:2016-01-21 09:21:11
【问题描述】:
我是一个 python/data 人,在一些网络上闲逛,对 JS 和 dom 以及所有这些基本上一无所知。所以发生了一些非常奇怪的事情,即使我找到了解决方案,我也试图了解其中的机制。
场景:常见问题
之前有一百万个 SO 问题类似于“我有一些工作的 jQuery/JS 可以操作一些 HTML。然后我没有对相关的 HTML 进行硬编码,而是以编程方式在其他地方创建它并通过AJAX。突然间一切都崩溃了。”
答案总是这样:“你不能这样做。将你的代码连接到父子链更高的东西,事件委托是一件神奇的事情,它会拯救你。”
这发生在我身上,我花了大约一个小时阅读以前的 SO 并了解事件委托,确实,它救了我,我的代码也能正常工作。
但我不明白为什么它一开始就坏了。因此,我希望有人可以向我解释基本理论,这样我将对整个 dom 位有更深入的了解。
一些损坏的代码
$(document).ready(function(){
$("#autopubs").load("pubslist.html");
// Obviously, the stuff in pubslist.html is what the next line was
// supposed to work on
$('.collapse').on('show.bs.collapse', function () {
$('.collapse.in').collapse('hide');
});
});
解决方案可能并不令人意外。将 autopubs 包装在一个外部 div 中,并将折叠的东西挂在上面。完成,工作,非常不满意。
但我仍然不明白为什么这是必要的。这是我对损坏的代码应该做什么的心理模型。
- 好的,文档加载完毕!让我们执行我们的代码吧!
- 第一行:让我们获取这个文件并将其添加到 DOM。这在世界上以 state, 的形式存在,现在我们将对其进行变异,就像对 state 所做的那样。
- 好的,现在它是 DOM 的一部分。我们已经完成了那条线。让我们转到下一行。
- 好的,现在我们想将一堆事件侦听器连接到类崩溃的所有内容。酷,让我们来看看 DOM 的当前状态。嘿,看,collapse 类里面有所有这些东西。巴姆。挂了。
除了 4 从未发生过,因为第二行代码显然看不到第一行添加的所有内容。
直觉上,有两个可能的原因:
第二行在第一行完成获取文件之前执行。如果这是真的,那么我学到了一些关于 javascript(或 jquery、ajax 或其他东西)的重要知识:行并不总是执行按顺序,或者至少不要总是在下一个开始之前完成。
第一行实际上并没有改变任何状态。 DOM 不是状态。它是别的东西,是什么……甚至是不可变的?第一行完全修改了其他东西,第二行无法触及,因为它试图修改 DOM。
老实说,这两种可能性对我来说似乎有点奇怪。但很明显,我根本不明白这里的幕后发生了什么。有人可以帮我吗?
【问题讨论】:
标签: javascript jquery ajax dom