简体   繁体   English

使JQuery识别新添加的元素(事件概率已解决,但…)

[英]Making JQuery Recognise Newly Added Elements (Event Prob Solved but…)

Firstly, here's my code. 首先,这是我的代码。

HTML 的HTML

<div class="panel-body">
    <div class="col-md-3">
        <label for="trans_type">Transaction Type</label>
        <div class="input-group">
            <span class="input-group-addon"><i class="fa fa-group fa-fw"></i></span>
            <select class="selectpicker form-control"  data-live-search="true"  id="trans_type" name="trans_type" required>
                <option value="" selected>Select a Transaction Type</option>
                <option value=0>Class Experiment</option>
                <option value=1>Borrowment</option>
             </select>
         </div>
         <!-- /.input-group -->
     </div>
     <!-- /.col-md-3 -->
     <div class="col-md-3" id="lyr_1">
     </div>
     <!-- /.col-md-3 #lyr_1 -->
     <div class="col-md-3" id="lyr_2">
     </div>
     <!-- /.col-md-3 #lyr_2 -->
     <div class="col-md-3" id="lyr_3">
     </div>
     <!-- /.col-md-3 #lyr_3 -->
     <div class="row"><br><br><br><br>
     </div>
     <!-- /.row -->
     <div class="col-md-3" id="lyr_4">
     </div>
     <!-- /.col-md-3 #lyr_4 -->
 </div>
 <!-- /.panel-body -->

Javascript Java脚本

$(document).ready(function() {
    $("#trans_type").change(function() {
        if($("#trans_type").val() == 0) {
            $("#lyr_1")
                .html("<img src='assets/loader1.gif' class='text-center' alt='loading...' />")
                .load('models/getborreq_fields_model.php?mode=0', {}, function() {
                $('#trans0_adv').selectpicker('refresh');
            });
            $("#lyr_2")
                .html("<img src='assets/loader1.gif' class='text-center' alt='loading...' />")
                .load('models/getborreq_fields_model.php?mode=1', {}, function(){
                $('#trans0_sub').selectpicker('refresh');
            });
            $("#lyr_3")
                .html("<img src='assets/loader1.gif' class='text-center' alt='loading...' />")
                .load('models/getborreq_fields_model.php?mode=2', {}, function(){
                $('#trans0_exp').selectpicker('refresh');
            });
            $("#lyr_4")
                .html("<img src='assets/loader1.gif' class='text-center' alt='loading...' />")
                .load('models/getborreq_fields_model.php?mode=3', {}, function(){
                $('#trans0_grp').selectpicker('refresh');
            });
        } else if ($("#trans_type").val() == 1) {
            $("#lyr_1, #lyr_2, #lyr_3, #lyr_4").empty();
        }
    });
});

PHP 的PHP

<?php
require_once '../classes/dbc_get_bor.php';
session_start();
$db_call = new dbc_get_bor();
if ($_GET["mode"] == 0) {
    echo '<label for="trans0_adv">Subject Adviser</label>
    <div class="input-group">
        <span class="input-group-addon"><i class="fa fa-group fa-fw"></i></span>
        <select class="selectpicker form-control"  data-live-search="true"  id="trans0_adv" name="trans0_adv" required>
            <option value="" selected>Select an Adviser</option>';
            $db_call->get_faculty();
        echo '</select>
    </div>
    <!-- /.input-group -->';
} else if ($_GET["mode"] == 1) {
    echo '<label for="trans0_sub">Subject Code</label>
    <div class="input-group">
        <span class="input-group-addon"><i class="fa fa-group fa-fw"></i></span>
        <select class="selectpicker form-control"  data-live-search="true"  id="trans0_sub" name="trans0_sub" required>
            <option value="" selected>Select an Adviser First</option>
        </select>
    </div>
    <!-- /.input-group -->';
} else if ($_GET["mode"] == 2) {
    echo '<label for="trans0_exp">Experiment #</label>
    <div class="input-group">
        <span class="input-group-addon"><i class="fa fa-group fa-fw"></i></span>
        <select class="selectpicker form-control"  data-live-search="true"  id="trans0_exp" name="trans0_exp" required>
            <option value="" selected>Select a Subject First</option>
        </select>
    </div>
    <!-- /.input-group -->';
} else if ($_GET["mode"] == 3) {
    echo '<label for="trans0_grp">Group #</label>
    <div class="input-group">
        <span class="input-group-addon"><i class="fa fa-group fa-fw"></i></span>
        <select class="selectpicker form-control"  data-live-search="true"  id="trans0_grp" name="trans0_grp" required>
            <option value="" selected>Select a Subject First</option>
        </select>
    </div>
    <!-- /.input-group -->';
}?>

The Problem 问题

I already fixed the Event part. 我已经修复了事件部分。 I used what you guys Event Delegation by using 我使用了你们的事件委托

$( "#example" ).on( "click", "#example", function() {})

But now I'm getting problems when manipulating a newly added element My expected "working" code here is 但是现在在处理新添加的元素时遇到了问题。我期望的“工作”代码是

$('#lyr_1').on('change', '#trans0_adv', function () {
        $("#trans0_sub").html("<option value="" selected>Select Adviser's Subjects</option>");
    });

The event 事件

$('#lyr_1').on('change', '#trans0_adv', function () {}

Can be detected but 可以检测到,但是

$("#trans0_sub").html("<option value="" selected>Select Adviser's Subjects</option>");

can't. 不能。 I tried to put the code inside .load() in #lyr_# divs but it doesn't work. 我试图将代码放在#lyr_#divs中的.load()内,但是它不起作用。 I searched the web already but can't find an answer or anything similar to it. 我已经在网上搜索过,但找不到答案或类似的答案。

Programmatically modifying a <select> 's selected option will not trigger the change event. 以编程方式修改<select>的selected选项将不会触发change事件。

You will have to trigger it explicitely after performing the change using something like: 执行以下更改后,您将必须明确触发它:

$("#trans0_sub").trigger('change');

However, people usually need to do this because of an incorrect design in the first place. 但是,由于一开始的设计不正确,人们通常需要这样做。 I'm not saying it's always wrong to trigger events that way, but if you trigger the event just because you want a specific known behavior to be invoked , you would be better to explicitely state the behavior that you want . 我并不是说以这种方式触发事件总是错误的,但是如果仅由于要调用特定的已知行为而触发事件,则最好明确声明所需的行为

Eg 例如

$('#some-select').change(function () {
    //some behavior
});

//later
$('#some-select').val(someValue).trigger('change');

Would be better written as: 最好写成:

$('#some-select').change(function () {
    someBehavior();
});

function someBehavior() {
}

//later

$('#some-select').val(someValue);
someBehavior();

The change events works only if the user interacts with the element, so, to work, you will have to activate the event by hand, like 仅当用户与元素交互时, change事件才起作用,因此,要进行工作,您将必须手动激活事件,例如

$('select').html('blabla').change();

With this you may be able to achieve what you want :) 有了这个,您也许可以实现您想要的:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM