Danh mục : Ajax - Jquery

Jquery 6 - Chương 6 – Sửa đổi DOM

Bạn đã từng xem ảo thuật và thấy những ảo thuật gia có thể với tay lên không trung và cho xuất hiện một bó hoa, jQuery cũng có thể tạo ra các thành phần, thuộc tính, và cả chữ trên một trang web giống với cách mà ảo thuật gia trình diễn vậy. Hơn nữa, jQuery cũng có thể làm biến mất tất cả những thứ nó tạo ra. Và chúng ta cũng có thể lấy bó hoa kia và biến nó thành Dove

Chương 6  Sửa đổi DOM

 

Bạn đã từng xem ảo thuật  thấy những ảo thuật gia  thể với tay lên không trung  cho

xuất hiện một  hoa, jQuery cũng  thể tạo ra các thành phần, thuộc tính,  cả chữ trên

một trang web giống với cách  ảo thuật gia trình diễn vậy. Hơn nữa, jQuery cũng  thể

làm biến mất tất cả những thứ  tạo ra.  chúng ta cũng  thể lấy  hoa kia  biến 

thành <div class=’magic’ id=’flowerToDove’>Dove</div>

 

Sửa đổi thuộc tính

 

Qua 4 chương đầu của giáo trình này, chúng ta đã biết cách sử dụng phương thức .addClass()

 .removeClass() để làm thay đổi giao diện của các thành phần trên trang web. Thực chất thì

những phương thức này sửa đổi thuộc tính của class. Phương thức .addClass() thì tạo ra hoặc

thêm vào cho thuộc tính, trong khi phương thức .removeClass() thì lại xoá hoặc giảm thuộc

 

tính. Còn  một phương thức nữa  .toggleClass(),   thể vừa loại bỏ  vừa thêm vào

một class. Như thế với 3 phương thức trên chúng ta đã  những công cụ đủ mạnh để làm

việc với class.

 

Tuy nhiên, thuộc tính class chỉ  một trong số những thuộc tính  chúng ta cần dùng tới

hoặc thay đổi.  dụ, id, rel  href. Để sửa đổi những thuộc tính này, jQuery cung cấp

phương thức .attr()  .removeAttr(). Chúng ta thậm chí  thể sử dụng .attr() 

.removeAttr() để sửa đổi thuộc tính class. Nhưng phương thức chuyên dụng  .addClass() 

.removeClass() thì phù hợp hơn trong trường hợp này bởi    thể xử  chính xác những

trường hợp một phần tử  nhiều class như: <div class=’first second’>.

 

Thuộc tính phi class

 

 những thuộc tính không đơn giản để sửa đổi nếu không  sự trợ giúp của jQuery. Hơn

nữa, jQuery cho phép chúng ta sửa đổi nhiều thuộc tính cùng một lúc, tương tự như cách 

chúng ta làm việc với nhiều thuộc tính CSS khi sử dụng phương thức .css()  chương 4.

 

  dụ này, chúng ta  thể dễ dàng thiết lập id, rel  thuộc tính title cho đường liên kết

cùng một lúc. Dưới đây   HTML

 

<h1>jQuery DOM Manipulation</h1>

<h3>An example at izwebz.com</h3>

<div class="chapter">

<p class="first">Qua 4 chương đầu của giáo trình này, chúng ta đã

biết cách sử

dụng phương thức .addClass()  .removeClass() để làm thay đổi giao

diện của

các thành phần trên trang web. <a href="http://www.izwebz.com">Thực

chất</a> thì những phương thức này sửa đổi thuộc tính của class. Phương

thức .addClass() thì tạo ra hoặc thêm vào cho

thuộc tính, trong khi phương thức .removeClass() thì lại xoá hoặc

giảm thuộc

tính.

</p>

 

<p class="second method">Tuy nhiên, thuộc tính class chỉ  một

trong số

những thuộc tính  chúng ta cần dùng tới hoặc thay đổi.  dụ, id,

rel  href.

Để sửa đổi những thuộc tính này, <a

href="http://www.izwebz.com">jQuery</a> cung cấp phương thức .attr()

 .removeAttr(). Chúng ta thậm chí  thể sử dụng .attr() 

.removeAttr()

để sửa đổi <a href="http://www.izwebz.com">thuộc tính</a> class.

Nhưng phương thức chuyên dụng  .addClass()

 .removeClass() thì phù hợp hơn trong trường hợp này bởi  

<a href="http://www.izwebz.com">có thể</a> xử 

chính xác những trường hợp một phần tử  nhiều class như:

</p>

 

<p><span class="pull-quote">

 những thuộc tính <span class="drop">không đơn giản</span> để sửa

đổi nếu không  sự trợ giúp của

jQuery. Hơn nữa, <strong>jQuery</strong> cho phép chúng ta sửa đổi

nhiều thuộc tính cùng một lúc,

tương tự như cách  chúng ta làm việc với nhiều thuộc tính

CSS</span> khi sử dụng

 

phương thức .css()  chương 4.   dụ này, chúng ta  thể dễ

dàng thiết lập

id, rel  thuộc tính title cho đường liên kết cùng một lúc. Dưới

đây  

HTML

</p>

 

</div><!--End .chapter-->

 

Bây giờ chúng ta  thể đi qua từng đường liên kết trong thẻ <div class=’chapter’>  áp

dụng thuộc tính cho chúng từng thẻ một. Nếu bạnchỉ muốn tạo ra một giá trị thuộc tính giống

nhau cho tất cả các đường liên kết, thì bạn chỉ cần một dòng  đơn giản sau:

 

$(document).ready(function() {

$('div.chapter a').attr({'rel': 'external'});

});

 

Cách này  thể dùng được bởi  chúng ta muốn giá trị của thuộc tính rel vừa tạo  như

nhau  tất cả các đường liên kết. Tuy nhiên, thường thì những thuộc tính ta thêm vào hoặc

thay đổi phải  giá trị khác nhau cho mỗi một thành phần.  dụ với bất cứ tài liệu nào, mỗi

một id đều phải  duy nhất nếu ta muốn  javaScript của mình làm việc theo ý muốn. Để

tạo được một id duy nhất cho mỗi đường liên kết, chúng ta không sử dụng phương pháp 

trên nữa  thay vào đó sử dụng phương thức .each().

 

$(document).ready(function() {

$('div.chapter a').each(function(index) {

$(this).attr({

'rel': 'external',

'id': 'izwebz-' + index

});

});

});

 

Phương thức .each() hoạt động như vòng lặp hiện,   nguyên  hoạt động như vòng lặp

for nhưng thuận tiện hơn. Người ta thường sử dụng phương thức này khi  đoạn  chúng

ta sử dụng trên mỗi phần tử của bộ chọn quá phức tạp cho vòng lặp ẩn. Trong trường hợp

này, hàm ẩn của phương thức .each() được gán một số index để chúng ta  thể gắn  cho

mỗi id. Đối số index này hoạt động như một bộ đếm, bắt đầu từ số 0 cho đường liên kết đầu

tiên  tăng dần 1 đơn vị cho mỗi đường liên kết kế tiếp. Cho nên khi ta thiết lập id thành

‘izwebz-’ + index, thì đường liên kết đầu tiên sẽ  id  izwebz-0, đường liên kết thứ 2 sẽ

làizwebz -1, v.v..

 

Xem Demo Online  Example 1 (dùng firebug để inspect link)

 

Chúng ta sẽ sử dụng thuộc tính title để cho người đọc biết thêm thông tin về đường liên kết 

Izwebz.   dụ dưới đây, tất cả các đường liên kết đều hướng tới izwebz.com. Tuy nhiên,

chúng ta nên để cho biểu thức bộ chọn được cụ thể hơn, chúng ta chỉ nên chọn những đường

liên kết  chứa izwebz trong phần href. Để phòng sau này chúng ta lại thêm những đường

liên kết khác không phải  izwebz.

 

$(document).ready(function() {

$('div.chapter a[href*=izwebz]').each(function(index) {

var $thisLink = $(this);

$thisLink.attr({

 

'rel': 'external',

'id': 'izwebzLink-' + index,

'title': 'know more about ' + $thisLink.text() + ' at

izwebz'

});

});

});

 

 đây  điểm bạn cần chú ý  chúng ta đã lưu lại từ khoá $(this) vào một biến gọi 

$thisLink, bởi  chúng ta sử dụng  nhiều hơn một lần.

 

Với cả 3 giá trị thuộc tính được thiết lập như trên, bây giờ đường liên kết của chúng ta sẽ 

dạng như sau:

 

<a href="http://www.izwebz.com" rel="external" id="izwebzLink-0"

title="know more about Thực chất at izwebz">Thực chất</a>

 

Xem Demo Online  Example 2 (dùng firebug để inspect link)

 

Ôn lại hàm $()

 

Từ khi bắt đầu làm quen với jQuery, chúng ta đã biết cách sử dụng hàm $() để tiếp cận các

thành phần trên trang. Thực tế thì hàm này  trọng tâm của thư viện jQuery, bởi   được

gọi mỗi khi chúng ta cần gán một hiệu ứng, sự kiện hoặc thuộc tính cho một phần tử.

 

Nhưng hàm $() còn một chức năng khác nữa nằm trong hai dấu ngoặc  tính năng này rất đỗi

mạnh mẽ đến nỗi  không những  thể thay đổi giao diện của một thành phần   còn 

thể thay đổi nội dung của một trang web. Chỉ đơn giản bằng cách chèn một đoạn  HTML

nằm giữa hai dấu ngoặc, chúng ta  thể tạo ra một cấu trúc DOM mới từ  vô.

 

Chú ý: Bạn cũng nên chú ý khi tạo ra những hiệu ứng để cải thiện giao diện hoặc nội dung

phụ thuộc vào javaScript. Bởi  không phải ai cũng bật javaScript, nên những thông tin quan

trọng phải được nhìn thấy bởi tất cả mọi người, chứ không phải chỉ nhóm người  trình

duyệt hiện đại hoặc bật javaScript.

 

Một chức năng thường thấy trong những trang FAQs  đường liên kết Back to top  dưới

mỗi câu hỏi  trả lời. Bởi  cái này nếu  bỏ đi hoặc không được hiển thị  một số trình

duyệt thì cũng không ảnh hưởng đến nội dung chính của trang. Do vậy chúng ta  thể dùng

JavaScript để thêm vào. Chúng ta sẽ thêm vào đường liên kết Back to top  cuối mỗi đoạn

văn,  điểm dừng  đường liên kết Back to top sẽ dẫn tới. Chúng ta tạo ra các thành phần

mới như sau:

 

$(document).ready(function() {

$('<a href="#top">back to top</a>');

$('<a id="top"></a>');

});

 

Khi cho chạy thử đoạn  trên, bạn vẫn không thấy những đường liên kết back to top  các

điểm dừng xuất hiện, cho  ta đã tạo   đoạn code trên. Vấn đề  dòng   trên đã tạo ra

các thành phần ta muốn, nhưng  chưa được thêm vào trang. Để làm được điều này, chúng

ta  thể sử dụng một trong rất nhiều phương thức chèn của jQuery.

 

Chèn các thành phần mới

 

jQuery  hai phương thức dùng để chèn phần tử này vào trước phần tử kia là: .insertBefore()

 .before(). Hai phương thức này  cùng chức năng, nhưng khác nhau  điểm   sẽ được

kết hợp với các phương thức khác như thế nào. Còn hai phương pháp nữa là, .insertAfter() 

.after(), cũng  nguyên  hoạt động như nhau nhưng  được sử dụng để chèn phần tử này

vào sau phần tử kia. Với  dụ về back to top của ta, chúng ta sẽ sử dụng phương pháp

.insertAfter().

 

$(document).ready(function() {

$('<a href="#top">back to top</a>')

.insertAfter('div.chapter p');

$('<a id="top"></a>');

});

 

Phương thức .after() cũng  thể cho kết quả tương tự với .insertAfter(), nhưng với biểu thức

bộ chọn nằm trước phương thức thay  theo sau nó. Nếu sử dụng .after(), thì dòng  đầu

tiên trong $(document).ready() sẽ  như sau:

 

$('div.chapter').after('<a href='#top'>back to top</a>');

 

Với .insertAfter() thì bạn vẫn  thể thêm vào đằng sau  những phương thức khác để tiếp

tục làm việc với thẻ <a’>. Nhưng với .after(), những phương thức bạn thêm vào sau này sẽ

chỉ  tác dụng với những phần tử phù hợp với bộ chọn  trong trường hợp này  

$(‘div.chapter p’). Nói cách khác, thẻ <a’> của bạn sẽ không chịu ảnh hưởng bởi những

phương thức thêm vào sau nó.

 

Bây giờ chúng ta đã chính thức chèn đường liên kết vào trang web (và vào trong DOM) sau

mỗi một đoạn văn nằm trong thẻ <div class=’chapter’>, đường liên kết back to top sẽ xuất

hiện như hình.

 

Nhưng hiện tại những đường liên kết vẫn chưa hoạt động được. Chúng ta vẫn còn phải chèn

điểm dừng với id=’top’. Chúng ta  thể sử dụng một trong những phướng thức dùng để chèn

một phần tử vào một phần tử khác.

 

$(document).ready(function() {

$('<a href="#top">back to top</a>')

.insertAfter('div.chapter p');

$('<a id="top" name="top"></a>')

.prependTo('body');

});

 

Đoạn  trên chèn điểm dừng ngay trên phần bắt đầu của thẻ <body>, hay nói cách khác 

trên cùng của trang. Với phương thức .insertAfter() cho đường liên kết  .prependTo() được

sử dụng cho điểm dừng, những đường liên kết back to top của chúng ta đã hoạt động được.

 

Một điểm thường thấy nữa của những đường liên kết back to top   không  tác dụng 

khi nằm trên cùng của trang  phần đầu người đọc vẫn nhìn thấy được. Chúng ta cần chỉnh

sửa lại  một chút sao cho những đường liên kết chỉ bắt đầu sau đoạn văn thứ 4. Để đạt

được điều này, chúng ta chỉ cần thay đổi biểu thức bộ chọn một chút:

.insertAfter(‘div.chapter:gt(2)’). Tại sao lại  giá trị  2  đây? Bởi  JavaScript đánh số

bắt đầu từ 0, cho nên đoạn văn đầu tiên sẽ  số 0, đoạn văn thứ 2  số1, thứ 3  số 2  thứ

  số 3. Biểu thức bộ chọn của chúng ta sẽ chèn đường liên kết vào sau mỗi đoạn văn khi

 giá trị chỉ mục  3, bởi    số đầu tiên lớn hơn 2.

 

Hình dưới đây cho bạn thấy kết quả của biểu thức bộ chọn  trên.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Xem Demo Online  Example 3

 

Di chuyển các phần tử

 

Với  dụ về đường liên kết back to top  trên, chúng ta đã tạo ra những phần tử mới  chèn

chúng vào trang. Nhưng chúng ta cũng  thể di chuyển một phần tử từ nơi này qua nơi khác.

 

Một ứng dụng thực tế của cách chèn này  dạng tự động hoá cách chèn phần ghi chú  cuối

trang. Một phần chú thích đã  trong đoạn văn mẫu  chúng ta sẽ sử dụng  trong  dụ

này. Chúng ta cũng đã tạo ra một số phần ghi chú khác cho  dụ này.

 

<p><span class="pull-quote">

 những thuộc tính <span class="drop">không đơn giản</span> để sửa

đổi nếu không  sự trợ giúp của

jQuery. Hơn nữa, <strong>jQuery</strong> cho phép chúng ta</span>

sửa đổi nhiều thuộc tính cùng một lúc,

tương tự như cách  chúng ta làm việc với nhiều thuộc tính CSS

khi sử dụng

phương thức .css()  chương 4.   dụ này, chúng ta  thể dễ

dàng thiết lập

id, rel  thuộc tính title cho đường liên kết cùng một lúc. Dưới

đây  

HTML

</p>

 

<p>

Pellentesque habitant morbi tristique senectus et netus et

malesuada fames

ac turpis egestas. <span class="footnote">Vestibulum tortor quam,

feugiat vitae, ultricies eget,

tempor sit amet, ante. Donec eu libero sit amet quam egestas

semper.

Aenean ultricies mi vitae est</span>. Mauris placerat eleifend

leo. Quisque

sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi,

condimentum sed, commodo vitae, ornare sit amet, wisi.

</p>

 

<p>

Pellentesque habitant morbi tristique senectus et netus et

malesuada fames

ac turpis egestas. Vestibulum tortor quam, feugiat vitae,

ultricies eget,

tempor sit amet, ante. <span class="footnote">Donec eu libero sit

amet quam egestas semper.

Aenean ultricies mi vitae est. Mauris placerat eleifend leo.

Quisque

sit amet est et sapien ullamcorper pharetra.</span> Vestibulum

erat wisi,

condimentum sed, commodo vitae, ornare sit amet, wisi.

</p>

 

<p>

Pellentesque habitant morbi tristique senectus et netus et

malesuada fames

ac turpis egestas. Vestibulum tortor quam, feugiat vitae,

ultricies eget,

tempor sit amet, ante. Donec eu libero sit amet quam egestas

semper.

Aenean ultricies mi vitae est. <span class="footnote">Mauris

placerat eleifend leo. Quisque

sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi,

condimentum sed, commodo vitae, ornare sit amet, wisi.</span>

</p>

 

Mỗi một đoạn văn này  một đoạn ghi chú được gói trong thẻ <span

class=’footnote’></span>. Khi viết  HTML như thế này, chúng ta đã bảo tồn được ngữ

 

cảnh của ghi chú. Sau đó trong CSS stylesheet, chúng ta cho  in nghiêng  được hình dưới

đây.

 

Bây giờ chúng ta  thể lấy phần ghi chú  chèn chúng vào giữa hai thẻ <div

class=’chapter’>  <div id=’footer’>. Bạn cũng nên biết rằng kể cả trong trường hợp của

vòng lặp ẩn, thứ tự chèn đã được định trước, bắt đầu từ trên cây DOM đi xuống dưới. Bởi 

chúng ta cũng cần bảo tồn thứ tự của phần ghi chú  vị trí mới của  trên trang, cho nên

chúng ta sẽ dùng .insertBefore(‘#footer’).

 

Làm như vậy sẽ chèn từng phần ghi chú ngay trên thẻ <div id=’footer’>. Do đó ghi chú thứ

nhất sẽ được đặt nằm giữa <div class=’chapter’>  <div id=’footer’>, ghi chú thứ 2 sẽ được

nằm giữa ghi chú thứ nhất  thẻ <div id=’footer’>, v.v.. Mặt khác, nếu chúng ta sử dụng

.insertAfter(‘div.chapter’), thì thứ tự sẽ bị đảo lộn. Cho nên  của chúng ta sẽ như sau

 

$(document).ready(function() {

$('span.footnote').insertBefore('#footer');

});

 

 đây chúng ta lại  thêm một vấn đề nữa. Đó  các dòng ghi chú được nằm trong thẻ

<span>,  bản thân thẻ <span>  display: inline theo mặc định, do vậy các dòng ghi chú

nối liền nhau  không xuống dòng.

 

Chúng ta sẽ chỉnh sửa CSS để giải quyết vấn đề này, chúng ta sẽ làm cho những phần tử

<span> trở thành block-level, nhưng chỉ áp dụng với những thẻ nằm trong &lt;div

class=’chapter’>

 

span.footnote {

font-style: italic;

font-family: "Times New Roman", Times, serif;

display: block;

margin: 1em 0;

}

.chapter span.footnote {

display: inline;

}

 

Bây giờ thì phần ghi chú của chúng ta đã xuống dòng.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Xem Demo Online  Example 4

 

Ít ra thì phần ghi chú của chúng ta nhìn cũng đã tạm được rồi, nhưng còn nhiều việc chúng ta

 thể làm để cải thiện nó. Một số điểm cần làm như sau:

1.Đánh dấu vị trí trong tài liệu nơi  ghi chú được sử dụng

2.Đánh số cho từng vị trí  cung cấp một số phù hợp với bản thân từng dòng ghi chú.

3.Tạo đường liên kết giữa vị trí văn bản đến điểm ghi chú,  từ điểm ghi chú ngược lại đoạn

văn bản.

Những bước này  thể làm được nhờ phương thức .each(), nhưng trước hết chúng ta phải tạo

ra một nơi chứa những dòng ghi chú  dưới cùng của trang.

 

$(document).ready(function() {

$('<ol id="notes"></ol>').insertAfter('div.chapter');

});

 

Chúng ta sử dụng một danh sách đánh số <ol id=’notes’> </ol> cho phần ghi chú, bởi 

mình muốn chúng tự động được đánh số thứ tự. Chúng ta đã cho danh sách này một

id=’notes’  chèn  vào sau thẻ <div class=’chapter’>.

 

Đánh dấu, đánh số  liên kết văn bản

 

Bây giờ chúng ta đã  thể đánh dấu  đánh số vị trí  phần ghi chú được trích dẫn.

 

$(document).ready(function() {

$('<ol id="notes"></ol>').insertAfter('div.chapter');

$('span.footnote').each(function(index) {

$(this)

.before(

['<a href="#foot-note-',

index+1,

'" id="context-',

index+1,

'" class="context">',

'<sup>' + (index+1) + '</sup>',

'</a>'

].join('')

)

});

});

 

 đây chúng ta sử dụng bộ chọn giống với bộ chọn   dụ trước, nhưng khác cái  chúng ta

gắn phương thức .each() cho nó.  trong .each() chúng ta bắt đầu bằng $(this),   đại diện

của từng dòng ghi chú liên tiếp nhau,  chúng ta gắn phương thức .method() cho nó.

 

Kết quả của cả đoạn  “loằng ngoằng” nằm trong dấu ngoặc đơn của phương thức .before()

sẽ  một đường siêu liên kết.  sẽ được chèn vào trước từng thẻ <span> của phần ghi chú.

Dưới đây   HTML của một trong những dòng ghi chú khi  được chèn vào DOM.

 

<a href="#foot-note-1" id="context-1"

class="context"><sup>1</sup></a>

 

 pháp nhìn  vẻ khá phức tạp, nên chúng ta dành vài phút để tìm hiểu xem  như thế

nào. Bên trong dấu ngoặc đơn của phương thức .before(), chúng ta bắt đầu với một cặp ngoặc

vuông -[ ]   chính  đại diện của mảng trực kiện (array literal). Mỗi phần tử nằm trong

array sẽ  một dấu phảy theo sau (trừ phần tử cuối cùng, nếu không  sẽ không chạy). Để

cho dễ đọc hơn, chúng ta đã viết mỗi lệnh trên một dòng. Sau khi mảng đã lập xong, chúng ta

 

chuyển  lại thành dạng chuỗi bằng cách sử dụng phương thức của JavaScript  .join().

Phương thức này lấy vào một chuỗi rỗng làm đối số, chuỗi rỗng được biểu thị bởi một cặp

dấu nháy (‘ ‘), bởi  chúng ta không muốn bất cứ thứ  xuất hiện giữa các phần tử mảng khi

 được xuất ra dạng HTML.

 

Lưu ý bạn đến phần index+1 trên đoạn  trên. Bởi  JavaScript đánh số bắt đầu từ 0, do

vậy để thuộc tích href  giá trị  #footnote-1, thì chúng ta phải công 1 đơn vị cho nó. Thuộc

tính id  #context-1  tên của đường link sẽ  1. Thuộc tính href đặc biệt quan trọng, bởi 

 phải tuyệt đối phù hợp với thuộc tính id của phần ghi chú (tất nhiên  không gồm dấu #).

 

Cách thứ 2 chúng ta cũng  thể sử dụng chuỗi nối thay  dùng mảng ghép:

 

.before('<a href="#foot-note-' + (index+1) +

'" id="context-' + (index+1) +

'" class="context"><sup>' +

(index+1) + '</sup></a>');

 

Nhưng trong trường hợp này, cách sử dụng mảng  vẻ dễ quản  hơn.

 

Lưu ý: Đã  nhiều tài liệu nói về sự khác nhau về mặt hiệu năng làm việc giữa mảng ghép

 chuỗi nối. Nếu bạn còn phân vân, bạn  thể đọc tài liệu sau

http://www.sitepen.com/blog/2008/05/09/string-performance-an-analysis/

 

Tuy nhiên, trong hầu hết các trường hợp, những khác biệt này  không đáng kể. Nếu hiệu

năng làm việc của đoạn   điều cần quan tâm thì còn nhiều yếu tố khác  tầm ảnh hưởng

còn lớn hơn như  cách lưu bộ chọn  chúng ta đã bàn.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Xem Demo Online  example 5

 

Gắn phần ghi chú

 

Bước kế tiếp  di chuyển phần tử <span class=’footnote’> như chúng ta đã làm. Tuy nhiên,

lần này chúng ta sẽ đặt  vào trong thẻ <ol id=’note’> vừa mới được tạo. Chúng ta sẽ sử

dụng .appendTo(), nhưng cũng để giữ đúng thứ tự, những dòng ghi chú kế tiếp sẽ được chèn

vào cuối của hàng.

 

$(document).ready(function() {

$('<ol id="notes"></ol>').insertAfter('div.chapter');

$('span.footnote').each(function(index) {

$(this)

.before(

['<a href="#foot-note-',

index+1,

'" id="context-',

index+1,

'" class="context">',

'<sup>' + (index+1) + '</sup>',

'</a>'

].join('')

)

.appendTo('#notes')

});

});

 

Bạn cũng nên nhớ rằng .appendTo() đang được gắn với $(this), cho nên nói theo ngôn ngữ

của jQuery thì  “gắn phần ghi chú span vào phần tử với id  ‘notes’.

 

Đối với mỗi dòng ghi chú  chúng ta vừa di chuyển, chúng ta sẽ gắn cho  một đường liên

kết khác. Đường liên kết này sẽ quay lại số thứ tự nằm trong văn bản.

 

$(document).ready(function() {

$('<ol id="notes"></ol>').insertAfter('div.chapter');

$('span.footnote').each(function(index) {

$(this)

.before(

['<a href="#foot-note-',

index+1,

'" id="context-',

index+1,

'" class="context">',

'<sup>' + (index+1) + '</sup>',

'</a>'

].join('')

)

.appendTo('#notes')

.append( '&nbsp;(<a href="#context-' + (index+1) +

'">context</a>)' );

});

});

 

Chú ý đến thuộc tính href quay ngược lại id phù hợp với chỗ đánh dấu trước. Dưới đây bạn sẽ

thấy phần ghi chú đã được gắn đường liên kết.

 

Tuy nhiên phần ghi chú vẫn chưa  số thứ tự, mặc  chúng đã được đặt trong thẻ <ol>, 

bởi  mỗi một dòng sẽ phải được đặt nằm giữa thẻ <li>.

 

Gói phần tử

 

Phương thức dùng để gói một phần tử này bên trong phần tử khác  tên  .wrap(). Bởi 

chúng ta muốn mỗi một $(this) sẽ được gói trong cặp thẻ <lli><l/li>, chúng ta  thể hoàn

thiện  cho phần ghi chú như sau:

 

 

 

 

 

 

 

 

 

 

 

 

$(document).ready(function() {

$('<ol id="notes"></ol>').insertAfter('div.chapter');

$('span.footnote').each(function(index) {

$(this)

.before(

['<a href="#foot-note-',

index+1,

'" id="context-',

index+1,

'" class="context">',

'<sup>' + (index+1) + '</sup>',

'</a>'

].join('')

)

.appendTo('#notes')

.append( '&nbsp;(<a href="#context-' + (index+1) +

'">context</a>)' )

.wrap('<li id="foot-note-' + (index+1) +

'"></li>');

});

});

 

Bây giờ mỗi phần tử <li> đều  một id bằng với href của nó. Cuối cùng chúng ta đã  một

danh sách các đoạn ghi chú được đánh dấu  liên kết với nhau.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Xem Demo Online  Example 6

 

Tất nhiên, số thứ tự  thể được chèn vào trước từng dòng ghi chú như cách  chúng được

chèn trong đoạn văn. Tuy nhiên bạn  thể thấy rất “khoái chí” khi chúng ta  những đoạn

 hợp chuẩn được tự động tạo ra bởi JavaScript.

 

Sao chép phần tử

 

Từ đầu chương cho tới giờ chúng ta đã chèn phần tử được tạo ra, di chuyển  từ vị trí này

sang vị trí khác của tài liệu, gói phần tử đã  bằng một phần tử mới. Nhưng cũng  khi

chúng ta muốn sao chép một phần tử nào đó.  dụ khi bạn  một thanh di chuyển  trên

cùng của trang, bạn muốn copy   chèn  xuống phần footer. Thực ra nếu bạn muốn

copy lại phần nào của trang để tăng tính thẩm mỹ của  thì bạn nên sử dụng  để cho 

làm tự động cho mình.  suy cho cùng thì tại sao chúng ta phải mất thời gian  công sức

để viết lại một đoạn  y chang làm gì? Tại sao không để jQuery làm giúp vừa lẹ  lại vừa

tránh sai sót.

 

Để sao chép phần tử, phương thức .clone()  tất cả những  chúng ta cần. Phương thức này

sẽ tạo ra một bản sao của phần tử  chúng ta chọn để dùng sau này. Cũng như những

phương thức tạo ra các phần tử mới  chúng ta đã học  trên, phương thức này cũng không

tạo ra thay đổi  cho đến khi chúng ta sử dụng một trong những phương thức chèn. Cũng

giống như khi bạn copy một đoạn văn trong Microsoft Word, khi bạn vừa bôi đen  chọn

copy. Thì MS Word sẽ lưu đoạn văn đó trong bộ nhớ của máy, nhưng trên tài liệu chưa  

xuất hiện. Cho đến khi bạn chọn Paste thì đoạn văn copy mới được hiển thị. Phương thức

.clone() cũng hoạt động theo nguyên  đó.

 

Đoạn  dưới đây sẽ tạo ra một bản sao của đoạn văn nằm trong thẻ <div class=’chapter’>.

 

$('div.chapter p:eq(0)').clone();

 

Như đã nói  trên, khi bạn cho chạy đoạn code trên sẽ không   xảy ra hết. Bởi  jQuery

mới chỉ copy đoạn văn đó thôi chứ  chưa làm  với  cả.

 

Để cho đoạn văn chúng ta vừa copy xuất hiện, chúng ta sẽ cho  xuất hiện  trên thẻ <div

class=’chapter’>

 

$('div.chapter p:eq(0)').clone().insertBefore('div.chapter');

 

Bây giờ nếu cho chạy đoạn  trên, bạn sẽ thấy đoạn văn đầu được xuất hiện 2 lần  bởi 

 không còn nằm trong thẻ <div class=’chapter’> nữa cho nên những style nào bạn áp dụng

trong CSS sẽ không  tác dụng với nó.  đây bạn thấy  nhất   rộng hơn những đoạn

văn còn lại.

 

Sao chép kèm sự kiện

 

Mặc định của phương thức .clone()  không sao chép bất cứ sự kiện nào hoặc “họ hàng nội

ngoại” của đối tượng được chọn. Nhưng  cũng  thể lấy vào một tham số Boolean,  khi

giá trị này  true,  sẽ sao chép cả sự kiện đi kèm: .clone(true). Như vậy chúng ta đỡ phải

mất công gán lại sự kiện cho  trong trường hợp chúng ta muốn  đi kèm.

 

Sao chép cho phần trích dẫn

 

Khi bạn đọc báo giấy, đôi khi bạn thấy  phần khung in nhỏ, trong đó  những mẩu trích

dẫn những đoạn quan trọng để gây sự chú ý. Chúng ta  thể làm được việc này bằng cách sử

dụng phương thức .clone(). Hãy xem lại đoạn  HTML của đoạn văn thứ 3 của chúng ta.

 

<p>

<span class="pull-quote">It is a Law of Nature

<span class="drop">with us</span> that a male child shall

have <strong>one more side</strong> than his father</span>

so that each generation shall rise (as a rule) one step in

the scale of development and nobility. Thus the son of a

Square is a Pentagon; the son of a Pentagon, a Hexagon; and

so on.

</p>

 

Đoạn văn bắt đầu bằng một thẻ <span class=’pull-quote’>. Đây sẽ  class chúng ta sẽ dùng

để sao chép. Một khi đoạn văn nằm trong thẻ <span> đó được copy, chúng ta sẽ dán  vào

một nơi khác  chúng ta cũng cần chỉnh sửa lại style cho  bắt mắt hơn.

 

Chúng ta sẽ gán một class  ‘pulled’ cho thẻ <span> vừa được copy  khai báo những thuộc

tính sau trong CSS

 

.pulled {

background: #e5e5e5;

position: absolute;

width: 145px;

top: -20px;

right: -180px;

padding: 12px 5px 12px 10px;

font: italic 1.4em "Times New Roman", Times, serif;

}

 

Đoạn trích dẫn  màu nền xanh nhạt, một ít padding  font khác. Chúng ta cũng sử dụng

absolute position để định vị cho thành phần mới này.

 

Bây giờ chúng ta sẽ quay lại phần jQuery. Chúng ta sẽ bắt đầu với biểu thức bộ trọng cho tất

cả các thẻ <span class=’pull-quote’>, sau đó chúng ta sẽ gán vào phương thức .each() để chạy

qua từng phần tử một.

 

$(document).ready(function() {

$('span.pull-quote').each(function(index) {

//...

});

});

Tiếp theo chúng ta tìm đoạn văn “cha mẹ” của từng đoạn trích dẫn  áp dụng

thuộc tính CSS

$(document).ready(function() {

$('span.pull-quote').each(function(index) {

var $parentParagraph = $(this).parent('p');

$parentParagraph.css('position', 'relative');

});

});

 

Một lần nữa, chúng ta lưu lại bộ chọn  chúng ta sẽ sử dụng hơn một lần vào một biến để

giúp cho  của chúng ta hoạt động hiệu quả hơn  cũng dễ đọc hơn.

 

Bây giờ sau khi đã thiết lập xong hai giá trị định vị quan trọng của CSS  relative cho đoạn

văn chứa phần trích dẫn  absolute cho đoạn trích dẫn. Tiếp theo chúng ta  thể copy từng

thẻ <span>  thêm class  pulled cho từng bản sao,  cuối cùng  chèn  vào phần bắt

đầu của đoạn văn bản.

 

Lưu ý: nếu bạn chưa hiểu kỹ khái niệm này, bạn  thể xem video về Absolute Position trong

CSS

 

$(document).ready(function() {

$('span.pull-quote').each(function(index) {

var $parentParagraph = $(this).parent('p');

$parentParagraph.css('position', 'relative');

$(this).clone()

.addClass('pulled')

.prependTo($parentParagraph);

});

});

 

Bởi  chúng ta sử dụng absolute position cho đoạn trích dẫn, cho nên  sẽ định vị theo đoạn

văn bản chứa nó. Dưới đây  hình  chúng ta  được đến bước này.

 

Về  bản thì đoạn trích dẫn nhìn cũng tạm ổn rồi, nhưng thường thì phần trích dẫn không 

cùng định dạng văn bản như  đoạn văn được copy.  đây đoạn chích dẫn của chúng ta 

một vài chữ được  đậm. Điều chúng ta muốn  đoạn văn sau khi được copy sẽ loại bỏ hết

những thẻ <strong>, <em>  <a href> hoặc bất cứ thẻ inline nào đi. Hơn nữa chúng ta cũng

muốn sau khi copy thì cũng  thể sửa đổi  chút chút như  xoá đi vài từ  thay thế 

bằng dấu ba chấm …. Quay lại đoạn  HTML, bạn sẽ thấy  một vài từ được đặt nằm

trong cặp thẻ <span class=’drop’> không đơn giản </span>.

 

Chúng ta sẽ làm dấu 3 chấm trước sau đó sẽ loại bỏ hết các thuộc tính HTML đi  chỉ giữ lại

phiên bản chữ không.

 

$(document).ready(function() {

$('span.pull-quote').each(function(index) {

var $parentParagraph = $(this).parent('p');

$parentParagraph.css('position', 'relative');

var $clonedCopy = $(this).clone();

$clonedCopy

.addClass('pulled')

.find('span.drop')

.html('&hellip;')

.end()

.prependTo($parentParagraph);

var clonedText = $clonedCopy.text();

$clonedCopy.html(clonedText);

});

});

 

Chúng ta bắt đầu quá trình sao chép bằng cách lưu bản sao vào một biến. Lần này biến được

tạo ra  cần thiết bởi  chúng ta không thể làm việc hoàn toàn với  trong cùng một dòng

lệnh. Bạn cũng đã thấy  sau khi chúng ta tìm hết những thẻ <span class=’drop’>  thay thế

 với dấu ba chấm, chúng ta sử dụng một phương thức .end(). Phương thức này nói cho

jQuery biết, chúng ta muốn quay lại một trước bước. Trong trường hợp này chúng ta muốn

quay lại đến bước .find(‘span.drop’). Như thế chúng ta sẽ chèn cả đoạn copy chứ không phải

chỉ  dấu ba chấm vào phần đầu của đoạn văn.

 

Cuối cùng chúng ta tạo thêm một biến nữa  clonedText, biến này sẽ chứa phiên bản chữ

không của đoạn văn chúng ta cần copy. Sau đó chúng ta sử dụng phiên bản chữ không 

định dạng này để thay thế cho phiên bản HTML. Bây giờ đoạn trích dẫn sẽ như hình

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 hình trên tôi đã thêm một đoạn <span class=’pull-quote’> vào để xem  của chúng ta 

thể tự động tạo ra một đoạn trích dẫn nữa không.

 

Bo tròn góc cho đoạn trích

 

Bây giờ đoạn trích dẫn đã hoạt động như mình muốn  những phần tử con bị loại bỏ, dấu 3

chấm được thêm vào để thay cho chữ. Nếu bây giờ chúng ta muốn cho đoạn trích dẫn được

bo tròn góc thì sao. Chúng ta  thể tạo ra một thẻ <div> bao quanh lấy đoạn trích.

 

$(document).ready(function() {

$('span.pull-quote').each(function(index) {

var $parentParagraph = $(this).parent('p');

$parentParagraph.css('position', 'relative');

var $clonedCopy = $(this).clone();

$clonedCopy

.addClass('pulled')

.find('span.drop')

.html('&hellip;')

.end()

.prependTo($parentParagraph)

.wrap('<div class="pulled-wrapper"></div>');

var clonedText = $clonedCopy.text();

$clonedCopy.html(clonedText);

});

});

 

Chúng ta cũng cần phải chỉnh sửa  CSS để  thể tạo ra hiệu ứng bo tròn góc.

 

.pulled-wrapper {

background: url(top-bg.png) no-repeat left top;

position: absolute;

width: 160px;

right: -180px;

padding-top: 18px;

}

.pulled {

background: url(bottom-bg.png) no-repeat left bottom;

position: relative;

display: block;

width: 140px;

padding: 0 10px 24px 10px;

font: italic 1.4em "Times New Roman", Times, serif;

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Xem Demo Online  Example 7

 

Tóm lược các phương thức sửa đổi DOM

 

Sự khác biệt giữa những phương thức sửa đổi DOM  jQuery cung cấp cho chúng ta phụ

thuộc vào nhiệm vụ  vị trí của nó. Phần này sẽ tóm lược cho bạn dễ nhớ phương thức nào

nên được sử dụng để làm   khi nào thì nên sử dụng chúng

 

1.Để tạo một phần tử mới từ HTML, sử dụng hàm $().

2.Để chèn một hoặc nhiều phần tử vào trong một phần tử khác sử dụng

.append()

.appendTo()

.prepend()

.prependTo()

3.Để chèn một phần tử mới vào bên cạnh một phần tử khác sử dụng

.after()

.insertAfter()

.before()

.insertBefore()

4.Để chèn một phần tử mới xung quanh một phần tử khác, sử dung

.wrap()

.wrapAll()

.wrapInner()

5.Để thay thế một phần tử này với phần tử khác hoặc chữ sử dụng

.html()

.text()

.replaceAll()

.replaceWith()

6.Để loại bỏ một phần tử nằm trong một phần tử khác dùng

.empty()

7.Để loại bỏ một phần tử  con cái của  trong một tài liệu  không thực sự xoá  dùng

.remove()

 

Tóm tắt

 

Trong chương này chúng ta đã tạo, sao chép, tái kết hợp  làm đẹp cho phần nội dung sử

dụng phương pháp sửa đổi DOM của jQuery. Chúng ta đã áp dụng những phương thức này

cho một trang web để biến những đoạn văn bình thường thành phần chú thích tự động, phần

trích dẫn, đường liên kết v.v..

 

Phần tutorial của cuốn sách cũng sắp hết, nhưng trước khi chúng ta học thêm những  dụ

phức tạp hơn  mở rộng hơn. Chúng ta hãy dành chút thời gian để nghiên cứu phương thức

AJAX của jQuery. Trong chương kế tiếp, chúng ta hãy dạo một vòng lên server nhờ “phi

thuyền” AJAX.

 


Tags