Як додати JS-файл у передній частині для всіх сторінок


38

Я прочитав 3 сторінки результатів Google про те, як завантажити файл JS на всі сторінки, і досі не в змозі це зробити.

У мене є кілька сумнівів, сподіваюся, хтось зможе їх усунути.

  1. Потрібно створити модуль всередині app/codeз requirejs-config.js? Або я можу requirejs-config.jsзамість цього поставити внутрішню тему?

  2. Що я повинен помістити всередину requirejs-config.js?

  3. Як повинен виглядати код всередині мого .jsфайлу? Я побачив, що ви не можете використовувати jQuery's, document.readyі ви повинні матиdefine([

  4. Що я повинен помістити всередину define([?

  5. Якщо у мене є сторонні модулі jQuery, чи потрібно їх редагувати, щоб вони працювали?

  6. Чи потрібно мені десь покласти xml, щоб сказати magento, що файл my.js існує?

  7. Якби я створив всередині модуль app/codeзі всім кодом js, чи буде він містити всі речі на всіх сторінках? Як я можу цього досягти?

Відповіді:


65

Щоб завантажити спеціальний main.jsфайл на всі сторінки (у спосіб RequireJS), це хороший спосіб:

1) Створіть main.js

Створіть main.jsу темі теми

<theme_dir>/web/js/main.js

з цим вмістом:

define([
  "jquery"
], 
function($) {
  "use strict";

  // Here your custom code...
  console.log('Hola');

});

Коротше кажучи : ми оголошуємо залежності на початку, наприклад "jquery". Ми визначаємо як параметр функції ім'я змінної для використання залежності в межах функції, наприклад "jquery" --> $. Ми ставимо все наший спеціальний код всередині function($) { ... }.

2) Оголосити main.jsз requirejs-config.jsфайлом

Створіть requirejs-config.jsфайл у папці теми:

<theme_dir>/requirejs-config.js

з цим вмістом:

var config = {

  // When load 'requirejs' always load the following files also
  deps: [
    "js/main"
  ]

};

"js/main"це шлях до нашого звичаю main.js. Розширення ".js" не потрібно.

Наші requirejs-config.jsбудуть об'єднані з іншими requirejs-config.jsвизначеними в Magento.

RequireJS завантажить наш main.jsфайл на кожну сторінку, вирішуючи залежності та завантажуючи файли асинхронним способом.


Необов’язково: включаючи сторонні бібліотеки

Це спосіб включення сторонніх бібліотек.

1) Додайте бібліотеку до web/js:

<theme_dir>/web/js/vendor/jquery/slick.min.js

2) Відкрийте requirejs-config.jsта додайте цей вміст:

var config = {

  deps: [
    "js/main"
  ],

  // Paths defines associations from library name (used to include the library,
  // for example when using "define") and the library file path.
  paths: {
    'slick': 'js/vendor/jquery/slick.min',
  },

  // Shim: when you're loading your dependencies, requirejs loads them all
  // concurrently. You need to set up a shim to tell requirejs that the library
  // (e.g. a jQuery plugin) depends on another already being loaded (e.g. depends
  // on jQuery).
  // Exports: if the library is not AMD aware, you need to tell requirejs what 
  // to look for so it knows the script has loaded correctly. You can do this with an 
  // "exports" entry in your shim. The value must be a variable defined within
  // the library.
  shim: {
    'slick': {
      deps: ['jquery'],
      exports: 'jQuery.fn.slick',
    }
  }

};

Це виглядає складніше, ніж є насправді.

3) Додайте залежність у межах main.js:

define([
  'jquery',
  'slick'
], 
function($) {

  // ...

});

Привіт, Ви можете сказати, чи потрібно тут включати bootstrap.js. Як я можу додати його, щоб завантажувальна програма добре працювала в моїй темі. Спасибі!
anujeet

1
@anujeet Ви можете включити так bootstrap.jsсамо, як я включив slick.jsу вищенаведений приклад. Для значення shim ви можете спробувати скористатися цим: 'bootstrap': { deps: ["jquery"], exports: '$.fn.popover' }як пояснено тут: stackoverflow.com/a/13556882/3763649
Andrea

Дивіться мою вимогу-config.js var config = { deps: [ "js/animate", "js/incase", "js/confetti" ], paths: { "jquery.bootstrap":"js/bootstrap.min" }, shim:{ 'jquery.bootstrap':{ 'deps':['jquery'] } } }; require(["jquery",'jquery.bootstrap', 'jquery/ui', 'jquery/validate', 'mage/validation/validation', 'domReady!']); Мій міні-карт перестає працювати з цим
anujeet

@anujeet Краще ви відкриєте ще одне питання з цією проблемою, повідомляючи про свою вимогу-config.js та якщо у вас є деякі помилки в консолі javascript. Якщо ви зв’яжете тут своє запитання, я буду радий допомогти вам :)
Андреа,

коли включати більше js У мене є помилки "js / ScrollMagic.min", "js / debug.addIndicators.min"
yavonz15,

6

Ви можете додати файли JS, використовуючи xml, як показано нижче. Це додасть js на всі сторінки.

За допомогою спеціального модуля:

Створіть default.xmlфайл у своєму модулі.

app/code/vendor_name/module_name/view/frontend/layout/default.xml

<?xml version="1.0"?>
<page xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <head>
        <!-- Add js using link tag-->
        <link src="js/script.js"/>

        <!-- Add js-->
        <script src="Vendor_Module::js/script.js"/>

        <!-- Add external js -->
        <script src="https://apis.google.com/js/platform.js" src_type="url" />
   </head>
</page>

6

Скопіюйте файл:

app / code / Magento / Theme / view / frontend / layout / default_head_blocks.xml

До

app / code / your_vendor / your_theme /Magento_Theme/layout/default_head_blocks.xml

<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <!-- Add local resources -->
        <css src="css/my-styles.css"/>

        <!-- The following two ways to add local JavaScript files are equal -->
        <script src="Magento_Catalog::js/sample1.js"/>
        <link src="js/sample.js"/>

        <!-- Add external resources -->
        <css src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap-theme.min.css" src_type="url" />
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js" src_type="url" />
        <link src="http://fonts.googleapis.com/css?family=Montserrat" src_type="url" /> 
    </head>
</page>

Для отримання додаткової інформації:

http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/xml-manage.html

Удачі!

До речі, прочитайте офіційного представника програми devdocs з Магенто, щоб отримати базовий :)


Оскільки сценарій Bootstrap вимагає ініціалізації JQuery, включення його в голову не буде працювати. Прочитайте цей офіційний документ. для отримання додаткової інформації. :)
VS

2

Спосіб додавання js за допомогою default_head_blocks.xmlфайлу не працюватиме для сторонніх плагінів JQuery. Отже, якщо ви хочете додати користувацькі плагіни JQuery і використовувати їх, вам потрібно буде використовувати requirejs-config.jsфайл.

Щоб відповісти на запитання по черзі:

1) та 2) Вам не потрібно створювати модуль для додавання requirejs-config.jsфайлу. Ви можете просто додати його в цьому місці:

app/design/frontend/<Vendor>/<theme>/requirejs-config.js

Дивіться цю відповідь, щоб створити належний requirejs-config.jsфайл.

3) Вам потрібно буде перерахувати залежності файлу js перед тим, як писати сценарії.

require([
  'jquery',
  'jquery/ui'
], function($){
   // ... Your code here
}); 

Вищенаведений код говорить про те, що для ваших сценаріїв вам буде потрібно jquery та jquery ui.

4) Вам не потрібно використовувати, define([якщо ви не створюєте плагін JavaScript.

5) Ні, вам не потрібно їх редагувати, але вам потрібно буде вказати їх залежність, використовуючи requirejs-config.jsфайл. Якщо у вас є owl.carousel.min.jsв <vendor>/<theme>/web/js/owl.carousel.min.js, ваш requirejs-config.jsфайл буде виглядати наступним чином :

var config = {
    map: {
        '*': {
            owlCarouselTheme: 'js/owl.carousel.min'
        }
    },
    shim: {
        owlCarouselTheme: ['jquery']
    }
};

У наведеному вище коді пам’ятайте, що .jsдля файлу немає. А тепер використовувати його у вашому js

require(['jquery', 'owlCarouselTheme'],function($){
    $(document).ready(function() {
        $(".footer.links").addClass("owl-carousel").owlCarousel({items: 1});
    });
})

Якщо все працює добре, ви повинні мати посилання на нижній колонтитул у повзунку.

6) та 7) Просто використовуйте метод, запропонований @Goldy, щоб додати js. Він додасть ваш js-файл на всі сторінки.

Для подальшого читання ви можете подивитися цей пост

Сподіваюсь, це допомагає.


1

Ось так я додаю бібліотеку dotdotdot у свою власну тему magento2.

1. Завантажте та додайте бібліотеку Js у свою тему, дотримуючись шляху:

// app/design/frontend/Namespace/themename/web/js/jquery.dotdotdot.min.js

2. Створіть файл Requjs теми, як описано далі, і повідомте про те, що потрібно додавати до бібліотеки.

// app/design/frontend/Namespace/themename/requirejs-config.js
var config = {
   map: {
       '*': {
           dotdotdot: 'js/jquery.dotdotdot.min',
       }
   }
};

3. Використовуйте додану бібліотеку в головному файлі js вашої теми таким чином:

// app/design/frontend/Namespace/themename/web/js/main.js
require([ 'jquery' , 'dotdotdot' , 'domReady!'],function($){
    $(window).load(function() {
        //custom js code
        /* $(".product-item-name").each(function(){
            $(this).dotdotdot(); 
        }); */
    });
});

4. і включіть js-файл вашої теми в голову вашого веб-сайту так:

// app/design/frontend/Namespace/themename/Magento_Theme/layout/default_head_blocks.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <head>
        <link src="js/main.js"/> 
    </head>
</page>

Ви можете додати будь-яку зовнішню бібліотеку JS та спеціальний файл на кожну сторінку magento2.


Я спробував, що це адміністратор, js виходить правильно, але очікуваний результат не приходить
Naveenbos

Гарна відповідь. Попробуй. Чи є спосіб вказати певну сторінку, де потрібен файл js.?
Мухаммед Джораїд

Для певної сторінки перемістіть вміст "default_head_blocks.xml" у наведеному вище прикладі до конкретного файлу макета. Наприклад, у випадку з детальною інформацією про продукт, додайте, що xml у програмі / дизайні / frontend / Простір імен / ім'я теми / Magento_Catalog / layout / catalog_product_view.xml
saiid
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.