Jhtml :: skrip pesanan - cara menunda hingga jQuery dimuat?


11

Saya menggunakan JHtml::scriptuntuk menambahkan skrip ke halaman saya dalam modul yang dikembangkan khusus. Namun, skrip ini disuntikkan ke kepala sebelum J3 menambahkan di jQuery - misalnya:

<!-- 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>

Bagaimana saya bisa memaksa Joomla untuk memuat jQuery sebelum skrip lain?

Jawaban:


15

Anda harus menelepon

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

sebelum JHtml :: script Anda yang lain. AFAIK ini memastikan bahwa jQuery dimuat terlebih dahulu.


Ini adalah satu-satunya solusi yang bekerja untuk saya - ditempatkan di mod_tiles.phpjQuery paksa ini untuk memuat pertama. Terima kasih!
codinghands


2

jika saya membaca pertanyaan Anda dengan benar, Anda sedang mengembangkan modul Anda sendiri.

Coba ini, di default.php - tampilan modul (dalam "tmpl"):

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

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

Atau ini :

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

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

Dalam kedua kasus, file JS Anda harus disuntikkan setelah jQuery, asalkan Anda membuat folder "aset", dan folder "css" dan "js" di dalamnya.

Solusi kedua lebih sesuai dengan joomla 3.XX API.

Semoga ini bisa membantu.


Satu-satunya perubahan yang saya buat di sini adalah menambahkan assetsfolder - ini tidak membuat perbedaan, dan skrip masih memuat sebelum jQuery melakukannya. Saya juga bertanya-tanya tentang kebijaksanaan dalam menempatkan kode semacam ini dalam file templat (terutama jika ada beberapa templat menggunakan skrip yang sama, KERING dll.)
codinghands

Hem, komentar Anda aneh -> "menempatkan kode semacam ini dalam file templat". Saya, dan mungkin itu tidak cukup jelas, berbicara tentang modul yang dikembangkan oleh Anda dan berdasarkan isotop.js dan skrip JS lainnya. Saya sangat menyesal jika saya salah dan Anda benar-benar menggunakan modul pihak ketiga yang disebut mod_tiles. BTW, ada cara lain untuk menyisipkan skrip JS dalam templat.
ghazal

Maaf, saya tidak bermaksud terdengar sangat keras haha! Pasti terlalu awal ... Anda benar, itulah yang saya lakukan - ini modul saya. Apa yang saya maksud dengan file templat ada default.phpdi tmplfolder (templat) modul. Saya akan berpikir skrip harus dimuat dalam mod_tiles.php('controller') daripada default.php(tampilan).
coding tangan

Menempatkannya di tmpl / default.php memungkinkan penggantian. Di mod_tiles.php tidak bisa diganti.
sovainfo

2

Saya mengalami masalah ini minggu lalu dan itu terkait dengan tempat saya memanggil JHtml :: script. Apakah Anda melakukan ini dalam tampilan Anda atau template tampilan? Jika Anda mencoba untuk menambahkan skrip dalam tampilan itu sendiri (views / yourview / view.html.php) mereka akan dimasukkan sebelum skrip Joomla sendiri, tetapi jika Anda menambahkan skrip dalam template (views / yourview / tmpl / default.php) mereka akan dimasukkan setelah skrip Joomla!

Semoga berhasil!


Ini modul dengan hanya mod_tiles.php, file helper.php dan satu templat (default.php) di tmpl. Saya mencoba menambahkan skrip di mod_tiles.php dan default.php - keduanya dimuat sebelum jQuery.
codinghands

0

Ini mungkin karena metode yang digunakan pengembang mod_tilesuntuk mengimpor skrip. Saya berasumsi mereka tidak terjebak dengan standar pengkodean Joomla dalam situasi ini.

Anda memiliki 2 opsi (yang dapat saya pikirkan) hwre:

  1. Jika skrip diimpor dari file di dalam folder tmpl di dalam modul, Anda dapat melakukan Template Override dan mengubah cara skrip diimpor, menggunakan JHtml.
  2. Anda dapat mengunduh dan menginstal jQuery Easy yang merupakan plugin yang mengimpor jQuery dan menempatkannya di atas semua skrip lainnya.

Semoga ini membantu


Saya mengembangkan modul - metode apa yang harus saya gunakan? Saya menanyakan hal ini dalam sebuah pertanyaan ( joomla.stackexchange.com/questions/325/… ) dan diberi tahu JHtml :: script adalah jalan ke depan.
codinghands

0

Saya ingin menambahkan dua-bit saya setelah fakta. Saya punya beberapa skrip dan style sheet yang perlu dimuat untuk setiap tampilan yang kita miliki dalam komponen, dan ingin satu titik agar itu terjadi memastikan juga bahwa mereka dimuat dalam urutan yang benar.

Dalam file 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

Saya tahu ini adalah topik lama tetapi apakah Anda pernah sampai di bagian bawah ini? Saya baru saja mengalami masalah yang sama. Saya telah mengidentifikasi PENYEBAB tetapi bukan masalah / solusi; Saya memiliki dugaan licik bahwa itu adalah BUG tetapi bisa dilakukan dengan orang lain yang mencobanya.

Skenario: Anda telah membuat modul yang menyertakan skrip dependen jQuery sehingga Anda menggunakan yang berikut ini dalam tampilan default.php Anda:

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

Anda kemudian menginstal modul dan memberikannya posisi modul, katakanlah 'kiri'. Ketika Anda melihat kode sumber ujung depan semuanya terlihat baik, semua skrip memuat setelah skrip yang termasuk dalam

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

NAMUN jika Anda memberi modul posisi 'akordeon' dan gunakan fitur joomla loadposition untuk menambahkan modul ke artikel

{loadposition accordion}

kemudian accordion.js ditambahkan SEBELUM file bootstrap.framework.

Satu-satunya cara saya dapat membuatnya bekerja adalah dengan menambahkan skrip sebagai skrip inline daripada dimasukkan dalam kepala.

EDIT: yang sama berlaku untuk termasuk css; sedang ditambahkan ke bagian atas daftar deklarasi css (sebelum templat dan bootstrap file css). Tubuh untuk ini adalah untuk menambahkan! Penting untuk deklarasi css.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.