Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Uncaught ReferenceError: function is not defined at HTMLInputElement.onclick? (https://javascript.ru/forum/jquery/75181-uncaught-referenceerror-function-not-defined-htmlinputelement-onclick.html)

giwuf 10.09.2018 23:35

Uncaught ReferenceError: function is not defined at HTMLInputElement.onclick?
 
Есть сайт на wordpress. Сделал отдельную страничку с калькулятором, где подключанию скрипты для получения величин, проверки и отправки данных.
Сейчас, в данном коде, который есть, при клике получаю ошибку:
Uncaught ReferenceError: getRadioCalc1 is not defined at HTMLInputElement.onclick

Код:

<?php get_header(); ?>

<script>
  jQuery.noConflict();
(function( $ ) {
    $(function() {

              function getInputCalc1(f1, f2, step) {
                $('#w-size-1').attr('checked', false);
                var f1Val = $('#' + f1).val();
                var f2Val = $('#' + f2).val();
                var rezult = 'Размеры: (ширина=' + f1Val + ' мм, высота=' + f2Val + ' мм)';
                rezCalc1[step + 1] = rezult;
                $('#rez1').val(rezCalc1.join(', '));
                return false;
              }

});
  })(jQuery);
</script>

<ul class="step-list">
  <li><input type="radio" class="radio" name="w-type" id="w-t-1" onclick="getRadioCalc1('Квартира',0);"><label for="w-t-1">Другое</label></li>
  <li>..</li>
  <li>..</li>
</ul>

<script>
(function( $ ) {
$(document).on('click', '.form-submit-355', function() {
});
})(jQuery);
</script>
<?php get_footer(); ?>

Если делать без обвертки
jQuery.noConflict();
(function( $ ) {
    $(function() {
});
})(jQuery);

то получаю ошибку изначально:
TypeError: $ is not a function when calling jQuery function

Как это можно исправить?

рони 11.09.2018 00:17

giwuf,
назначить клик через on или сделать функцию без обёртки, заменив все $ на jQuery

giwuf 11.09.2018 09:45

рони,
Делаю вот так, но все тоже самое..

<?php get_header(); ?>

<script>
jQuery.noConflict();

    jQuery(function() {

function getRadioCalc1(val, step) {
            if (step == 0) {
              rezCalc1[1] = val;
            } else {
              rezCalc1[step + 1] = val;
            }
            if (val == 'Створок: 1') {
              imgID = '1';
            }
            if (val == 'Створок: 2') {
              imgID = '2';
            }
            if (val == 'Створок: 3') {
              imgID = '3';
            }
            if (val == 'Балконный блок') {
              imgID = '4';
            }
            $('#countCounter1').attr('src', '<?php echo get_stylesheet_directory_uri() ?>/images/calc-sel-window-' + imgID + '.jpg');
            $('#rez1').val(rezCalc1.join(', '));
            return false;
          }
});
</script>

<ul class="step-list">
   <li><input type="radio" class="radio" name="w-type" id="w-t-1" onclick="getRadioCalc1('Квартира',0);"><label for="w-t-1">Другое</label></li>
   <li>..</li>
   <li>..</li>
</ul>

<script>
jQuery(document).on('click', '.form-submit-355', function() {

});
</script>
<?php get_footer(); ?>


А что означает "назначить клик через on", т.е. удалить из всех инпутов и назначить функцией? А если там разные параметры в нее передаются, то как?

И еще: интересно, что на тестовом локальном сервере все работает, а на реальном уже нет, правда там разные темы установлены, но тем не менее

рони 11.09.2018 10:36

Цитата:

Сообщение от giwuf
Делаю вот так

нет не так
Цитата:

Сообщение от рони
заменив все $ на jQuery

<script>
  jQuery.noConflict();
              function getInputCalc1(f1, f2, step) {
                jQuery('#w-size-1').attr('checked', false);
                var f1Val = jQuery('#' + f1).val();
                var f2Val = jQuery('#' + f2).val();
                var rezult = 'Размеры: (ширина=' + f1Val + ' мм, высота=' + f2Val + ' мм)';
                rezCalc1[step + 1] = rezult;
                jQuery('#rez1').val(rezCalc1.join(', '));
                return false;
              }

;
 
</script>

рони 11.09.2018 10:44

Цитата:

Сообщение от giwuf
т.е. удалить из всех инпутов и назначить функцией?

да
Цитата:

Сообщение от giwuf
А если там разные параметры в нее передаются, то как?

параметры оставить в инпуте типа data-calc="['Квартира',0]"

laimas 11.09.2018 10:50

Цитата:

Сообщение от рони
заменив все $ на jQuery

Не обязательно.

giwuf 11.09.2018 11:13

рони,
спасибо большое! Получилось!

Цитата:

Не обязательно.
laimas,
а как по другому

laimas 11.09.2018 11:18

Цитата:

Сообщение от giwuf
а как по другому

Вот так.

рони 11.09.2018 11:30

Цитата:

Сообщение от laimas
Вот так.

:blink: :blink: :blink: посмотри пожалуйста первый пост.

laimas 11.09.2018 11:36

Цитата:

Сообщение от рони
посмотри пожалуйста первый пост

Да, неудачный ВВ тег выбран. :)

Может это следствие неудачного месторасположения объявления или какие-то сопутствующие проблемы? Не скажу чтобы часто это приходилось делать, но когда приходилось проблем не было.

рони 11.09.2018 11:42

Цитата:

Сообщение от рони
параметры оставить в инпуте типа data-calc="['Квартира',0]"

кавычки строго как в коде data-calc='["Квартира",0]'
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
  <script>
  jQuery.noConflict();
(function( $ ) {
    $(function() {

              function getInputCalc1(f1, f2, step) {
                alert([f1, f2]);

              /*  $('#w-size-1').attr('checked', false);
                var f1Val = $('#' + f1).val();
                var f2Val = $('#' + f2).val();
                var rezult = 'Размеры: (ширина=' + f1Val + ' мм, высота=' + f2Val + ' мм)';
                rezCalc1[step + 1] = rezult;
                $('#rez1').val(rezCalc1.join(', '));
                return false;*/
              }
    $("[data-calc]").on('click', function() {
    var data = $(this).data("calc");
    getInputCalc1.apply(null, data)
});


});
  })(jQuery);


</script>

</head>

<body>


<ul class="step-list">
   <li><input type="radio" class="radio" name="w-type" id="w-t-1" data-calc='["Квартира",0]'><label for="w-t-1">Другое</label></li>
   <li>..</li>
   <li>..</li>
</ul>


</body>
</html>

giwuf 11.09.2018 12:45

Благодарю, рони
И у меня к вам еще последний вопросс подключением сторонних библиотек: почему webuiPopover через обертку подключается и функционирует нормально, а formatter точно также нет?..

(function( $ ) {
                  $(function() {
                                      $('.pseudo-link-popover').webuiPopover({
    'trigger': 'hover',
    'width': '240',
    'placement': 'auto',
    content: function() {
      return $('#' + $(this).attr('data-src')).html();
    }
  });

$('.promo_phone_class').formatter({
    'pattern': '+7({{999}}){{999}}-{{99}}-{{99}}',
    'persistent': false
  });

              });
              })(jQuery);

рони 11.09.2018 12:50

giwuf,
нет элемента, на момент срабатывания строки 12

рони 11.09.2018 12:57

giwuf,
возможно так ...
(function($) {
    $(function() {
        $(".pseudo-link-popover").webuiPopover({
            "trigger": "hover",
            "width": "240",
            "placement": "auto",
            content: function() {
                return $("#" + $(this).attr("data-src")).html()
            },
            onShow: function(el) {
                $(".promo_phone_class", el).formatter({
                    "pattern": "+7({{999}}){{999}}-{{99}}-{{99}}",
                    "persistent": false
                })
            }
        })
    })
})(jQuery);

giwuf 11.09.2018 12:58

Цитата:

Сообщение от рони (Сообщение 494413)
giwuf,
нет элемента, на момент срабатывания строки 12

Спасибо, но если я функцию помещаю внуть ready и оборачиваю в jQuery(function($) { }); чтобы не выбивало ошибку $ - снова получаю ошибку

jQuery(document).ready(function() {

jQuery(function($) {
                            $('.promo_phone_class').formatter({
    'pattern': '+7({{999}}){{999}}-{{99}}-{{99}}',
    'persistent': false
  });
});

});


И вот так ошибка:
Uncaught TypeError: jQuery(...).formatter is not a function

jQuery(document).ready(function() {
jQuery('.promo_phone_class').formatter({
    'pattern': '+7({{999}}){{999}}-{{99}}-{{99}}',
    'persistent': false
  });
});

рони 11.09.2018 13:24

giwuf,
без примера, можно только гадать

giwuf 11.09.2018 13:47

Цитата:

Сообщение от рони (Сообщение 494418)
giwuf,
без примера, можно только гадать

рони,
ccылка на пример

рони 11.09.2018 13:57

giwuf,
1 загрузить jquery один раз
2 загрузить все все все плагины jquery
3 загрузить скрипты
4 загрузить bootstrap.min.js"

рони 11.09.2018 13:59

giwuf,
поставьте это сразу после jquery
<script src="https://likemedia.by/wp-content/themes/subway-child/jquery.formatter.min.js"  ></script>

giwuf 11.09.2018 14:23

Цитата:

Сообщение от рони (Сообщение 494426)
giwuf,
поставьте это сразу после jquery
<script src="https://likemedia.by/wp-content/themes/subway-child/jquery.formatter.min.js"  ></script>

рони,
поставил, но результато это не принесло..

рони 11.09.2018 14:54

giwuf,
возможно плагин устарел

giwuf 26.10.2018 13:22

рони, т.к. wordpress работает в noConflict режиме, то нужно было в самом плагине заменить все вхождения $(..) на jQuery(...) и все заработало


Часовой пояс GMT +3, время: 13:16.