javascript - 在 IE8 上使用 jQuery 克隆 HTML5 元素和事件

标签 javascript jquery html internet-explorer

我正在尝试使用 jQuery 1.8.1 克隆一个 HTML5 元素,但是 this example jsbin在 IE<9 上失败(元素未被克隆)

代码(简化)

<head>
  <script src="http://code.jquery.com/jquery-1.8.1.min.js"></script>

  <!--[if lt IE 9]>
     <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  <![endif]-->
</head>

<body>

  <section>My section</section>
  <button>Clone section</button>
  ...

  <script>
  var section = $('section');
  $('button').on('click', function() {
    var clone = section.clone(true);
    $(clone).insertAfter($('section:last'));
  }); 

  $('section').on('click', function() {
     alert('hey, I am a section');
  }); 
  </script>

</body>

当然,这是一个简化的演示。在我的真实代码中,我有许多带有多个事件的嵌套元素:

我的问题

  1. 这是 jQuery 的错误还是我在代码中遗漏了什么?

  2. 因为我也在克隆与节点关联的事件,我可以使用哪种优雅的替代方法来在 IE<9 上重现 clone() 的相同行为?

到目前为止,我发现的唯一解决方法是通过 html() 复制所有节点,通过 append() 附加它们并利用与这些节点关联的事件的事件委托(delegate),就像这样

  $('body').on('click', 'section', function() {
     alert('hey, I am a section');
  }); 

但我对不同的想法持开放态度:我可以使用更优雅/性能/更简单/更快的方法吗?

谢谢。

最佳答案

我想在所有评论之后,我不妨添加这个作为答案:问题似乎是您需要一个 html5 垫片(如 html5shiv ),并且需要在您的 HTML5 元素出现之前加载它(以免解析器混淆)。 defer attributes JSBin automatically adds打破这种行为。

如果没有垫片,元件就会 splinter 。 DOM 最终看起来像这样:

<section/>
My section
</section/>

(如在 IE8 开发工具中所见——您至少要佩服这里发挥作用的解释的创造力)

这会破坏所有相关的选择器(这就是为什么您发布的 JSBin item 中的文本不是绿色的原因)。所有其他调用(插入、附加等)仍在工作的原因是您提供的 html 是相同的(并且会以相同的方式被错误解析)。

解决方案是强制 shim 在您的元素出现之前完全加载,如 jsFiddle counterexample 中所示我发布了。

希望这能解决您的问题。我提交了 JSBin issue regarding the problems caused by the defer attributes .

更新:这应该在 jsbin 中得到修复。

关于javascript - 在 IE8 上使用 jQuery 克隆 HTML5 元素和事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12351271/

相关文章:

javascript - Tizen SDK : Can't find variable: tizen

javascript - 点击后退按钮后停止 Angular $timeout 计时器

javascript - NG-model 值未从指令元素中定义

javascript - 用 css 居中 html 内容

html - 如何将div中的内容居中

javascript - 预加载图像,仍然闪烁

javascript - 选中另一个复选框时启用点击事件

javascript - jQuery $.when 立即触发

javascript - 使用 JSON 数据填充 HTML 表,每个数组对象获取一个单元格而不是一行

html - 如何通过亲属子DIV扩展父DIV?