Thứ Tư, 23 tháng 3, 2016

Hướng dẫn tạo "Read more at" khi sao chép nội dung website bằng jQuery

Nhằm bảo vệ nội dung, cũng như nhắc nhở người sao chép nội dung về bản quyền, một số thiết kế web có để chế độ "Read more" đính kèm link với nội dung được copy. Hôm nay, Vivicorp sẽ hướng dẫn các bạn thực hiện chức năng này.

Khi vào một số thiết kế [website] và copy nội dung, chúng ta có thể nhìn thấy nội dung có đính kèm một [link] như sau: Read more at: http://web.vivicorp.com/tinh-nang-moi-cong-cu-thiet-ke-web-adobe-muse.html . Các chủ website thường thực hiện công việc này nhằm bảo vệ nội dung website của mình cũng như nhắc nhở người sử dụng nội dung nhớ về bản quyền và nhớ để nguồn. 

tao readmore khi copy
Hướng dẫn thiết lập chế độ "Read more at"

Vivicorp sẽ hướng dẫn thiết kế web thực hiện chức năng này với đoạn code [jQuery], bạn sẽ thực hành trên website hoặc blog của mình.

Chúng ta sẽ sử dụng thuộc tính document.body.oncopy, nó sẽ trả về sự kiện onCopy trên phần tử hiện tại.

Cú pháp như sau :

element.oncopy = functionRef; 

Chúng ta sẽ chèn thêm một javascript function khác gọi là window.getSelection(); trả về một đối tượng đại diện cho dãy kí tự được lựa chọn bởi người dùng.

jQuery Code

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$(document).ready(function () {
    document.body.oncopy = function () {
        var body_element = document.getElementsByTagName('body')[0];
        var selection;
        selection = window.getSelection();
        var pagelink = "<br>Read more at: <a href="" + document.location.href + "">" + document.location.href + "</a><br>";
        var copytext = selection + pagelink;
        var newdiv = document.createElement('div');
        body_element.appendChild(newdiv);
        newdiv.innerHTML = copytext;
        selection.selectAllChildren(newdiv);
        window.setTimeout(function () {
            body_element.removeChild(newdiv);
        }, 0);
    };
});
Khi chèn đoạn code này vào website rồi, thì từ giờ trở đi, bất kì ai copy nội dung từ trang web của bạn, thì cùng với nội dung mà họ muốn lấy, đoạn link trỏ về trang web của các bạn cũng được chèn vô thêm.

Vivicorp hy vọng tài liệu thiết kế web trên sẽ hữu ích cho bạn. Chúc các bạn thành công! 

Auto Read more...

Blogger Auto Readmore nâng cao và hướng dẫn tùy biến

Auto readmore là chủ đề đã quá quen thuộc với Blogger. Mặc dù Google đã hỗ trợ tính năng này cho Blogger, nhưng nó chưa thực sự thỏa mãn người dùng vì 1 lẽ: nó chỉ cắt nội dung chứ chưa thể tùy biến giao diện. Bởi vậy chúng ta thường nhờ vả tới các script auto readmore.

Script auto readmore vốn ban đầu được AnhVo ở VietWebGuide.com phát triển, sau đó tôi có cải tiến 1 chút ít (tiếc là bây giờ blog của AnhVo đã không còn hoạt động). Ở bài viết này, tôi muốn trình bày với các bạn 1 vài tùy biến nâng cao của script auto readmore mà tôi áp dụng cho Hỗn tạp Blog, đồng thời cố gắng hướng dẫn để các bạn có thể tự tùy biến script cho mục đích của riêng mình.

Script vẫn giữ nguyên ý tưởng cốt lõi, chỉ bổ sung thêm các tùy chọn cho sự hiển thị thêm đa dạng.

Trong script này, tôi bổ sung 3 điểm nâng cao sau:

  1. Thêm hình thumbnail mặc định khi bài viết không có hình ảnh
  2. Tùy chọn không auto readmore cho 1 số bài đầu tiên
  3. Tùy chọn auto readmore cho trang homepage và trang label

Fast Food - Code dùng luôn


Dành cho các bạn không muốn lăn vào bếp, dưới đây là code có thể áp dụng luôn cho blog của bạn:

<script type="text/javascript">
var summaryConf = {
    showImage: true,
    imgFloat: 'left',
    imgWidth: 120,
    imgHeight: 90,
    defaultThumb: 'http://rilwis.googlecode.com/svn/trunk/hontap/images/no-thumb.jpg',
    words: 65,
    wordsNoImg: 80,
    skip: 0,
    showHome: true,
    showLabel: true
};
</script>
<script type="text/javascript" src="http://rilwis.googlecode.com/svn/trunk/blogger/summary.min.js"></script>

Chèn đoạn code trên vào trước thẻ </head> là được. Các tham số có ý nghĩa như sau:

showImage: bạn có muốn hiển thị thumbnail không? Nếu có để là true, nếu không để là false.

imgFloat: có 3 giá trị: 'left' - để thumbnail float về bên trái, 'right' - để thumbnail float về bên phải và 'no' - để thumbnail không có chế độ float. Lưu ý có dấu nháy bọc quanh giá trị nhé.

imgWidth và imgHeight: chỉ định kích thước của thumbnail.

defaultThumb: hình thumbnail mặc định trong trường hợp bài viết không có hình ảnh.

words và wordsNoImg: số từ hiển thị trong trường hợp có ảnh thumbnail và không có ảnh.

skip: bỏ qua 1 số (giá trị của skip) bài, không thực hiện auto readmore với chúng. Nếu khai báo số lượng là 0 thì coi như không bỏ qua bài nào (sẽ auto readmore với tất cả các bài).

showHome và showLabel: cho phép auto readmore ở trang chủ và trang label. Giá trịtrue là cho phép, false là không cho phép.

Sau đó, bạn tìm trong template của bạn đoạn:

<data:post.body/>

sửa thành:

<span expr:id='data:post.id'><data:post.body/></span>

<b:if cond='data:blog.pageType == "index"'>
    <script type='text/javascript'>summary("<data:post.id/>")</script>
<b:else/>
    <b:if cond='data:blog.pageType == "archive"'>
        <script type='text/javascript'>summary("<data:post.id/>")</script>
    </b:if>
</b:if>

Sau khi cài đặt, các bạn hãy thử nghiệm thay đổi giá trị của các tùy chọn trên cho phù hợp với blog của mình. 

Code trên đã khắc phục tình trạng xung đột với kiểu trang Page trong Blogger mà tôi đã đề cập đến ở đây.

Vào bếp xào nấu


Fast Food ở trên dành cho những người muốn áp dụng ngay. Nếu bạn đã đọc đến đây, có nghĩa là bạn đã muốn tìm hiểu kỹ làm sao có thể tùy biến như vậy, và làm thế nào có thể tùy biến hơn nữa? Tôi sẽ cố gắng trình bày nội dung và cách hoạt động của code trên, đồng thời sẽ đưa ra 1 vài gợi ý cho các bạn tùy biến thêm.

Trước tiên cần phải xem code đầy đủ của script, nó nằm tại địa chỉ này. Chúng ta sẽ thảo luận về các tùy chọn mở rộng có trong script (skip, showHome, showLabel), còn các tùy chọn cũ về thumbnail và cách cắt ngắn nội dung, các bạn tham khảo lại bài viết cũ này.

Thuộc tính skip


Để nhận biết bài đang được auto readmore là bài thứ mấy, trong script có dùng 1 biếncount để đếm:

summary.count = summary.count || 0;
summary.count++;

Ở đây biến count được khai báo như 1 thuộc tính của hàm summary. Nếu tìm hiểu kỹ về Javascript, bạn đã biết 1 hàm cũng là 1 đối tượng nên nó có thể có thuộc tính riêng. Làm như vậy sẽ hạn chế các biến toàn cục và đảm bảo không conflict với các script khác. (Hàm summary.strip dùng để cắt bớt ký tự cũng được làm theo nguyên tắc này)

Sau khi đếm thứ tự của bài viết hiện tại, nếu vẫn nằm trong diện "không cần auto readmore" thì bỏ qua ở câu lệnh sau:

if (summary.count <= summaryConf.skip) return;

Việc xét duyệt điều kiện này rất đơn giản, chỉ là một phép so sánh!

Mở rộng: bạn có thể thay đổi điều kiện so sánh ở trên để tùy biến việc hiển thị, VD bỏ qua các bài viết có thứ tự chẵn (lẻ), hoặc cứ 3 bài thì mới auto readmore 1 bài, ... (gợi ý: hãy xét đến điều kiện chia hết của biến count)

Hiển trị trên trang Homepage và trang Label

Để kiểm tra xem trang hiện tại đang xem có phải là homepage hay trang label không thì script có sử dụng 2 câu lệnh sau:

var isHome = location.href.indexOf('/search/label/') == -1 && location.href.indexOf('/search?') == -1,
 isLabel = location.href.indexOf('/search/label/') != -1;

Việc kiểm tra chỉ dựa trên URL của trang hiện tại mà thôi. Sau khi kiểm tra xong thì chỉ cần so sánh với tùy chọn đã khai báo để quyết định bỏ qua hay tiếp tục thực hiện auto readmore:

if (isHome && !summaryConf.showHome) return;
if (isLabel && !summaryConf.showLabel) return;

Mở rộng: hãy nghiên cứu cấu trúc URL của các trang trong Blogger để thử làm auto readmore cho trang tìm kiếm, trang archive.

Nếu bạn muốn mở rộng thêm


Nếu tinh ý, bạn có thể sẽ nhận thấy script auto readmore từ trước tới nay chỉ mới thực hiện được cho phần nội dung của bài viết. Còn các phần như tiêu đề, meta (ngày tháng viết bài, tác giả), ... thì không được tính đến. Điều này gây ra 1 hạn chế rất lớn trong việc tùy biến cách hiển thị. Nói đơn giản như việc nếu bạn muốn trong trang label chỉ hiện tiêu đề bài viết thì làm thế nào? Nếu bạn muốn layout kiểu như các trang tin, khi mà cả tiêu đề, meta dạt về bên phải, còn thumbnail dạt về bên trái thì làm sao? ... Có rất nhiều cách tùy biến, phụ thuộc vào khẩu vị mỗi người, nhưng script auto readmore hiện tại thì vẫn chưa làm được hết các thứ đó. Muốn mở rộng khả năng của script auto readmore (để thực hiện các công việc trên), trước hết phải mở rộng khả năng thực thi của nó, không chỉ gói gọn trong phần nội dung bài viết nữa. Làm điều này cũng không khó lắm, chỉ cần thay đổi vị trí thực hiện auto readmore.

VD: ban đầu template bạn có dạng (đây chỉ là ví dụ lấy từ template của Hỗn tạp Blog nhằm mô phỏng cấu trúc của 1 bài viết, template của bạn có thể sẽ khác, nhưng hãy chú ý đến cấu trúc chung)

<div class='post'>
    <h2 class='post-title'>
        <a expr:href='data:post.url' expr:title='data:post.title'><data:post.title/></a>
    </h2>
    <div class='post-meta'>
        <data:post.timestamp/> |
        <b:if cond='data:post.labels'>
            <b:loop values='data:post.labels' var='label'>
                <a expr:href='data:label.url + "?max-results=5"'><data:label.name/></a>
                <b:if cond='data:label.isLast != "true"'>,</b:if>
            </b:loop>
        </b:if>
    </div>
    <div class='post-body'>
        <data:post.body/>
        <div class='clear' />
    </div>
</div>

Thay vì chỉ khoanh vùng khu vực <data:post.body/> như cũ, chúng ta cần mở rộng ra cho tất cả mọi dữ liệu của blog. Để làm vậy, hãy sửa dòng đầu tiên của code trên thành:

<div class='post' expr:id='data:post.id'>

Điều này nhằm gán id cho toàn bộ bài viết để script có thể truy xuất đến sau này. Sau khi gán xong, phía dưới của đoạn code chèn đoạn thực thi script:

<b:if cond='data:blog.pageType == "index"'>
    <script type='text/javascript'>summary("<data:post.id/>")</script>
<b:else/>
    <b:if cond='data:blog.pageType == "archive"'>
        <script type='text/javascript'>summary("<data:post.id/>")</script>
    </b:if>
</b:if>

Vậy là xong phần cài đặt cơ bản, tiếp theo đó, để lấy được giá trị của tiêu đề, các thẻ meta, các bạn hãy tận dụng hàm javascript getElementByTagName, VD:

function summary(id) {
var p = document.getElementById(id), // lấy toàn bộ nội dung bài viết
    title = p.getElementByTagName('h2'), // lấy tiêu đề bài viết, lưu vào 1 mảng
    img = p.getElementByTagName('img'); // lấy hình ảnh trong bài viết, lưu vào 1 mảng

title = title[0].innerHTML; // lấy phần tử đầu tiên, chính là tiêu đề ta cần
img = img[0].src; // lấy src của hình ảnh đầu tiên
}

Sau đó, có thể tùy biến các giá trị lấy được và thêm vào các thuộc tính CSS cho vừa vặn với khẩu vị (VD với hình ảnh, bạn có thể gán kích thước, float như tôi đã làm; với tiêu đề có thể gán kích thước, màu sắc, float, ...). Cuối cùng là gán ngược trở lại vào bài viết qua p.innerHTML.

Lưu ý 1: Lấy các giá trị của các thẻ HTML thông qua raw javascript có chút khó khăn. Nên sử dụng 1 thư viện javascript nào đó để làm việc này cho nhanh. Với Hỗn tạp Blog này, tôi có dùng jQuery.

Lưu ý 2: Các gợi ý trong phần cuối này chỉ mang tính hướng dẫn. Vì layout mỗi blog và khẩu vị mỗi người khác nhau nên không thể trình bày hết tất cả các cách tùy biến. Chỉ hy vọng các bạn nắm được ý tưởng để tự hoàn thiện cho blog của chính mình.

Việc xào đi xào lại thủ thuật auto readmore này có thể sẽ không mấy thú vị nếu ta không tự tìm các điểm mới. Với bài viết này, mong rằng các bạn có thể tự chế biến cho mình các món auto readmore mới không lặp lại, không nhàm chán. Và khi nào có món mới đừng quên mời tôi dùng thử nhé!

Thứ Ba, 22 tháng 3, 2016

Có Khi Nào Rời XA

Tes nhạc

Có khi nào rời xa

Chèn âm thanh vào Blogger bằng HTML5

Mới đây có bạn +truong linh có hỏi mình làm thế nào để chèn mp3 vào blog mà không sử dụng host phụ. Câu trả lời ở đây rất đơn giản, không thích xài host thì mình nghĩ  ngay đến một bác đó chính là "Lưu trữ file trên Google Drive" trước hết thì cứ đẩy hết file mp3 cần thiết lên đây và lấy link theo hướng dẫn trong bài đó nhé, còn cách thức để mà bấm vào nút nào đó hoặc hình ảnh nào đó để nó chạy thì mời các bạn cùng làm theo hướng dẫn sau đây của mình nhé.

Chèn âm thanh vào Blogger bằng HTML5
Chèn âm thanh vào Blogger

Chèn âm thanh vào Blogger bằng HTML5

Hiện tại bây giờ khi nhắc đến bất kì thứ gì liên quan đến video và âm thanh thì thứ mà mình nghĩ đến đầu tiên đó không là gì khác là HTML5. Bây giờ với sức mạnh của HTML5 mặc định bạn có thể làm rất nhiều thứ mà bạn muốn.

Để chèn một đoạn âm thanh đơn giản bằng HTML5 bạn chỉ cần chèn đoạn mã sau đây vào bài viết hoặc trang nào đó mà bạn muốn
<audio controls>
  <source src="địa-chi-link-âm-thanh.mp3" type="audio/mpeg">
Trình duyệt của bạn không hỗ trợ thẻ audio, vui lòng cập nhật lên phiên bản mới nhất hoặc đổi trình duyệt.
</audio>
không chỉ mp3 không đâu nhé mà còn 2 định dạng khác nữa bạn có thể thử

Định dạngType
MP3audio/mpeg
Oggaudio/ogg
Wavaudio/wav
và đây là ví dụ dành cho đoạn mã trên



nhạc hay quá nhỉ :D. Đây là kiểu mặc định của HTML5, còn nếu bạn muốn nó không hiển thị như vầy mà thay thế bằng nút hay hình ảnh khác thì làm theo như sau nhé.

Bạn chèn đoạn mã trên vào vị trí bất kì trong bài viết của bạn, nhưng mà bạn xóa thuộc tính "controls" đi, như vậy thì nó sẽ không hiện lên cái giao diện điều khiển. Như vậy để nó chạy âm thanh thì làm sao? bạn chèn đoạn mã sau đây vào chỗ mà bạn muốn người dùng bấm vào để chạy nhạc.
<button onclick="document.getElementsByTagName('audio')[0].play();">Nghe nhạc</button>
và đây là ví dụ



thật đơn giản phải không nào, bạn có thể thay bằng bất cứ thẻ hình ảnh hoặc bất cứ thể nào bằng HTML và CSS rồi trang trí sao cũng được, chỉ cần giữ lại thuộc tính
onclick="document.getElementsByTagName('audio')[0].play();"
là mọi thứ sẽ diễn ra như bình thường. Ví dụ
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcREKM54ho1eLic4PZkR9_HyYtUtbBw1HGI_y55j6_WeZY01p4T9Rg" width="50" height="50" onclick="document.getElementsByTagName('audio')[0].play();">
Loa
mình hướng dẫn tới đây thôi còn đẹp xấu như thế nào do các bạn cả nhé.

Lời kết

Với sức mạnh của HTML5 thì bạn hầu như có thể làm được rất nhiều việc mà không cần sử dụng thêm những thứ lỉnh kỉnh khác nhiều để làm nặng thêm website của mình. Mong rằng qua thủ thuật này các bạn có thể áp dụng nó cho một số việc mà các bạn muốn trên website/blog của chính mình nhé. Mọi thắc mắc thêm cứ để lại nhận xét ở dưới cho mình.

P/S: Rất cảm ơn nhiều độc giả đã gửi nhiều câu hỏi và ý tưởng về cho mình, có thời gian mình sẽ cố gắng giải đáp tất cả một cách nhanh gọn nhất, do đó hãy cố gắng chờ mình nhé :)