简体   繁体   English

动态jQuery事件处理程序

[英]Dynamic jQuery event handler

I have been trying to create a dynamic jQuery code to handle an .change event with a list dropdown in drupal. 我一直在尝试创建动态的jQuery代码来处理.change事件,并在drupal中使用列表下拉列表。 I got it to work properly when hardcoding in the div id like so: 在div id中进行硬编码时,我可以正常工作,如下所示:

jQuery(document).ready(function($) {
    $("#edit-submitted-row-1-program").change(function() {
        if($(this).val() === 'DreamSpark Standard'){
            $("label[for='edit-submitted-row-1-extended-department-name'").html('Campus Name');
            console.log('Yes it is supposed to change!');
        } else {
            $("label[for='edit-submitted-row-1-extended-department-name'").html('Extended department name');
        }
        console.log($(this).val());
        }).change();
    }
});

This is supposed to change the label above one of the input fields (as shown below) if 'DreamSpark Standard' is selected. 如果选择了“ DreamSpark Standard”,则应该更改输入字段之一(如下所示)上方的标签。

However, what I want to end up doing is something like this: 但是,我最终想要做的是这样的:

动态行添加

Where you can add as many lines as you need, and the event handler will change the label of the appropriate label. 您可以在其中添加所需的任意行,事件处理程序将更改相应标签的标签。

I have tried the following code, but it is definitely wrong, as I'm just doing a for() loop when I know I should be doing a foreach() or something similar. 我已经尝试了以下代码,但这绝对是错误的,因为当我知道应该执行foreach()或类似操作时,我只是在执行for()循环。

jQuery(document).ready(function($) {
    for ( var i = 0; i < 5; i++) {
        $("#edit-submitted-row-" + i + "-program").change(function() {
            var j = i;
            if($(this).val() === 'DreamSpark Standard'){
                $("label[for='edit-submitted-row-" + j + "-extended-department-name'").html('Campus Name');
                console.log('Yes it is supposed to change!');
            } else {
                $("label[for='edit-submitted-row-" + j + "-extended-department-name'").html('Extended department name');
            }
            console.log($(this).val());
        }).change();
    }
});

Here is the snippet of HTML code that matters: 这是很重要的HTML代码片段:

<div id="webform-component-row-1" class="webform-layout-box horiz">
    <div class="form-item webform-component webform-component-textfield" id="webform-component-row-1--subscription-id">
        <label for="edit-submitted-row-1-subscription-id">Subscription ID <span class="form-required" title="This field is required.">*</span></label>
        <input type="text" id="edit-submitted-row-1-subscription-id" name="submitted[row_1][subscription_id]" value="" size="18" maxlength="128" class="form-text required" />
    </div>
    <div class="form-item webform-component webform-component-select" id="webform-component-row-1--program">
        <label for="edit-submitted-row-1-program">Program <span class="form-required" title="This field is required.">*</span></label>
        <select id="edit-submitted-row-1-program" name="submitted[row_1][program]" class="form-select required"><option value="" selected="selected">- Select -</option><option value="DreamSpark Premium">DreamSpark Premium</option><option value="DreamSpark Standard">DreamSpark Standard</option><option value="Other">Other</option></select>
    </div>
    <div class="form-item webform-component webform-component-textfield" id="webform-component-row-1--extended-department-name">
        <label for="edit-submitted-row-1-extended-department-name">Extended department name </label>
        <input type="text" id="edit-submitted-row-1-extended-department-name" name="submitted[row_1][extended_department_name]" value="" size="26" maxlength="128" class="form-text" />
    </div>
</div>

(Each row will be incremented by 1, so the next row would be 'webform-component-row-2' and so on) (每行将增加1,因此下一行将是'webform-component-row-2',依此类推)

Keep in mind I can't add data- tags or extra stuff in the HTML markup as it through drupal, and I just have to work with the given classes and ID's output! 请记住,我无法通过drupal在HTML标记中添加data-标签或其他内容,而只需要使用给定的类和ID的输出即可!

Thanks guys! 多谢你们!

There is no need to use a loop, you can write a generalized code using the class selectors. 无需使用循环,可以使用类选择器编写通用代码。

<div id="webform-component-row-1" class="webform-layout-box horiz">
    <div class="form-item webform-component webform-component-textfield" id="webform-component-row-1--subscription-id">
        <label for="edit-submitted-row-1-subscription-id">Subscription ID <span class="form-required" title="This field is required.">*</span></label>
        <input type="text" id="edit-submitted-row-1-subscription-id" name="submitted[row_1][subscription_id]" value="" size="18" maxlength="128" class="form-text required" />
    </div>
    <div class="form-item webform-component webform-component-select" id="webform-component-row-1--program">
        <label for="edit-submitted-row-1-program">Program <span class="form-required" title="This field is required.">*</span></label>
        <select id="edit-submitted-row-1-program" name="submitted[row_1][program]" class="form-select required"><option value="" selected="selected">- Select -</option><option value="DreamSpark Premium">DreamSpark Premium</option><option value="DreamSpark Standard">DreamSpark Standard</option><option value="Other">Other</option></select>
    </div>
    <div class="form-item webform-component webform-component-textfield" id="webform-component-row-1--extended-department-name">
        <label for="edit-submitted-row-1-extended-department-name" class="edit-submitted-row-extended-department-name">Extended department name </label>
        <input type="text" id="edit-submitted-row-1-extended-department-name" name="submitted[row_1][extended_department_name]" value="" size="26" maxlength="128" class="form-text" />
    </div>
</div>

then 然后

jQuery(function ($) {
    $(".webform-layout-box select").change(function () {
        var $lbl = $(this).closest('.webform-layout-box').find('.edit-submitted-row-extended-department-name');
        if ($(this).val() === 'DreamSpark Standard') {
            $lbl.html('Campus Name');
        } else {
            $lbl.html('Extended department name');
        }
    }).change();
});

Demo: Fiddle 演示: 小提琴

  • To label added a new class called edit-submitted-row-extended-department-name 为了标记,添加了一个新的类,称为edit-submitted-row-extended-department-name
  • We target the change event to the select element inside the .webform-layout-box element 我们的目标更改事件的select内部元素.webform-layout-box元素
  • When it is changed find the .edit-submitted-row-extended-department-name element within the same .webform-layout-box and change its text 更改后,请在同一.webform-layout-box找到.edit-submitted-row-extended-department-name元素,然后更改其文本

You should really look up 你真的应该抬头

$.on and $.live 

as they allow you to bind events for elements that do not exist yet. 因为它们允许您将事件绑定到尚不存在的元素。 Then, after that you can continue working on elements. 然后,之后您可以继续处理元素。

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

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