Your customer select's change event is being assigned before the select is rendered on the page. Move the event handler into document.ready:
<script type="text/javascript" charset="utf-8">
$(document).ready(function(){
$('#customer').on('change', function (){
$.getJSON('select.php', {customerId: $(this).val()}, function(data){
var options = '';
for (var x = 0; x < data.length; x++) {
options += '<option value="' + data[x]['id'] + '">' + data[x]['reg'] + '</option>';
}
$('#vehicle').html(options);
});
});
});
</script>
I also changed $$('#customer')
to $('#customer')
. Finally, fix your SQL injection vulnerability:
$sql = 'SELECT * FROM vehicles WHERE customerID = ' . (int)$id;
Casting the ID as a int will prevent SQLi here, but you should consider using a Prepared Statement.
The error you mentioned in the question looks unrelated to your code. It looks related to a Chrome extension.
Not part of the problem but here is an improved version of your code that builds the vehicle options:
$.getJSON('select.php', {customerId: $(this).val()}, function(data){
var vehicle = $('#vehicle');
for (var x = 0; x < data.length; x++) {
vehicle.append(new Option(data[x].reg, data[x].id));
}
});
The improvements are:
- Storing the select in a variable, so that we don't have to keep querying the DOM on each iteration of the loop
- Using
new Option(...)
and .append()
to create the options and add them to the vehicle select. Building elements like this is better than creating raw HTML because this way, you don't have to worry about characters such as <
and >
in the data - which would break your HTML with the current code.
- Your data is decoded into an array of Javascript objects, so the object notation is preferred (
data[x].id
) instead of data[x]['id']
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…