<body> <div id="project"> <h1>Hi</h1> <h2>Hello</h2> </div> </body>
以下是jQuery代码:
$(function(){ var h = $('#project').html(); $('#project').remove(); $(h).hide().appendTo('body'); alert("Created HTML,hide,and appended!"); });
$(h).hide()部分导致jQuery在Safari 4和Firefox 3.5中抛出异常.
Safari:TypeError:表达式’this [a] .style'[undefined]的结果不是对象.
Firefox:未捕获的异常:[Exception …“无法转换JavaScript参数arg 0”nsresult:…]
当我将HTML更改为仅包含两个标题中的一个时(如果从HTML中删除< h1>或< h2>,则脚本会成功运行.为什么会这样?
要自己试试,请参阅http://jsbin.com/avisi/edit
编辑:我实际上并没有尝试从DOM中删除元素并通过复制HTML重新插入它.这只是我在更复杂的代码中遇到的错误的一个测试用例,我试图理解为什么会出现这个错误.我同意,如果我想完成这里显示的内容,我会使用类似$(‘#project’)的东西.remove().children().appendTo(‘body’)
解决方法
$('#project').remove().children().appendTo('body').hide();
分解,这就是正在发生的事情
// Get the `project` container $('#project') // Remove it from the page .remove() // Get its children (the h1,h2,etc) .children() // Append those nodes to the body .appendTo('body') // Hide those nodes .hide();
其他人提出.hide()导致问题,因为它所应用的节点不是主文档的一部分;然而,事实并非如此.只要您维护对任何节点的引用,就可以影响其样式属性(通过hide,show等).
您可能想要检查的一件事是确保$(‘#project’)实际上返回(如果有的话)预期节点.否则可能会出现问题.
所以我在Safari中探索并发现了你的问题.这是开发人员控制台的转储.
> var h = $('#project').html(); undefined > var t = $(h); undefined
到现在为止还挺好. undefined在这里只是意味着语句(var语句)没有返回值(它没有)
> t.hide() ajax.googleapis.com/ajax/libs/jquery/1.4.0/jquery.min.js:131TypeError: Result of expression 'this[a].style' [undefined] is not an object.
这是您描述的错误.检查jQuery对象中的每个项目将显示以下错误
> t[0] <h1 style="display: none; ">Hi</h1>
好…
> t[1] (whitespace)
该死.真?这是问题所在.空白节点没有样式属性,这就是造成问题的原因.
> t[2] <h2>Hello</h2>
这就是为什么将一个节点的HTML复制到另一个节点只是为了移动这些节点是一种糟糕的技术.我建议你使用我上面提供的代码片段.