Javascript AddEventListener Somehow Not Working With QuerySelector In Laravel
I'm working on Laravel 5.8 and i want to add simple javascript inside my project. It works fine without the query selector :
document.addEventListener('click', (e)=>{
console.log(1);
});
But somehow the js doesn't work when I insert a querySelector to it.
document.querySelector('.col-md-8.menus').addEventListener('click', (e)=>{
console.log(1);
});
I tested it manually on my browser console and the event fires properly. I've made sure there are no other classes in other blade templates using that class name. My guess is it probably has something to do with Laravel since I also tested it in a dummy html and it's working properly there.
The app.blade
is as follows:
<!DOCTYPE html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
@include('include.head')
</head>
<body>
<div id="app" style="min-height:1500px">
<nav class="navbar navbar-expand-md navbar-dark bg-dark shadow-sm" >
@include('include.navbar')
</nav>
<!--<main class="py-4">-->
<div class="container" >
@yield('content')
</div>
<!--</main> -->
</div>
</body>
<script type="text/javascript">
document.querySelector('.col-md-8.menus').addEventListener('click', (e)=>{
console.log(1);
});
[...document.querySelectorAll('.nav-tabs a.pr-5.py-3')].forEach(link => link.innerHTML = link.innerHTML.replace('_', ' '));
[...document.querySelectorAll('[name="kategori"] option')].forEach(option => option.innerHTML = option.innerHTML.replace('_', ' '));
</script>
<footer class="row">
@include('include.footer')
</footer>
</html>
and the blade where the selector referenced to (go to <!--Menu List-->
comment):
@extends('layouts.app')
@section('content')
<div class="container" style="padding:0px">
<div class="jumbotron" style="background-image:url({{asset('bg.jpg')}})">
<div class="container my-4">
<h1 class="display-4">Selamat Datang di Restoran Acin</h1>
</div>
</div>
</div>
<div class="container">
<div class="row justify-content-center">
<div class="container pt-4" align=center>
<h1></h1>
</div>
</div> <div class="container my-3">
<div class="row">
<div class="col-6">
<div class="card">
<h5 class="card-header">
Status
</h5>
<div class="card-body">
<p>Meja Kosong : </p>
<p>Meja Penuh : </p>
</div>
</div>
</div>
</div>
<div class="row">
<!-- Menu List -->
<div class="col-md-8 menus">
<div class="row">
<div class="col-3 pt-4">
<div class="card">
<div class="card-header">Nama : Nasi Goreng</div>
<div class="card-body">Harga : 12000</div>
</div>
</div>
<div class="col-3 pt-4">
<div class="card">
<div class="card-header">Nama : Nasi Goreng</div>
<div class="card-body">Harga : 12000</div>
</div>
</div>
<div class="col-3 pt-4">
<div class="card">
<div class="card-header">Nama : Nasi Goreng</div>
<div class="card-body">Harga : 12000</div>
</div>
</div>
<div class="col-3 pt-4">
<div class="card">
<div class="card-header">Nama : Nasi Goreng</div>
<div class="card-body">Harga : 12000</div>
</div>
</div>
</div>
</div>
<!-- Order List -->
<div class="col-md-4 order">
<div class="card mt-3">
<div class="card-body">
<div class="d-flex order">
<span class="nama-order">Nasi Goreng</span>
<span class="harga-order">15000</span>
<span class="delete-makanan"><button class="btn btn-primary"></span>
</div>
</div>
</div>
<div class="card mt-3">
<div class="card-body">
<div class="d-flex order">
<span>Nasi Goreng</span>
<span>15000</span>
<span class="delete-makanan"><button class="btn btn-sm btn-danger">Hapus</button></span>
</div>
</div>
</div>
</div>
</div>
<div id="order-template">
<div class="card mt-3">
<div class="card-body">
<div class="d-flex order">
<span>Nasi Goreng</span>
<span>15000</span>
<span class="delete-makanan"><button class="btn btn-sm btn-danger">Hapus</button></span>
</div>
</div>
</div>
</div>
<contoh-component></contoh-component> <!-- testing vue component-->
</div>
</div>
@endsection
What could be the problem?
Answer
What happens if you place this inside of a window.onload? E.g.
window.onload = () => {
document.querySelector('.col-md-8.menus').addEventListener('click', (e) => {
// ...
});
};
The reason why this may be happening is because the DOM hasn't been loaded yet so document.querySelector('.col-md-8.menus')
isn't finding anything.
Onload Docs: https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event
Related Questions
- → How to update data attribute on Ajax complete
- → October CMS - Radio Button Ajax Click Twice in a Row Causes Content to disappear
- → Octobercms Component Unique id (Twig & Javascript)
- → Passing a JS var from AJAX response to Twig
- → Laravel {!! Form::open() !!} doesn't work within AngularJS
- → DropzoneJS & Laravel - Output form validation errors
- → Import statement and Babel
- → Uncaught TypeError: Cannot read property '__SECRET_DOM_DO_NOT_USE_OR_YOU_WILL_BE_FIRED' of undefined
- → React-router: Passing props to children
- → ListView.DataSource looping data for React Native
- → Can't test submit handler in React component
- → React + Flux - How to avoid global variable
- → Webpack, React & Babel, not rendering DOM