javascript - .on() 不适用于动态生成的内容

标签 javascript jquery dom event-handling dynamically-generated

我将尝试尽可能清楚地解释我正在尝试做的事情,希望人们能够理解这个问题。

$(document).ready(function() {
  $('body').on('click', '.mainNav', function() {
    var href = $(this).attr('href');
    $('body').load(href);
   });
});

这是一段给我带来麻烦的代码。基本上,它应该做的就是从 div 中获取“href”属性,然后加载它以替换 body 标记的当前内容。

这第一次有效,但是当通过 .load() 生成新内容时,div 停止响应。我对 JS 还很陌生,所以如果答案是显而易见的,我提前道歉。我一直在尝试自己寻找解决方案,但我发现的所有内容都告诉我 .on() 应该适用于动态生成的内容。

编辑:无法在 fiddle 中模拟问题,因此我发布了带有整个索引页的pastebin,希望能澄清问题。

http://pastebin.com/xT5syd9j

编辑:它使用adeneo的解决方案工作。非常感谢大家的意见,并对没有从一开始就发布整个内容表示歉意。我猜这会节省每个人一些时间。

最佳答案

这里的问题可能是您调用$('body').load(href)时真正加载的内容。 。如果你加载整个页面的HTML(包括<html><body>标签),那么你可能会遇到问题。您的浏览器通过从不正确的 HTML 中提供可用的内容(在您的情况下类似于 <html><body><html><body>...</body></html></body></html> )来解决此类问题 - 这可能会产生意外的结果。

更好的想法是:

  1. 正确组织 HTML(见下文)
  2. 当您使用 $(...).load() 加载时,仅加载上面生成的 HTML 的一部分.

广告1。确保 <body> 下面有一些元素标签,它有自己的 ID,包含位于 <body> 中的所有内容。标签。它可能看起来像这样:

<html>
...
<body>
    <div id="main_div">
    <!-- all elements here -->
    </div>
</body>
</html>

广告2。加载此类内容要容易得多,因为您可以附加选择器到传递给 .load() 的 URL。 (请参阅 jQuery .load() docs page 上的“加载页面片段”):

$('body').load(href + ' #main_div');

这样您将检索整个页面,但仅获取 ID 为“#main_div ”的元素并替换整个 <body>对此感到满意。

这样附加到正文的事件(即使是这些委托(delegate)的事件)应该仍然可以正常工作。

关于javascript - .on() 不适用于动态生成的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11812790/

相关文章:

javascript - 如何在单个函数中调整 JavaScript 事件的顺序?

javascript - 使用 Yii 2 中的 js 函数将 textInput 值添加到另一个文本输入

javascript - .outerHTML 中不存在命名空间属性

html - 将元素从一个 DOM 移动到另一个 DOM

jQuery 1.7 clientX/pageX 未定义

javascript - 我将如何迭代计数字段并合计它们并通过 Angular2 中的字符串插值输出

javascript - 如何使用 jQuery 提取作为 AJAX 响应接收到的 JSON 数据并将其添加到 HTML 选择下拉列表中?

javascript - 在按钮点击/提交时显示整个表单

javascript - 如何从选定对象的数组中获取数据属性值

php - JavaScript 无法获取用户的个人资料名称和 ID