Uncaught TypeError: невозможно прочитать свойства null при вызове функции js test(). Что не так с этим примером кода? Есть ли лучший способ вызвать функцию js из php для манипулирования DOM?
HTML
<form method = "post" action = "#">
<input type = "text" id = "inp">Test</input>
<button type = "submit" id = "submit" name = "submit" value = "submit"></button>
</form>
php
if (isset($_POST['submit')]
{
$wrongInput= some code...
if ($wrongInput)
{
echo "<script src=main.js></script>";
echo "<script type=text/javascript>test();</script>"
}
}
js
function test()
{
document.querySelector("#submit").style.background = "red";
}
@LouysPatriceBessette не должна быть проблемой. Вызов функции test() работает, но манипуляция с домом не работает...
Вероятно, функция вызывается до загрузки DOM.
@LouysPatriceBessette, это тоже мое предположение. Но я не знаю, как это исправить. Должен ли я использовать функцию setTimeout для ожидания загрузки dom? как лучше всего?
Вы не можете вызывать функции javascript напрямую из PHP. Код будет отправлен в браузер после отправки и запуска страницы, как это было бы частью загрузки страницы.
добавьте differ к вашим тегам script
@medilies: ты имеешь в виду defer... лол! отложить
@LouysPatriceBessette Мне действительно нужно было немного IntelliSense в текстовой области комментария XD
@NigelRen хорошо, вызов функции test () работает. если я помещаю alert() в функцию test(), она выполняется, но свойство #submit еще не установлено...
В конечном итоге он будет выполнен, я сказал, что он будет выведен в браузер и затем выполнен. Это не означает, что он выполняется во время запуска PHP-кода.
@medilies, к сожалению, у меня отсрочка не сработала...
@NigelRen да, наверное, это правильно, но как мне решить эту проблему? используя setTimeout для моей тестовой функции или есть лучший способ?
поместите " ' " здесь: $wrongInput= некоторый код... $wrongInput= "некоторый код..." и echo "<script defer type='text/javascript'>test();</script>"
Попробуйте document.addEventListener("DOMContentLoaded", function(){ test() }) или даже лучше document.addEventListener("DOMContentLoaded", test )
@LouysPatriceBessette отлично, ты спасла меня!!!!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Непонятно, где это отображается на странице... Но наверняка DOM нужно загрузить, чтобы querySelector нашел элемент. Таким образом, использование события DOMContentLoaded — это способ убедиться, не обращая внимания на то, где находится эхо. ;)
if (isset($_POST['submit')]
{
$wrongInput= //some code...
if ($wrongInput)
{
echo "<script src='main.js'></script>";
echo "<script>document.addEventListener('DOMContentLoaded', test);</script>";
}
}
Пропали кавычки?
src=main.js