$("body").wrapInner 会运行两次?jquery的bug?

黑色渐变 2011-11-25 09:59:58
$("body").wrapInner("<div class='test'></div>");

发现会有两层<div class='test'></div>讲原有body间内容包裹,而如果是对普通div操作则不会出现这种问题。

用的jquery 1.5.2,难道是bug?

不知道有木有人遇到相同情况,怎么解决的?
...全文
181 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
王集鹄 2011-11-25
  • 打赏
  • 举报
回复
可以选择只包裹body下一级的div元素。
$(function(){
$("body>div").wrap("<div class='test'></div>");
});
王集鹄 2011-11-25
  • 打赏
  • 举报
回复
这和jquery的版本没有关系,也不是bug

wrapInner的意思就是在元素内部包裹
包裹前:
<body>
<div id="wrap">
其他内容
</div>
<script>
alert($);
</script>
</body>


包裹后:
<body>
<div class='test'>
<div id="wrap">
其他内容
</div>
<script>
alert($);
</script>
</div>
</body>


执行动态添加的<script>代码是jquery挺好的功能。
$(function(){
$('<\script>alert("zswang 路过")<\/script>').appendTo('body');
});

默默不得鱼 2011-11-25
  • 打赏
  • 举报
回复
这个应该是不可避免的吧,你body内部的DOM结构发生变化了,浏览器会再次加载新的DOM结构 那里面的script肯定是要再次执行的
默默不得鱼 2011-11-25
  • 打赏
  • 举报
回复
表示从未用过这些方法 学习了
黑色渐变 2011-11-25
  • 打赏
  • 举报
回复
wrapInner,wrap,wrapAll都涉及到此问题
黑色渐变 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 p2227 的回复:]

引用 5 楼 voteon83 的回复:

还是有问题,就算加了$(function(){});也还是运行两次

问题出在于 “DOM节点内的script标记引发$.fn.ready函数执行2次” http://cmc3.cn/n/228.html
把整个$();放在head中
[/Quote]

可能你理解错了,是只要wrapInner的目标容器内有脚本,就会被执行两次
我是为了写一个jquery插件,不能限制别人body区域不能放脚本。
测试代码如下:


<head>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.2.min.js"></script>
<script>
$(function(){$("body").wrapInner("<div class='test'></div>");});
</script>
</head>
<body>
<div id="wrap">
其他内容
</div>
<script>
alert($);
</script>
</body>
p2227 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 voteon83 的回复:]

还是有问题,就算加了$(function(){});也还是运行两次

问题出在于 “DOM节点内的script标记引发$.fn.ready函数执行2次” http://cmc3.cn/n/228.html
[/Quote]把整个$();放在head中
黑色渐变 2011-11-25
  • 打赏
  • 举报
回复
还是有问题,就算加了$(function(){});也还是运行两次

问题出在于 “DOM节点内的script标记引发$.fn.ready函数执行2次” http://cmc3.cn/n/228.html
黑色渐变 2011-11-25
  • 打赏
  • 举报
回复
解决了,我的代码本身没问题。

原来是在body标签还未完全加载的情况下触发此事件,则会wrapInner两次,谢谢#3的代码
p2227 2011-11-25
  • 打赏
  • 举报
回复
我这边没问题,应该是你其他代码导致这段代码执行了两次
<head>
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.2.min.js"></script>
<script>
$(function(){
$("body").wrapInner("<div class='test'></div>");
});

</script>
</head>
<body>
<div id="wrap">其他内容</div>
</body>
默默不得鱼 2011-11-25
  • 打赏
  • 举报
回复
我估计是你的方法被调了两次 前面alert一下看看
默默不得鱼 2011-11-25
  • 打赏
  • 举报
回复
1.7表示无压力
王集鹄 2011-11-25
  • 打赏
  • 举报
回复
楼主,我花时间帮你提供解决方案,你感到无奈,我也就没什么话说了。
黑色渐变 2011-11-25
  • 打赏
  • 举报
回复
LS的,你一直说这不是BUG,然后给出种种非常规的办法,哈哈,我表示很无奈

不过我现在换用其他方式解决了。

我上面都说了,我在写一个jquery插件,不可避免别人在目标容器内放置脚本。remove掉script就是破坏别人页面了
王集鹄 2011-11-25
  • 打赏
  • 举报
回复
不按照你的意愿执行就是bug?
虽然我觉得很合理,但是不是bug你可以找jquery作者讨论一下,超出了我控制的范围。

解决的方案还有一种,就是先把script都移除掉,再wrap。
 $("script").remove();
黑色渐变 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zswang 的回复:]

可以选择只包裹body下一级的div元素。
JScript code
$(function(){
$("body>div").wrap("<div class='test'></div>");
});
[/Quote]

如果DIV内部还有脚本呢?
何来非BUG一说?

87,923

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧