无法将事件绑定到jquery.steps向导中的输入

时间:2013-11-18 16:32:24

标签: javascript jquery jquery-steps

我正在使用http://www.jquery-steps.com/中的向导。使用向导的所有内容都非常流畅,但是当我尝试将事件绑定到该向导中的输入字段时,它无法正常工作。以下是该问题的基本代码:

<div class="content">
            <h1>Basic Demo</h1>


            <div id="wizard">
                <h2>First Step</h2>
                <section>
                    <input type="text" class="namer" />

                    <div class="text">This should be replaced</div>

                <h2>Second Step</h2>
                <section>
                    <pdfsgdf</p>
                </section>

            </div>
        </div>

<script>
$(".namer").change(function(e){
  $(".text").html($(this).val()); 
});

$(function ()
                {
                    $("#wizard").steps({
                        headerTag: "h2",
                        bodyTag: "section",
                        transitionEffect: "slideLeft"
                    });
                });

</script>

JSFiddle位于http://jsfiddle.net/m23px/

4 个答案:

答案 0 :(得分:6)

看起来加载向导时,它会更改事件监听器。您需要在#wizard上收听该活动。

试试这个:

$("#wizard").on('change','.namer',function(){
    $(".text").html($(this).val());     
});

注意:如果您希望在用户输入时进行更改,而不是在字段失去焦点后,您可以改为使用keyup事件。

$("#wizard").on('keyup','.namer',function(){
    $(".text").html($(this).val());     
});

答案 1 :(得分:4)

为了澄清这种情况发生的原因 - 在render函数(第892行)中,使用.empty()删除了向导的内容,因此绑定到其中元素的所有侦听器都将丢失。 / p>

wizard.attr("role", "application").empty().append(stepsWrapper).append(contentWrapper)
    .addClass(options.cssClass + " " + options.clearFixCssClass + verticalCssClass);

因此有三个选项可以解决这个问题,第一个是按Trevor说的做,并将侦听器绑定到向导元素或DOM上面的元素。

第二种是在插件完成加载时添加一个回调,并在此时正常初始化你的监听器。

第三是更改render函数以使用原始html(因此也就是原始侦听器),如下所示:

function render(wizard, options, state) {
    // Create a content wrapper and copy HTML from the intial wizard structure
    var contentWrapperTemplate = "<{0} class=\"{1}\"></{0}>",
        stepsWrapperTemplate = "<{0} class=\"{1}\">{2}</{0}>",
        orientation = getValidEnumValue(stepsOrientation, options.stepsOrientation),
        verticalCssClass = (orientation === stepsOrientation.vertical) ? " vertical" : "",
        contentWrapper = $(contentWrapperTemplate.format(options.contentContainerTag, "content " + options.clearFixCssClass)),
        stepsWrapper = $(stepsWrapperTemplate.format(options.stepsContainerTag, "steps " + options.clearFixCssClass, "<ul role=\"tablist\"></ul>"));

    // Transform the wizard wrapper by wrapping the innerHTML in the content wrapper, then prepending the stepsWrapper
    wizard.attr("role", "application").wrapInner(contentWrapper).prepend(stepsWrapper)
        .addClass(options.cssClass + " " + options.clearFixCssClass + verticalCssClass);

    //Now that wizard is tansformed, select the the title and contents elements
    var populatedContent = wizard.find('.content'),
        stepTitles = populatedContent.children(options.headerTag),
        stepContents = populatedContent.children(options.bodyTag);

    // Add WIA-ARIA support
    stepContents.each(function (index) {
        renderBody(wizard, state, $(this), index);
    });

    stepTitles.each(function (index) {
        renderTitle(wizard, options, state, $(this), index);
    });

    refreshStepNavigation(wizard, options, state);
    renderPagination(wizard, options, state);
}

答案 2 :(得分:0)

在焦点偏离输入之前,事件不会触发。

改为使用keyup事件。

请参阅:http://jsfiddle.net/MV2dn/5/

答案 3 :(得分:0)

要解决此问题,请在页面准备好之前调用其他代码之前的代码,以便在步骤完成其工作时不会丢失绑定