Как в Yii2 заставить работь jQuery и собственный скрипт одновременно?

326
06 мая 2017, 22:10

Опытным путем было выяснено, что пока Yii не подгрузит jQuery (а делает он это в последнюю очередь), мой скрипт работать не будет, потому что $ ему в тот момент еще не знаком.

В интернете был вычитан способ исправить ситуацию вот так:

'position' => \yii\web\View::POS_HEAD

Что, собственно, помогло, но поломало все остальное (в моем случае это многоуровневое меню).

Далее был испробован другой способ:

$this->registerJs(
'вот тут мой код с js');

Что заставило работать меню, но не повлияло на мой скрипт.

Можно было бы вынести скрипт в отдельный файлик и в его настройках указывать подключение в последнюю очередь, однако в моем велосипедном JS используется php и конкатенация (я так переменную туда передаю), поэтому не вижу ничего хорошего в том, чтобы выносить это в отдельный файл.

Как наговнокодить получше и так, чтобы работало и меню и мое чудо-колесо?

Попробовала также обернуть JS в

jQuery(window).load()

На что получила - uncaught ReferenceError: jQuery is not defined.

Код скрипта:

<script type="text/javascript">
$(document).ready(function(){
  var water = <?= $count['full']*250 ?>; //устанавливаем значение переменной, если пользователь уже пил воду в мл.
  $(".off, .on").click(function(){ //меняем класс офф на он
    $(this).toggleClass("off on");
    if($(this).hasClass("on")){
      water += 250; //прибавляем к переменной еще 250 мл.
      $.ajax({
        type: "POST",
        url: "<?php echo \Yii::$app->getUrlManager()->createUrl('site/index') ?>",
        data: "water=" + water,
        _csrf : '<?=Yii::$app->request->getCsrfToken()?>'
      });
    } if ($(this).hasClass("off")) {
      water -= 250; //если пользователь ошибся и кликнул еще раз на стакан - отнимаем 250 мл.
      $.ajax({
        type: "POST",
        url: "<?php echo \Yii::$app->getUrlManager()->createUrl('site/index') ?>",
        data: "water=" + water,
        _csrf : '<?=Yii::$app->request->getCsrfToken()?>'
      });
    }
  });
})

В итоге заработало вот это: (проблема была в используемом методе)

<?php
$count = $count['full']*250;
$url = Yii::$app->getUrlManager()->createUrl('site/index');
$script = <<< JS
$(document).ready(function(){
  var water = $count;
  $(".off, .on").click(function(){
    $(this).toggleClass("off on");
    if($(this).hasClass("on")){
      water += 250;
      $.ajax({
        type: "POST",
        url: "$url",
        data: "water=" + water
      });
    } if ($(this).hasClass("off")) {
      water -= 250;
      $.ajax({
        type: "POST",
        url: "$url",
        data: "water=" + water
      });
    }
  });
})
JS;
$this->registerJs($script, yii\web\View::POS_END);
?>
Answer 1

В итоге помог все же метод registerJs. Полный код приведен внизу в теле вопроса.

Замечания, которые пригодились бы мне:

  1. В тех местах, где используются расчеты или вызовы функций php, лучше писать именно переменные, объявленные заранее, иначе будут проблемы с кавычками.
  2. Переменные надо использовать без дополнительных символов, а просто сразу вставлять в JS. Мне было не по себе, но оно заработало.
  3. Писать метод END, или хотя бы перепробовать все доступные методы

http://www.yiiframework.com/doc-2.0/yii-web-view.html#registerJs()-detail

(а не просто скопировать из интернета, потому что у кого-то сработал именно READY, например).

READ ALSO
Проверка на наличие конкретного слова в адресной строке

Проверка на наличие конкретного слова в адресной строке

Доброго времени суток! У меня на странице есть 4 блока у которых есть свой 'id', по которому я перехожу с другой страницы нажимая на ссылку типа...

225
ДНЕВНИК - Первый проект на REACT и исходная конфигурация - JavaScript

ДНЕВНИК - Первый проект на REACT и исходная конфигурация - JavaScript

Всем доброго времени сутокПросьба - советом и "образцами кода" наставить на путь истины

154
Javascript заменить знаки

Javascript заменить знаки

Есть функция и она работает

167