Tự xây dựng tiện ích mở rộng cho trình duyệt web, Phần 2: Xây dựng tiện ích mở rộng trên Firefox

Viết một tiện ích mở rộng cơ bản cho trình duyệt Firefox

Mỗi trình duyệt đều sẽ có người thích và không thích, những ưu và nhược điểm. Nhưng chúng đều có điểm chung là mọi người ngày càng dành nhiều thời gian để sử dụng chúng. Loạt bài này giúp bạn làm thế nào để xây dựng các tiện ích mở rộng tương tự cho Chrome, Firefox, và Safari. Bạn sẽ tìm hiểu xem làm cách nào để mở rộng mỗi trình duyệt, khó hoặc dễ như thế nào để thực hiện một số tác vụ thông thường, và làm thế nào để phân phối nó. Trong bài viết này, bạn sẽ xây dựng một tiện ích mở rộng cho Firefox.

Giới thiệu

Trong loạt bài bốn phần này, bạn sẽ học cách xây dựng một phần mở rộng (extension) Gawkblocker cho ba trình duyệt: Chrome, Firefox, và Safari.

  • Trong Phần 1, bạn đã xây dựng extension cho trình duyệt Chrome khởi đầu cho việc đưa nó lên kho ứng dụng.
  • Trong phần này, bạn sẽ xây dựng một tiện ích (hay phần mở rộng) cho trình duyệt Mozilla Firefox.
  • Trong Phần 3, xây dựng phiên bản extension này cho Safari browser.
  • Trong Phần 4, tinh chỉnh mã của bạn để tạo ra extension chạy được trên cả ba trình duyệt.

Bài viết này là phần thứ hai trong loạt bài bốn phần nói về việc xây dựng các tiện ích mở rộng trình duyệt, cho bạn thấy làm thế nào để xây dựng một tiện ích (hay phần mở rộng) cho Mozilla Firefox. Trong bài "Tự xây dựng tiện ích mở rộng cho trình duyệt web, Phần 1: Xây dựng tiện ích mở rộng trên Chrome", bạn đã xây dựng phần mở rộng Gawkblocker cho trình duyệt Chrome. Trong bài viết này, bạn chuyển phần mở rộng Gawkblocker trên Chrome sang Firefox. (Xem phần Tải về để lấy mã nguồn đầy đủ.)

Gawkblocker redux

Hãy nhớ lại, Gawkblocker cho phép bạn (và những người dùng khác) khóa những tên miền nào đó mà bạn không muốn truy cập, chẳng hạn như những trang blog làm hao tốn thời gian. Gawkblocker có một số thành phần:

  • Một cửa sổ pop-up hiển thị cho bạn thấy những gì bạn đang chặn
  • Một biểu tượng của phần mở rộng trên trình duyệt
  • Một trang tùy chọn cấu hình các tên miền mà bạn muốn chặn và địa chỉ bạn muốn thay thế

Trong Chrome, phần mở rộng Gawkblocker của bạn sẽ gắn một sự kiện lắng nghe để mỗi thẻ (tab) hoặc cửa sổ và các URL phù hợp vào một danh sách chặn, chuyển hướng URL bị chặn đến một trang nội bộ. Bây giờ bạn sẽ học cách thay đổi phần mở rộng Gawkblocker trong Firefox.

Gawkblocker đưa vào trình duyệt theo một cách cụ thể để làm những điều mà bạn sẽ làm với tất cả các phần mở rộng bạn đã xây dựng trong loạt bài này. Như trong Phần 1, bạn muốn câu trả lời cho những câu hỏi này:

  • Bạn sẽ gặp khó khăn gì để có được một sự hiện diện ở đâu đó trong giao diện người dùng của trình duyệt?
  • Tham gia vào sự lưu trữ dữ liệu giữa các phiên trình duyệt là gì?
  • Làm thế nào để các phần khác nhau của phần mở rộng trao đổi với nhau?
  • Làm thế nào bạn có thể can thiệp sâu vào dữ liệu của người sử dụng?

Bạn có thể trả lời những câu hỏi này sau khi bạn hoàn thành quá trình xây dựng Gawkblocker cho Firefox.


Trước khi bắt đầu

Tiện ích là mở rộng

Phần mở rộng của Firefox được gọi là add-ons (tiện ích). Còn Chrome, Safari, và Internet Explorer đều sử dụng thuật ngữ extensions (phần mở rộng). Loạt bài này sử dụng cả hai thuật ngữ thay thế cho nhau để nói đến Firefox add-on.

Đối với bài viết này, hãy tải về và cài đặt Firefox phiên bản 12 hoặc cao hơn (xem phần Tài nguyên). (Các ví dụ được đưa ra ở đây được dựa trên phiên bản 12). Bạn cũng muốn có một công cụ chỉnh sửa HTML, CSS và JavaScript. Một số kinh nghiệm sử dụng Firefox và một số Firefox add-on rất hữu ích. Nếu bạn chưa từng sử dụng các add-on, duyệt qua các phần mở rộng có sẵn tại trang Tiện ích của Mozilla (xem phần Tài nguyên). Hãy thử một vài trong số các phần mở rộng cho ngữ cảnh trong bài viết này.

Tài liệu tham khảo của bạn là Mozilla Add-on SDK developer guide (xem phần Tài nguyên). Bạn sẽ làm hầu hết công việc của mình trong Add-on Builder — một công cụ dựa trên web để xây dựng mở rộng cho Firefox. Add-on Builder là một phần của Jetpack, một dự án của Firefox. Mục đích của Jetpack là để làm cho việc bắt đầu viết phần mở rộng chỉ với HTML, CSS và JavaScript (cũng giống như bạn đã làm cho các phần mở rộng của Chrome) được dễ dàng hơn. Cũng có nhiều cách khác để xây dựng phần mở rộng cho Firefox.

Xem mục Tải về để lấy mã nguồn đầy đủ.


Cấu tạo của một phần mở rộng Firefox

Cách tiếp cận khác

Ngoài các quá trình thể hiện trong bài viết này, bạn có một vài cách khác để xây dựng một phần tiện ích mở rộng cho Firefox. Bạn có thể tải về các tập tin SDK mà Add-on Builder sử dụng trực tiếp từ Developer Hub (xem phần Tài nguyên). Tải về các tập tin SDK để bạn có những lựa chọn của mình để xây dựng các tiện ích.

Bạn cũng có thể xây dựng một tiện ích mở rộng truyền thống (hay cổ điển hay XUL). Xây dựng các tiện ích mở rộng theo cách này có một số nhược điểm: Cài đặt tiện ích mở rộng yêu cầu phải khởi động lại, và quá trình viết tiện ích mở rộng phức tạp hơn. Bù lại là bạn có thể chỉnh sửa trình duyệt với nhiều cách khác nhau mà Add-on Builder hoặc SDK sẽ không thực hiện được. Ví dụ, với XUL bạn có thể có được vị trí của biểu tượng mở rộng của bạn ở những nơi khác so với thanh Add-on. Bạn có thể đọc thêm về phần mở rộng XUL trên Development Mozilla Network (xem phần Tài nguyên).

Phần mở rộng Firefox được xây dựng với Add-on Builder sử dụng CommonJS quy ước để lấy về trong các thư viện cần thiết. Bất kỳ sự kết hợp nào của các tệp tin HTML, CSS, và JavaScript có thể được mở rộng, nhưng tất cả mọi thứ bắt đầu với các tập tin main.js.

Các tập tin main.js là trái tim của tiện ích mở rộng cho Firefox của bạn. Nó cho Firefox biết những module nào cần lấy về, và là nơi bạn thực hiện bất kỳ nhiệm vụ khởi tạo cho tiện ích mở rộng của mình. Xem lại các tiện ích mở rộng cho Chrome trong Phần 1, tập tin main.js tương tự như trang background.html. Nó chạy ngầm phía sau, không ai tương tác trực tiếp với nó, và nó chạy một lần duy nhất trong suốt thời gian khởi động.

Bạn cũng có thể có một số trang web mà bạn hiển thị trong các panel, bên trong tiện ích mở rộng Firefox của bạn. Bạn sẽ sử dụng một trang như một cửa sổ bật lên (pop-up) kết hợp với các tuỳ chọn trong Hình 1:

Hình 1. Trang cửa sổ pop-up/tùy chọn
Hình ảnh trang tùy chọn/pop-up Gawkblocker

Bạn cũng có thể sử dụng các kịch bản nội dung trong Firefox, về cơ bản giống như cách bạn có thể làm trong Chrome. Kịch bản nội dung là các tập tin JavaScript mà bạn có thể đưa vào các trang web để tương tác với chúng. Trong Firefox, kịch bản nội dung hoạt động hiệu quả trong bối cảnh của trang, nhưng việc truy cập và từ DOM phải được uỷ nhiệm để ngăn chặn một số vấn đề an ninh. Kịch bản nội dung có thể giao tiếp với phần còn lại của tiện ích mở rộng bằng cách sử dụng port.

Đối với Gawkblocker, bạn sẽ sử dụng:

  • Một tập tin main.js
  • Một tập tin JavaScript có chứa một số tính năng cơ bản (chủ yếu là chuyển từ phần mở rộng của Chrome)
  • Một trang kết hợp của sổ pop-up/tuỳ chọn
  • Một hoặc hai biểu tượng.

Việc phát triển phần mở rộng này đơn giản hơn một chút so với việc bạn làm trên Chrome, tuy nhiên hiệu quả đạt được tương tự. Bạn có thể tải về phần mở rộng Gawkblocker đang hoạt động từ hồ sơ cá nhân Add-on Builder của tôi (xem phần Tài nguyên) để xem phần mở rộng với các bước như tôi mô tả các phần khác nhau của nó tại đây.


Sử dụng công cụ Add-on Builder

Để sử dụng công cụ Add-on Builder, như trong Hình 2 và tại https://builder.addons.mozilla.org/, bạn phải hoàn thành việc đăng ký một tài khoản miễn phí, sau đó bạn có thể đăng nhập vào và tạo tiện ích mở rộng (add-on) cho riêng mình.

Hình 2. Công cụ Add-on Builder
Hình ảnh xây dựng Add-on của Mozilla

Bài viết này không đề cập đến toàn bộ giao diện của Add-on Builder, tuy nhiên có hai điều trong cấu trúc tập tin cần phải lưu ý.Thư mục Lib là nơi mà Firefox nhìn thấy khi bạn lấy về trong các thư viện với require. Bạn sẽ lấy về lớp JavaScript làm lõi của Gawkblocker trong thư mục đó. Thư mục Data là nơi mà bạn sẽ chứa các hình ảnh, HTML, CSS và bất kỳ thứ gì khác mà tiện ích mở rộng của bạn có thể đáp ứng.

Khi bạn xây dựng một tiện ích sử dụng và kiểm tra nó. Bạn sẽ được nhắc nhở để cài đặt phần trợ giúp Add-on Builder. Phần trợ giúp này xử lý gỡ bỏ cài đặt và cài đặt tiện ích của bạn trong suốt quá trình phát triển.


Cập nhật lớp lõi của Gawkblocker 

Trong Phần 1, bạn đã viết những thứ như một tập tin lớp lõi cho Gawkblocker. Bây giờ bạn muốn sử dụng nó trong tiện ích mở rộng của Firefox, bạn có thể tìm hiểu tập tin lớp có tính di động như thế nào.

Khi sử dụng, bạn phải thực hiện một vài thay đổi quan trọng:

  • Sử dụng API mở rộng simple-storage của Firefox thay vì localStorage
  • Thêm đối tượng GB vào exports

Trong tập tin lớp ở Phần 1, bạn đã định nghĩa một đối tượng Storage Manager (tên là SM) — một bao bọc cho localStorage — để xử lý lưu dữ liệu giữa các phiên làm việc (session). Đoạn mã đó không làm việc bên trong một tiện ích mở rộng của FireFox. Thay vào đó Firefox cung cấp một API gọi là simple-storage có khả năng giữ lại dữ liệu cho bạn. Bạn có thể dễ dàng cập nhật đối tượng Storage Manager từ Phần 1, như trong Liệt kê 1:

Liệt kê 1. Cập nhật đối tượng SM
var SM = (function () {
    var SS = require("simple-storage");
    var my = {};
 
    my.get = function (key) {
        return SS.storage[key];
    }
    ...

    return my;

}());

Đối tượng GB không yêu cầu phải thay đổi nhưng bạn nên thêm nó vào exports, theo như các quy ước CommonJS. Dòng cuối cùng trong Liệt kê 2 xử lý việc đó:

Liệt kê 2. Thêm đối tượng GB vào exports
var GB = (function (SM) {
   var my = {};

   my.blockTheseSites = {
       "gawker.com"        : "Gawker Media",
       "io9.com"           : "SciFi Blog",
       "gizmodo.com"       : "Gadget Blog",
       ...
   }

   ...

}(SM));

exports.GB = GB;

Những thay đổi này là rất nhỏ, bạn có thể dễ dàng cuộn chúng vào trong đối tượng GB, như vậy nó sẽ làm việc cả trong Firefox và Chrome. (Tôi sẽ bỏ ngõ đó để bạn có thể đưa vào như là một dự án riêng của bạn nếu bạn muốn.)

Đổi tên tập tin thành GB.js và tải nó lên (upload) vào thư mục Lib, khi đó bạn có thể thấy cách để sử dụng đối tượng trong main.js.


Tập tin main.js trong Gawkblocker

Trong chrome bạn đã kiểm tra các URL với một trang nền để xem có ngăn chặn chúng hay chưa. Trong Firefox bạn kiểm tra điều này trong tập tin main.js. Trước khi main.js có thể làm bất kỳ thứ gì, bạn phải lấy về các module và API mà bạn dự định sử dụng với một chuỗi các câu lệnh require, như trong Liệt kê 3:

Liệt kê 3. Các câu lệnh require
var data = require("self").data,
    tabs = require("tabs"),
    GB = require("GB").GB,
    popupPanel = require("panel").Panel({
        height: 500,
        contentURL: data.url("popup.html")
    });

Theo thứ tự, các câu lệnh trong trong Liệt kê 3 chỉ định main.js cung cấp cho bạn:

  • Một đối tượng mà bạn sử dụng để truy cập vào thư mục Data
  • Một đối tượng để xứ lý các thẻ (tab)
  • Đối tượng GB mà bạn đã xuất ra từ lớp main
  • Một đố tượng popupPanel để chứa cửa sổ pop-up. Đoạn mã cũng tạo cửa sổ pop-up.

Thêm vào đó, từ cửa sổ pop-up mà bạn tạo cũng đáp ứng như các trang tùy chọn, bạn phải thiết lập các bộ lắng nghe. Trong Chrome bạn đã tiếp cận được trang nền và nói cho nó biết những điều bạn muốn nó làm. Trong Firefox bạn gửi các thông điệp (message) tới main.js cho mục đích tương tự. Ví dụ, Liệt kê 4 thể hiện một bộ lắng nghe (listener) thiết lập mặc định trang đích cho các trang web mà người dùng chọn để ngăn chặn:

Liệt kê 4. Lắng nghe thiết lập mặc định trang đích cho các trang web mà người dùng chọn để ngăn chặn
popupPanel.port.on("watchthis", function () {
    GB.setWatchThisInstead(http://www.youtube.com/watch?v=N-uyWAe0NhQ);
    console.log("watchthis");
});

Bạn sẽ đi qua phần thông điệp (message) để đi đến phần cổng (port), khi tôi thảo luận về trang pop-up.

Tập tin main.js cũng là nơi Gawkblock truy cập các thẻ (tab) để xem, nếu có các đường dẫn (URL) mà người dùng muốn chặn. Liệt kê 5 thể hiện đoạn mã lắng nghe các tab để cập nhật:

Liệt kê 5. lắng nghe các tab cho việc cập nhật
tabs.on("ready", function checkForBlock(tab) {
    for (site in GB.getBlockedSites()) {

        if (tab.url.match(site)) {
            tab.url = GB.getWatchThisInstead();
        }
    }
});

Các chức năng và cách hoạt động giống như những gì bạn đã làm trong Chrome. Sử dụng các API cũng tương tự (gọi một phương thức, đi qua một callback) như khi bạn làm trong Chrome.

Cuối cùng là thêm một huy hiệu nhỏ ở góc dưới bên phải của trình duyệt, hãy tạo một Widget, như Liệt kê 6:

Liệt kê 6. Tạo một Widget
require("widget").Widget({
    id: "GBBrowserAction",
    label: "Gawkblocker",
    contentURL: data.url("images/GB-19.png"),
    panel: popupPanel
});

Một khi bạn có mọi thứ trong tập tin main.js bạn có thể thâm nhập vào trong các thay đổi cho trang pop-up.


Cửa sổ pop-up

Trong tiện ích mở rộng của Chrome, cửa sổ pop-up là danh sách của những tên miền đã bị chặn. Giờ là lúc để lặp lại điều đó trong thiết kế. Trong tiện ích mở rộng của Firefox, di chuyển chức năng từ trang tùy chọn đến cửa sổ pop-up. Và thêm một điều khiển click chuột vào tiêu đề hiện ra trong cửa sổ pop-up để hoán đổi tùy chọn div và danh sách tên miền. Các tùy chọn cho phép người dùng web truy xuất đến danh sách chặn và đáp ứng chuyển địa chỉ cho những trang bị chặn. Hình 3 cho thấy các chức năng trong cửa sổ pop-up Gawblocker:

Hình 3. Các tùy chọn trong cửa sổ pop-up Gawblocker
Hình ảnh Add-on Builder hiển thị các tùy chọn trong trang pop-up Gawkblocker

Khi bạn thiết lập một cổng trong Liệt kê 4, nhớ để ý lắng nghe đến watchthis trong main.js. Trong Liệt kê 7, bạn gửi thông điệp đó từ cửa sổ pop-up sử dụng addon.port.emit:

Liệt kê 7. Gửi thông điệp từ cửa sổ pop-up sử dụng addon.port.emit
$("#watchthis").click(function () {
    addon.port.emit("watchthis");
    $("#status").text("YOU'RE GOOD MATE.  ");
});

Bạn lấy danh sách những trang bị chặn từ main.js cũng bằng cách lắng nghe danh sách sử dụng port. Trong main.js, gửi danh sách khi cửa sổ pop-up thông báo cho bạn khi chúng sẵn sàng, như trong Liệt kê 8:

Liệt kê 8. Gửi danh sách khi đối tượng pop-up thông báo đã sẵn sàng
popupPanel.port.on("pop", function () {
    popupPanel.port.emit("blocklist", GB.getBlockedSites());
    ...
});

Và trong đối tượng pop-up, bạn lắng nghe chúng và thay đổi trang như trong Liệt kê 9:

Liệt kê 9. Lắng nghe và thay đổi trang
addon.port.on("blocklist", function (blocklist) {
    $("#blockedlist").children().remove();
    $.each(blocklist, function (index, value) {
        $("#blockedlist").append("<div class='siterow' title='"+value+"'>
<div class='sitename'>"+index+"</div><span class='sitedesc'> : 
"+value+"</span></div>");
        showBlockList(blocklist);
    });
});

Cửa sổ pop-up yêu cầu main.js danh sách những trang bị chặn. Sau đó lặp lại xuyên suốt danh sách và thêm vào chi tiết trang bị chặn để hiển thị thẻ div trong cửa sổ pop-up.


Chuyển hướng trang đích

Trong Chrome, khi bạn gửi chuyển hướng đến một trang đích nó sẽ như là một phần của tiện ích mở rộng. Firefox không như vậy, mà gửi chúng thẳng đến mã nguồn (đường dẫn YouTube bạn đính kèm trên trang đích: "Hey You! Don't Watch That! Watch This!").

Bạn thiết lập các điều kiện ban đầu cho chuyển hướng trong main.js, như Liệt kê 10:

Liệt kê 10. Thiết lập điều kiện ban đầu
if (!GB.getWatchThisInstead()) {
   GB.setWatchThisInstead("http://www.youtube.com/watch?v=N-uyWAe0NhQ");
}

Hình 4 cho thấy một chuyển hướng trang đích:

Hình 4. Chuyển hướng trang đích
Ảnh chụp Firefox dẫn tới trang chủ Youtube

Kiểm thử từ công cụ tạo tiện ích Add-on Builder

Khi bạn sử dụng công cụ Add-on Builder, Firefox sẽ giúp bạn dễ dàng kiểm tra tiện ích mở rộng của bạn sao cho thuận tiện nhất. Bạn nhận được một lỗi giao diện điều khiển, một nút kiểm tra, và khi đó một công cụ trợ giúp của Add-on (Add-on Builder helper) sẽ tự động tái tạo lại tiện ích mở rộng của bạn bất kể khi nào bạn lưu nó. Hình 5 Cho thấy công cụ trợ giúp của Add-on Builder trong khi làm việc:

Hình 5. Các tiện ích của Add-on Builder
Ảnh chụp Add-on Builder giúp hiển thị thông điệp lỗi

Phân phối tiện ích mở rộng của bạn

Khi tiện ích mở rộng của bạn đã sẵn sàng cho thời gian đầu, bạn có một vài lựa chọn cho việc phân phối nó. Nếu bạn đánh dấu nó như một tiện ích công khai trong hồ sơ của bạn, bạn có thể gửi các đường dẫn cho những người dùng có tiềm năng của bạn, và họ có thể cài đặt nó từ đó. Bạn cũng có thể tải về những phân phối mở rộng của gói đó, hoặc là tải lên những tiện ích mở rộng của bạn tại addons.mozilla.org.

Phân phối các tiện ích mở rộng đã đóng gói

Để phân phối các tiện ích mở rộng đã đóng gói, hãy tải nó tại Add-on Builder. Nhấn chuột vào biểu tượng tải xuống để lấy tệp XPI mà mọi người có thể cài đặt. Bạn có thể phân phối nó bất cứ nơi nào bạn muốn (qua email, lưu trữ trên máy chủ, các bản cài đặt, và những phương thức khác v.v...). Nhưng bạn có trách nhiệm xử lý các thông tin cập nhật và lưu trữ.

Đăng tải lên addons.mozilla.org

Quá trình để đưa được một tiện ích mở rộng vào addons.mozilla.org mang tính kỹ thuật rất ít, nhưng bạn phải vượt qua một quá trình xem xét kiểm duyệt và một số trở ngại khác nữa. Để làm việc thông qua quá trình này, nhấn vào upload to AMO để vào đường dẫn đến hồ sơ cá nhân của bạn, như trong Hình 6:

Hình 6. Đăng tải lên AMO
Ảnh chụp trang Add-on, với đường dẫn Upload lênAMO

Thực hiện theo các hướng dẫn tải lên như trên.


Tìm hiểu những câu trả lời dành cho bạn

Bây giờ thì các tiện ích dành cho FireFox của bạn đã hoàn thiện, đây là thời gian để tìm ra cách trả lời cho những điều bạn còn muốn tháo gỡ, so sánh những lời giải đáp đó với Chrome:

Bạn sẽ gặp khó khăn gì để có được một sự hiện diện ở đâu đó trong giao diện người dùng của trình duyệt?
Không hề khó khăn hơn Chrome khi bạn muốn sự hiện diện của một thanh tiện ích (Add-on Bar) ở dưới cùng của trình duyệt. Bạn có thể làm được với việc tạo ra một Widget trong tệp main.js.
Tham gia vào sự lưu trữ dữ liệu giữa các phiên trình duyệt là gì?
Sử dụng API Firefox-specific simple-storage. Nếu bạn muốn một lớp Storage Manager để làm việc trên cả Chrome và Firefox, thực hiện một số tính năng phát hiện.
Làm thế nào để các phần khác nhau của phần mở rộng trao đổi với nhau?
Tạo ra một phương thức cho việc giao tiếp giữa các port và thiết lập các bộ thu (listeners) và phát (emitters).
Làm thế nào bạn có thể can thiệp sâu vào dữ liệu của người sử dụng?
Mặc dù không được sự cho phép thật rõ ràng từ người dùng, bạn vẫn có thể truy cập ít nhất là mọi URL mà người dùng đã lướt qua. Điều đó cũng đi khá sâu vào dữ liệu rồi.

Kết luận

Tiện ích mở rộng chỉ là sự bắt đầu của những gì bạn có thể làm với Firefox Add-on. Bạn còn cách khá xa đến việc biết đến giới hạn những gì mà Add-on Builder có thể cung cấp cho bạn. Thậm chí nhiều hơn nữa những gì đã cung cấp sẵn cho bạn nếu bạn quyết định đi sâu hơn vào phần này. Giữa các Add-on Builder, các công cụ nền tảng để phát triển tiện ích, và những gì phức tạp như việc mở rộng XUL, bạn có thể có rất nhiều cách để mở rộng cách tiếp cận Firefox của bạn.

Hãy theo dõi các Phần 3 của loạt bài này, trong đó bạn sẽ xây dựng Gawkblocker cho trình duyệt Safari.


Tải về

Mô tảTênKích thước
Article source codefirefox-sourcecode.zip38KB

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

  • Tham gia vào cộng đồng developerWorks: Liên kết với các thành viên developerWorks và khám phá các blog, diễn đàn, các nhóm, và thư viện wiki.

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở
ArticleID=941459
ArticleTitle=Tự xây dựng tiện ích mở rộng cho trình duyệt web, Phần 2: Xây dựng tiện ích mở rộng trên Firefox
publish-date=08202013