Jhtml :: thứ tự tập lệnh - làm thế nào để hoãn lại cho đến khi jQuery được tải?


11

Tôi sử dụng JHtml::scriptđể thêm tập lệnh vào các trang của mình trong mô-đun được phát triển tùy chỉnh. Tuy nhiên, các tập lệnh này được đưa vào đầu trước khi J3 thêm vào jQuery - ví dụ:

<!-- my module js -->
<script src="/modules/mod_tiles/js/jquery.isotope.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/jquery.hoverintent.min.js" type="text/javascript"></script>
<script src="/modules/mod_tiles/js/mod_tiles.js" type="text/javascript"></script>
<!-- then joomla loads jQuery --->
<script src="/media/jui/js/jquery-noconflict.js" type="text/javascript"></script>
<script src="/media/jui/js/jquery.min.js" type="text/javascript"></script>

Làm cách nào tôi có thể buộc Joomla tải jQuery trước bất kỳ tập lệnh nào khác?

Câu trả lời:


15

Bạn nên gọi

JHtml::_('jquery.framework');

trước tập lệnh JHtml :: khác của bạn. AFAIK điều này đảm bảo rằng jQuery được tải trước tiên.


Đây là giải pháp duy nhất hiệu quả với tôi - được đặt trong mod_tiles.phpjQuery bắt buộc này để tải đầu tiên. Cảm ơn bạn!
mã hóa

1
@codinghands docs.j Joomla.org/NH
Ville Niemi

2

nếu tôi đọc chính xác câu hỏi của bạn, bạn đang phát triển mô-đun của riêng bạn.

Hãy thử điều này, trong default.php - chế độ xem mô-đun (trong "tmpl"):

JHtml::stylesheet('modules/'.$module->module.'/assets/css/yourfile.css');

JHtml::script('modules/'.$module->module.'/assets/js/yourscript.js');

Hoặc này:

JHtml::_('stylesheet', 'modules/'.$module->module.'/assets/css/anotherfile.css');

JHtml::_('script', 'modules/'.$module->module.'/assets/js/othercript.js');

Trong cả hai trường hợp, (các) tệp JS của bạn phải được chèn sau jQuery, miễn là bạn đã tạo thư mục "nội dung" và thư mục "css" và "js" bên trong.

Giải pháp thứ hai phù hợp hơn với API Joomla 3.XX.

Hy vọng nó giúp.


Thay đổi duy nhất tôi đã thực hiện ở đây là thêm assetsthư mục - điều này không khác biệt và các tập lệnh vẫn tải trước khi jQuery thực hiện. Tôi cũng tự hỏi về sự khôn ngoan trong việc đưa loại mã này vào một tệp mẫu (đặc biệt là nếu có nhiều mẫu sử dụng cùng một tập lệnh, DRY, v.v.)
mã hóa vào

Hem, nhận xét của bạn thật kỳ lạ -> "đặt loại mã này vào một tệp mẫu". Tôi đã, và có lẽ nó không đủ rõ ràng, nói về một mô-đun do bạn phát triển và dựa trên isotope.js và các tập lệnh JS khác. Tôi rất xin lỗi nếu tôi sai và bạn thực sự đang sử dụng mô-đun của bên thứ ba có tên mod_tiles. BTW, có nhiều cách khác để chèn các tập lệnh JS trong một mẫu.
ghazal

Xin lỗi, tôi không có ý nói quá gay gắt haha! Phải dậy quá sớm ... Bạn hoàn toàn chính xác, đó là những gì tôi đang làm - đó là mô-đun của tôi. Ý nghĩa của tệp mẫu là default.phptrong tmplthư mục (mẫu) của mô-đun. Tôi sẽ nghĩ các tập lệnh nên được tải vào mod_tiles.php('bộ điều khiển') chứ không phải default.php(chế độ xem).
mã hóa

Đặt nó trong tmpl / default.php cho phép ghi đè. Trong mod_tiles.php, nó không thể bị ghi đè.
sovainfo

2

Tôi đã gặp vấn đề này vào tuần trước và nó có liên quan đến nơi tôi đang gọi JHtml :: script. Bạn đang làm điều này trong chế độ xem của bạn hoặc mẫu của chế độ xem? Nếu bạn cố gắng thêm các tập lệnh trong chế độ xem (lượt xem / yourview / view.html.php), chúng sẽ được chèn trước tập lệnh riêng của Joomla, nhưng nếu bạn thêm tập lệnh trong mẫu (lượt xem / yourview / tmpl / default.php) chúng sẽ được chèn sau tập lệnh của Joomla.

Chúc may mắn!


Đây là một mô-đun chỉ có mod_tiles.php, tệp helper.php và một mẫu duy nhất (default.php) tmpl. Tôi đã thử thêm các tập lệnh trong cả mod_tiles.php và default.php - cả hai đều tải trước jQuery.
mã hóa

0

Điều này có thể là do phương thức mà nhà phát triển mod_tilesđã sử dụng để nhập các tập lệnh. Tôi cho rằng họ đã không bị mắc kẹt với các tiêu chuẩn mã hóa Joomla trong tình huống này.

Bạn có 2 tùy chọn (mà tôi có thể nghĩ ra) hwre:

  1. Nếu các tập lệnh đang được nhập từ một tệp trong thư mục tmpl trong mô-đun, bạn có thể thực hiện Ghi đè mẫu và thay đổi cách nhập tập lệnh, sử dụng JHtml.
  2. Bạn có thể tải xuống và cài đặt jQuery Easy , đây là một plugin nhập jQuery và đặt nó lên trên tất cả các tập lệnh khác.

Hi vọng điêu nay co ich


Tôi đã phát triển mô-đun - tôi nên sử dụng phương pháp nào? Tôi đã hỏi điều này trong một câu hỏi ( j Joomla.stackexchange.com/questions/325/ triệt ) và được nói với JHtml :: script là con đường phía trước.
mã hóa

0

Tôi muốn thêm hai bit của tôi sau khi thực tế. Tôi đã có một vài tập lệnh và biểu định kiểu cần được tải cho mọi chế độ xem mà chúng tôi có trong thành phần và muốn có một điểm duy nhất để đảm bảo rằng chúng được tải theo đúng trình tự.

Trong tập tin components\myComponent\mycomponent.php:

defined('_JEXEC') or die;

// Include dependancies
jimport('joomla.application.component.controller');

JHtml::stylesheet('http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css', array(), true);
JHtml::stylesheet('components/com_mycomponent/assets/css/mycomponent.css');

JHtml::_('jquery.framework');   // Make sure jQuery is loaded before component JS
JHtml::script( 'components/mycomponent/assets/js/jquery.cookie.js');

// Execute the task.
$controller = JControllerLegacy::getInstance('Mycomponent');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();

-1

Tôi biết đây là một chủ đề cũ nhưng bạn đã bao giờ đi đến tận cùng của vấn đề này chưa? Tôi vừa trải qua vấn đề tương tự. Tôi đã xác định NGUYÊN NHÂN nhưng không phải là vấn đề / giải pháp; Tôi có một nghi ngờ lén lút rằng đó là một BUG nhưng có thể làm với người khác đang thử nó.

Kịch bản: Bạn đã tạo một mô-đun bao gồm tập lệnh phụ thuộc jQuery để bạn sử dụng phần sau trong chế độ xem default.php của mình:

$doc = JFactory::getDocument();
$doc->addScript("media/mod_accordion/js/accordion.js");

Sau đó, bạn cài đặt mô-đun và đặt cho nó một vị trí mô-đun, giả sử 'trái'. Khi bạn nhìn vào mã nguồn mặt trước, mọi thứ đều ổn, tất cả các tập lệnh sẽ tải sau các tập lệnh được bao gồm trong

JHtml::_('bootstrap.framework');

TUY NHIÊN nếu bạn đặt cho mô-đun một vị trí 'accordion' và sử dụng tính năng tải của j Joomla để thêm mô-đun vào bài viết

{loadposition accordion}

sau đó accordion.js được thêm vào TRƯỚC các tệp bootstrap.framework.

Cách duy nhất tôi có thể làm cho nó hoạt động là thêm tập lệnh dưới dạng tập lệnh nội tuyến thay vì được đưa vào phần đầu.

EDIT: tương tự bao gồm cả css; nó đang được thêm vào đầu danh sách khai báo css (trước các tệp css mẫu và bootstrap). Bodge cho điều này là để thêm! Quan trọng cho các khai báo css.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.