Cách khắc phục lỗi $ is not a function khi sử dụng jQuery trong D7

Events happening in the community are now at Drupal community events on www.drupal.org.
MrKhoa's picture

Tình hình là đang convert theme của D6 sang D7 thì bị lỗi. Theme sử dụng Coda Slider chạy trên D6 thì ok, nhưng qua D7 thì bị lỗi $ is not a function. Đã khắc phục được nhờ vào video sau
http://www.youtube.com/watch?v=LStEhcpbKiU

Do ít làm việc với jQuery, càng ít làm việc với drupal + jQuery, vậy nhờ bạn nào giải thích giúp chuyện gì đã xãy ra vậy? Người làm video này giải thích gì mình không nghe được, nhưng video có ít.

Tóm tắt cái lỗi này như sau:

Trong file script .js mình có hàm
$(function() {
$("a").fadeOut();
});
Khi include script này thì sẽ nhận được lỗi $ is not a function

Cách giải quyết của Tom Rogers như sau:
var $ob = jQuery.noConflict()

$ob(function() {
$ob("a").fadeOut();
});

Có ai hiểu tại sao không? Và có cách nào khác không? Vì khi update file script này (thường là script của người ta) thì phải làm lại tất cả những chuyện này à?

Comments

Shellingfox's picture

Từ bản Drupal 7 mặc định sẽ sử dụng jQuery làm đối tượng chính để gọi jQuery với mục đích có thể đưa thêm vào sử dụng các bộ thư viện Javascript khác (Xem thêm: http://drupal.org/update/modules/6/7#javascript_compatibility). (Mặc định Drupal sẽ gọi hàm jQuery.noConflict()) để phục hồi lại đối tượng $ đã có trước đó (Trường hợp của bạn là chưa có gì nên $ == undefined). Với các plugin tốt thì sự thay đổi này không ảnh hưởng.

Còn với trường hợp của bạn, không nên tạo một alias khác ngoài $ hay jQuery vì bạn sẽ phải sửa rất nhiều và không cập nhật được. Bạn dùng hàm drupal_add_js để tạo lại alias cho jQuery coi sao:
drupal_add_js('$ = jQuery;', array('type' => 'inline', 'scope' => 'header', 'weight' => -10));

--
Best regards,
Sang, Lê Thanh

Tel: +84 988079498
Email: me[at]sanglt.com
WWW: www.sanglt.com

Drupal đã dùng

jcisio's picture

Drupal đã dùng jQuery.noConflict() như vậy thì không nên cố gán lại làm gì. Bạn gọi đoạn mã vào như hướng dẫn ở cái link trên là ổn.

(function ($) {
  // cho đoạn mã cũ vào đây
})(jQuery);

:) đây là một cheat để cho

Shellingfox's picture

:) đây là một cheat để cho cái bạn đang hỏi không phải sửa lại mã nguồn của các thư viện bạn ấy đang sử dụng á. Mình có nói rõ là với các plugin viết tốt (Là viết theo mẫu bạn gởi) thì sẽ không phải làm gì. Ở đây khuyên bạn ấy sửa các thư viện bạn ấy sử dụng thì không hợp lý nên mình mới chỉ ra cách này.

--
Best regards,
Sang, Lê Thanh

Tel: +84 988079498
Email: me[at]sanglt.com
WWW: www.sanglt.com

Ko đúng !

dat.pham's picture

=> Mới xem lại thấy mình gà quá :))

thong tin

dat.pham's picture

[code]
(function ($) {
// cho đoạn mã cũ vào đây
})(jQuery);
[/code]

Cái này dùng để khai báo plugin chứ không dùng cho document ready

Mình thì khác, vì mình lập

luatviettin's picture

Mình thì khác, vì mình lập trình tối ưu nên mình gom hết cả mả chúng nó vào 1 file , không cho drupal can thiệp vào nữa, sửa gì tuỳ ý mình hết nên core đỡ nặng một khoản render JS ! Mà lại chả lỗi, úp down thoải mái ...

Drupal 6 không bị sao

phuongdungxhnv's picture

Drupal 6 thì nó đã tự fix lỗi này bạn nhé
Mình đã cài đặt lại với phiên bản mới và thành công

máy bơm chìm| máy bơm ebara | máy bơm tsurumi

Ok, mình đã hiểu. Cảm ơn bạn

MrKhoa's picture

Ok, mình đã hiểu.
Cảm ơn bạn nhiều!