一旦你指定了一个选择器, 乐趣就开始了。你能改变,移动,删除和克隆元素。你还能通过简单的语法创建一个新元素。
有关 jQuery 操作方法的完整文档,请访问 http://api.jquery.com/category/manipulation/.
这里有一些方法帮助你改变已有的元素。在多数通常的任务中,你能执行内部HTML或元素属性的改变。jQuery 为这些操作的有序提供了简单, 跨浏览器的方法。你也能在典型的getter中使用相同的方法获取元素信息。 我们要看到的例子将贯穿这一节,但是特殊的,这有一些你可以使用的新的方法用于获取和设置元素信息。
改变这些元素是琐碎的,但请记住这些改变将作用于选择器的 all 元素, 因此如果你打算改变一个元素,在调用setter方法前请确认你的选择器。
当方法作为getters使用时,它们通常只工作在选择器的第一个元素,并且不会返回 jQuery 对象,所以你不能给它们链式添加方法。一个值得注意的例外是 $.fn.text
; 描述如下, 它在选择器中获得所有元素的文档。
获取或设置html文档。
获取或设置text文档;HTML将被剥离。
获取和设置提供属性的值
获取或设置作为整型选择器的第一个元素的pixels宽度。
获取或设置作为整型选择器的第一个元素的pixels高度。
为选择器中的第一个元素取得包含位置信息的对象,相对于它们第一个位置的祖先。这只有一个getter
获取或设置form元素的值。
这里有一些移动DOM元素的方法;通常,这里有两个途径:
放置与另外元素有关的选择元素Place the selected element(s) relative to another element
放置一个与选择元素有关的元素Place an element relative to the selected element(s)
在例子中, jQuery 提供了 $.fn.insertAfter
和
$.fn.after
. $.fn.insertAfter
方法在你提供了参数的元素后面放置一个选择元素;$.fn.after
方法在选择元素后面放置一个带参数的元素。其它的方法允许这样的模式:$.fn.insertBefore
and
$.fn.before
; $.fn.appendTo
and
$.fn.append
; and $.fn.prependTo
and
$.fn.prepend
.
这个方法为你进行的更多检测将依赖于那些你已经选择的元素,是否你将需要保存那些你加入到页面的元素引用。如果你需要保存引用,你也将生效第一次处理 -- 放置与其它元素有关的选择元素 -- 在这个例子中,作为你放置元素的返回值。
$.fn.insertAfter
, $.fn.insertBefore
,
$.fn.appendTo
, and $.fn.prependTo
will be your
tools of choice.
Example 3.27. 使用不同的方法移动元素
// 将第一个列表项作为最后一项 make the first list item the last list item var $li = $('#myList li:first').appendTo('#myList'); // 同一问题的另一种处理 $('#myList').append($('#myList li:first')); // 注意这没有方法访问 // 我们移动的列表项, // 返回列表自己
当你使用 $.fn.appendTo 方法时, 你将移动元素;有时你想要以拷贝元素替代。在这种情况下, 你将首先使用 $.fn.clone 。
如果你需要拷贝相关数据和事件,请确定传递 true
参数到 $.fn.clone
。
这里有两种方法将元素从页面删除:
$.fn.remove
和 $.fn.detach
。当你打算把选择器从页面永久删除时你将使用 $.fn.remove
;尽管方法返回删除的元素,那些元素也不会拥有它们关联的数据和事件。
如果你需要将数据和事件的持久性,你需要使用 $.fn.detach
来代替。就像 $.fn.remove
, 它返回一个选择器, 也维护与选择有关的数据和事件,于是你能在最后恢复选择器。
如果你对一个元素做很多的操作,$.fn.detach
方法极有价值。在这个例子里,它有利于 $.fn.detach
页面元素,工作在它的代码里,于是当你操作时它将恢复到页面。把你从维护这些元素的数据和事件的高昂"DOM touches"中解救出来。
如果你要留下元素而又要简单的删除它们的内容,你能使用 $.fn.empty
去处理内部HTML元素。
jQuery 提供了一个简单而优雅的途径,使用与你选择器同样的方法 $()
来创建新元素。
Example 3.30. 创建一个包含属性对象的新元素
$('<a/>', { html : 'This is a <strong>new</strong> link', 'class' : 'new', href : 'foo.html' });
注意我们包含在第二个参数中的属性对象,属性名类被引用,而属性名的文本和链接却不是。属性名通常不被引用, 除非它们作为保留字(在这个例子中是作为类)。
当你创建一个新元素,它不会立刻添加到你的页面。一旦它被创建这里会有几个方法添加一个元素到页面里。
Example 3.31. 从页中获得一个新元素
var $myNewElement = $('<p>New element</p>'); $myNewElement.appendTo('#content'); $myNewElement.insertAfter('ul:last'); // 这将从 #content 中移除P! $('ul').last().after($myNewElement.clone()); // 克隆P现在我们有了两个
严格地讲,你不必在变量中保存创建的元素 -- 你能直接在$()后调用此方添加元素到页面。然后, 大多数时间你将引用添加的元素,而不需要在后面选择它。
你甚至能在添加元素的时候创建它,但这个例子请注意你不能获得新创建的元素的引用。
在页面创建新元素的语法非常简单,模版会忽略在反复添加到DOM时所产生的巨大性能代价。如果你添加更多的元素到同一容器里,你将连接所有的html到单一的字符串中,接着追加字符到容器里替换掉一次一个的元素追加方式。你能使用一个数组收集所有的片段,然后 join
它们追加到同一字符串中。
var myItems = [], $myList = $('#myList'); for (var i=0; i<100; i++) { myItems.push('<li>item ' + i + '</li>'); } $myList.append(myItems.join(''));
jQuery 属性操作的能力是很广泛的。基本的改变是很简单的,但 $.fn.attr 方法也允许完成更多复杂的操作。
Example 3.34. 操作多个属性
$('#myDiv a:first').attr({ href : 'newDestination.html', rel : 'super-special' });
Example 3.35. 使用函数去确定新的属性值
$('#myDiv a:first').attr({ rel : 'super-special', href : function() { return '/new/' + $(this).attr('href'); } }); $('#myDiv a:first').attr('href', function() { return '/new/' + $(this).attr('href'); });
Copyright Rebecca Murphey, released under the Creative Commons Attribution-Share Alike 3.0 United States license.