#javascript #html #dom
#javascript #HTML #dom
Вопрос:
Я создал код для простого выбора и вставки в базу данных. Этот код работает при тестировании из html в веб-браузере (Firefox и Chrome). Однако это было сделано как плагин, у плагина были свои ошибки, файл json уже был исправлен, и он вставляет информацию. Однако произошла проверка информации в JS, и плагин пропускает эту часть.
В форме есть 5 полей, которые необходимо заполнить, и переключатель, после этого пользователь нажимает кнопку «Сохранить», Js проверяет информацию и, если она правильная, отправляет ее на PHP, который вставляет информацию, это работает при выполнении в Интернете. Но в плагине он пропускает эту проверку и отправляет информацию, однако она заполнена в PHP для ее вставки.
После поиска я уже видел руководство для разработчиков Google extensions и firefox, особенно это (https://developer.chrome.com/extensions/contentSecurityPolicy#JSExecution )
Мне удалось вывести сообщение на экран, однако оно проверяет поля при активации кнопки плагина, а не кнопки отправки.
index_FINAL.js * Я сократил код, просто поместив несколько строк для проверки вместо всех
var ok = true;
function valida(f) {
ok = true;
var msg = "Empty fields:nn";
if(f.id_own.value == "")
{
msg = "Ticket Ownern ";
ok = false;
}
if(f.Ticket.value == "")
{
msg = "Ticket IDn";
ok = false;
}
if(ok == false)
alert(msg);
else { }
return ok;
};
document.addEventListener('DOMContentLoaded', function () {
var x = document.getElementById("btn_save");
x.addEventListener("click", valida());
});
index_FINAL.html
* Я сократил код, просто поместив конец html-кода там, где находятся кнопки и скрипты.
<div id="tick_but">
<br>
<button type="submit" class="btn btn-success" id="btn_save">Save</button>
<button type="reset" class="btn btn-danger" id="btn_cancel">Cancel</button>
</div>
</form>
</div>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM B07jRM" crossorigin="anonymous"></script>
<script src="index_FINAL.js" type="text/javascript"></script>
</body>
</html>
Когда я пытаюсь активировать плагин, я получаю сообщение, сгенерированное js, указывающее, что у меня есть пустые поля, вместо вызова функции valida() при нажатии кнопки сохранить.
Я ожидаю, что он проверяет, когда я нажимаю кнопку сохранить, а не раньше.
Ответ №1:
Функция обратного вызова valida()
должна вызываться при событии отправки. Следующая демонстрация представляет собой упрощенный макет того, к чему привязываться, и как разместить valida()
в качестве обратного вызова для события отправки. Предполагается, что он <form>
является первым или единственным <form>
на этой конкретной веб-странице (ie index_FINAL.html
)
document.forms[0].addEventListener("submit", valida);
// This is just a dummy callback for proof of concept
function valida(e) {
e.preventDefault();
console.log(e.type ' event has been triggered and callback function valida() has been invoked.');
}
<form>
<button type="submit">Save</button>
</form>
Комментарии:
1. Хорошо, я протестировал фрагмент кода, который вы мне прислали, и в веб-браузере он сработал, но в плагине я не вижу консоль. Однако в веб-браузере я перехожу к типам активаций .. вроде как говоря, когда я изменил его, чтобы вызвать фактическую функцию valida, она говорит undefined и submit. Например, «было запущено событие sumbit и была вызвана функция обратного вызова valida()» и сразу после этого: «было запущено неопределенное событие и была вызвана функция обратного вызова valida()»
2. Хорошо, теперь я вижу, что неопределенное событие, которое я получаю, связано с вызовом функции, которая у меня есть в моей форме. <идентификатор формы=»f» действие=» anubis.amxdigital.net/test/jsontest.php » method=»POST» name=»f» onsubmit= «return valida(это)»>
3. Теперь при запуске в CHROME в качестве расширения я получаю эту ошибку: Uncaught TypeError: не удается прочитать свойство ‘value’ неопределенного значения в первом поле if (f.id_own.value == «»), если я не ошибаюсь, это означало бы, что он больше не принимает значения из html, верно?
4.
"return valida(this)"
конфликтует с фиктивным,valida()
попробуйте удалить атрибут on-event в<form>
и просто используйтеdocument.forms[0].addEventListener("submit", valida);
и удалите остальное. Загляните в документацию плагина и посмотрите, требуются ли для него такие параметры, какthis
. Плагины обычно обрабатываютсяthis
внутренне, избавляя нас от неоднозначной природыthis
. Опять же, мой опыт работы с расширениями браузера ограничен, потому что политика моей компании заключается в том, что пользователям никогда не нужно использовать что-либо, кроме браузера, ничего лишнего.
Ответ №2:
Большое спасибо Zer00ne за ваш ответ, это не сработало для моего кода, но я смог увидеть другой путь к решению этой проблемы.
Поскольку плагины не принимают встроенное кодирование, я удалил функцию onsubmit, которая была в HTML-форме, и после этого мне нужно было сделать JS доступным для отправки ответа submit в HTML.
Здесь я прикрепляю фрагмент кода, который я изменил.
$(function() {
$('#btn_save').click(function(event){
event.preventDefault();
var HTF = document.getElementById("f");
valida(f);
//alert(ok);
if (ok) {
HTF.submit();
}
});
});
Однако плагин не работает в CHROME, но хорошо работает в Firefox, и это то, что мне было нужно.
С уважением