2008-11-25 61 views
5

我在基于wiki的CMS中使用Fish小工具(http://abowman.com/google-modules/fish/),并且需要将小工具从一个HTML元素重新定位到另一个HTML元素。 (注意:鱼小工具就是一个例子 - 其他小工具也会遇到问题。)移动包含动态创建的脚本标记的DOM元素

如果我使用小工具基类“ig_reset”直接重新定位小工具,那么一切正常。如果我尝试使用周围包装进行重新定位,那么小工具使用的iframe似乎会接管。不幸的是,我需要使用周围包装重新定位的灵活性。

这似乎与在DOM中移动SCRIPT标签有关。该小工具动态地创建脚本和样式标签。如果我从DOM中删除动态创建的脚本标记,然后将包装程序重新定位到DOM中的另一个位置,这一切都很好。如果我尝试脚本标记移动到另一个DOM元素,则会发生原始问题。所以移动围绕DOM的脚本标记似乎是原因 - 无论移动何时发生(甚至是后加载)。

我想知道这里发生了什么事情,导致框架接管页面,并找到比删除动态创建的脚本标记更好的解决方案。

我把一个测试在这里:http://solidgone.com/jquery/google-gadget.html - 演示使用jQuery的,但我不认为这是关系到jQuery的...

回答

16

每当你追加一个脚本元素插入到页面中,使用jQuery,它会尝试执行它。因此,当你移动ig_reset(这只是一个表 - 没有脚本),它没有问题。当您尝试移动包含脚本的包装器时,脚本将被移动并重新执行。

我们正在努力解决jQuery核心中的这个重新执行问题,但暂时就是这里发生的事情。

+1

主人!也许你可以回答[这个理论问题](http://stackoverflow.com/q/10753306/601179)关于你的真棒jQuery库? – gdoron 2012-05-25 11:46:31

5

正如John Resig所说,这个的一个jQuery问题。您可以通过替换您的处理程序进行验证

$("#with-wrapper").click(function() 
{ 
    $('.sidebar-content-wrapper').contents().appendTo($("#sidebar")); 
}); 

与一个避免使用jQuery方法实际移动的每个元素:

$("#with-wrapper").click(function() 
{ 
    var sidebar = $("#sidebar")[0]; 
    $('.sidebar-content-wrapper').contents().each(function() 
    { 
     // raw DOM method rather than jQuery's 
     // appendTo() -> domManip() -> execute script blocks behavior 
     sidebar.appendChild(this); 
    }); 
}); 
+0

感谢您的补充见解。 – DaveG 2008-11-26 03:15:13