Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Функции на ".on("input", "#id", function(){});" (https://javascript.ru/forum/jquery/85305-funkcii-na-input-id-function-%7B%7D-%3B.html)

Булат Азат улы 17.06.2023 08:40

Функции на ".on("input", "#id", function(){});"
 
Всех приветствую, товарищи!

Написал несколько одинаковых функций:
$("body").on("input", "#name", function() {
	if($(this).val().length > 1){
		$.ajax ({
			url: ajaxFile,
			type: "POST",
			data: ({
				toima: "nameList",
				inpVal: $(this).val()
			}),
			dataType: "html",
			success: function(data) {
				$(".nameListTop").remove();
				$("#nameTd").append(data);
			}
		});
	}
});

И для того, чтобы не повторять, вывел функцию отдельно и хотел вызывать его параметрами:
function autocomplete1 (btnName, nameTd) {
	if($(this).val().length > 1){
		$.ajax ({
			url: ajaxFile,
			type: "POST",
			data: ({
				toima: btnName,
				inpVal: $(this).val()
			}),
			dataType: "html",
			success: function(data) {
				$(".nameListTop").remove();
				$(nameTd).append(data);
			}
		});
	}
}
$("body").on("input", "#name", autocomplete1 ("nameList", "#nameTd"));

$("body").on("input", "#tel", autocomplete1 ("telList", "#telTd"));


Но так выдаёт ошибку, скрипт jQuery тоже затрагивает:
"Uncaught TypeError: can't access property "toLowerCase", e.nodeName is undefined
val jQuery
autocomplete1 https://ostaservis.tatar/js/scriptMoharrir.js:18
<anonymous> https://ostaservis.tatar/js/scriptMoharrir.js:36"

Не могли бы подсказать, из-за чего такая ошибка выдаётся и как это можно исправить?

Aetae 17.06.2023 09:04

Круглые скобочки на конце функции означают её вызов. Если вы где-то в коде написали func() - в этом месте будет не функция, а то что она вернула.

function func() {
  return 'value'
}

$("body").on("input", "#name", func());
// тоже самое что
$("body").on("input", "#name", 'value');
Если функция ничего не возвращает(нет return) - то там будет undefined.

Если бы тебе не нужны были особые параметры для каждого случая - можно было бы ограничиться красиво:
$("body").on("input", "#tel", autocomplete1);


Но раз они нужны, то либо делать так:
function autocomplete1 (btnName, nameTd) {
  return function() {
    if($(this).val().length > 1){
      $.ajax ({
        url: ajaxFile,
        type: "POST",
        data: ({
          toima: btnName,
          inpVal: $(this).val()
        }),
        dataType: "html",
        success: function(data) {
          $(".nameListTop").remove();
          $(nameTd).append(data);
        }
      });
    }
  }
}
$("body").on("input", "#name", autocomplete1 ("nameList", "#nameTd"));
$("body").on("input", "#tel", autocomplete1 ("telList", "#telTd"));


Либо доставать эти параметры внутри:
var paramsTable = {
  name: ["nameList", "#nameTd"],
  tel: ["telList", "#telTd"]
}

function autocomplete1 () {
  var [btnName, nameTd] = paramsTable[this.id];
  if($(this).val().length > 1){
    $.ajax ({
      url: ajaxFile,
      type: "POST",
      data: ({
        toima: btnName,
        inpVal: $(this).val()
      }),
      dataType: "html",
      success: function(data) {
        $(".nameListTop").remove();
        $(nameTd).append(data);
      }
    });
  }
}
$("body").on("input", "#name, #tel", autocomplete1);

Булат Азат улы 18.06.2023 08:16

Aetae,
Спасибо большое!!!


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