动态初始化插件中的多个输入字段
Dynamically initialise multiple input fields in plugin
我在一页上有很多表格。每个表单都应该有一个 phone 数字字段。这些字段由 JS plug-in
.
驱动
所以我得到了大量应该正确初始化的字段。
如果我手动完成,我会得到:
表单 *
phone 输入字段 =
初始化次数。
此时我只有第一个字段在工作。其他不初始化。
我的标记看起来像:
<input type="tel" class="phone_flag" name="phone_tab1[main]" required="">
<input type="tel" class="phone_flag" name="phone_tab2[main]" required="">
<input type="tel" class="phone_flag" name="phone_tab3[main]" required="">
xxx
...
我得到了一条建议:为了正常工作,我应该使用 querySelectorAll
和 forEach
循环。然后我应该调用 PhoneDisplay
函数,不要传递 class 名称,而是传入元素本身。然后,直接在该元素上初始化插件。
我只是来到这个解决方案,但它只初始化了第一个元素。
JS 初始化代码:
document.querySelectorAll('.phone_flag').forEach(el => {
PhoneDisplay(el.className);
});
function PhoneDisplay(ClassName){
var input = document.querySelector('.' + `${ClassName}`);
var iti = window.intlTelInput(input, {
hiddenInput: "full",
initialCountry: "auto",
geoIpLookup: function(callback) {
$.get('proxy.php', function() {}).always(function(resp) {
var countryCode = (resp && resp.country) ? resp.country : "";
callback(countryCode);
});
},
hiddenInput: "full_phone",
utilsScript: "intlTelInput/js/utils.js"
});
var reset = function() {
input.classList.remove("error");
errorMsg.innerHTML = "";
errorMsg.classList.add("hide");
validMsg.classList.add("hide");
};
input.addEventListener('blur', function() {
reset();
if (input.value.trim()) {
if (iti.isValidNumber()) {
validMsg.classList.remove("hide");
} else {
input.classList.add("error");
var errorCode = iti.getValidationError();
errorMsg.innerHTML = errorMap[errorCode];
errorMsg.classList.remove("hide");
}
}
});
input.addEventListener('change', reset);
input.addEventListener('keyup', reset);
}
document.querySelector
returns 第一个查询,所以 var input
永远是第一个输入。您应该只在 forEach 循环中传入元素本身:PhoneDisplay(el);
然后 function PhoneDisplay(input)
并删除 'var input=' 行。
jQuery(document).ready(function($) {
var input = $("input[name=phone]");
input.each(function() {
intlTelInput($(this)[0], {
initialCountry: "auto",
nationalMode: false,
separateDialCode: true,
preferredCountries: ["ua", "pl", "us"],
geoIpLookup: function(success, failure) {
$.get("https://ipinfo.io", function() {}, "jsonp").always(function(resp) {
var countryCode = (resp && resp.country) ? resp.country : "us";
success(countryCode);
});
},
});
});
});
我在一页上有很多表格。每个表单都应该有一个 phone 数字字段。这些字段由 JS plug-in
.
所以我得到了大量应该正确初始化的字段。
如果我手动完成,我会得到:
表单 *
phone 输入字段 =
初始化次数。
此时我只有第一个字段在工作。其他不初始化。
我的标记看起来像:
<input type="tel" class="phone_flag" name="phone_tab1[main]" required="">
<input type="tel" class="phone_flag" name="phone_tab2[main]" required="">
<input type="tel" class="phone_flag" name="phone_tab3[main]" required="">
xxx
...
我得到了一条建议:为了正常工作,我应该使用 querySelectorAll
和 forEach
循环。然后我应该调用 PhoneDisplay
函数,不要传递 class 名称,而是传入元素本身。然后,直接在该元素上初始化插件。
我只是来到这个解决方案,但它只初始化了第一个元素。
JS 初始化代码:
document.querySelectorAll('.phone_flag').forEach(el => {
PhoneDisplay(el.className);
});
function PhoneDisplay(ClassName){
var input = document.querySelector('.' + `${ClassName}`);
var iti = window.intlTelInput(input, {
hiddenInput: "full",
initialCountry: "auto",
geoIpLookup: function(callback) {
$.get('proxy.php', function() {}).always(function(resp) {
var countryCode = (resp && resp.country) ? resp.country : "";
callback(countryCode);
});
},
hiddenInput: "full_phone",
utilsScript: "intlTelInput/js/utils.js"
});
var reset = function() {
input.classList.remove("error");
errorMsg.innerHTML = "";
errorMsg.classList.add("hide");
validMsg.classList.add("hide");
};
input.addEventListener('blur', function() {
reset();
if (input.value.trim()) {
if (iti.isValidNumber()) {
validMsg.classList.remove("hide");
} else {
input.classList.add("error");
var errorCode = iti.getValidationError();
errorMsg.innerHTML = errorMap[errorCode];
errorMsg.classList.remove("hide");
}
}
});
input.addEventListener('change', reset);
input.addEventListener('keyup', reset);
}
document.querySelector
returns 第一个查询,所以 var input
永远是第一个输入。您应该只在 forEach 循环中传入元素本身:PhoneDisplay(el);
然后 function PhoneDisplay(input)
并删除 'var input=' 行。
jQuery(document).ready(function($) {
var input = $("input[name=phone]");
input.each(function() {
intlTelInput($(this)[0], {
initialCountry: "auto",
nationalMode: false,
separateDialCode: true,
preferredCountries: ["ua", "pl", "us"],
geoIpLookup: function(success, failure) {
$.get("https://ipinfo.io", function() {}, "jsonp").always(function(resp) {
var countryCode = (resp && resp.country) ? resp.country : "us";
success(countryCode);
});
},
});
});
});