多个jQuery UI滑块更新错误的值

时间:2013-02-01 10:24:56

标签: jquery jquery-ui uislider meta-boxes

我正在使用Wordpress Meta Box插件(https://github.com/rilwis/meta-box)在帖子页面上放置六个jQuery UI滑块。

问题是jQuery中必须有一个错误来处理我找不到的滑块:每当我放置多个滑块时,它会更新页面中最后一个滑块的值而不是正确的滑块。仅在页面中有1个滑块才能正常工作,或者如果我重复代码六次(每个类一次),这显然我不想这样做。

示例:

我移动 pm_slider_c1 >更新 pm_rating_c6-label span

这是JS代码:

jQuery( document ).ready( function( $ )
{
    var
        id = null
        , el = null
        , input = null
        , label = null
        , format = null
        , value = null
        , update = null
        ;
    $( '.rwmb-slider' ).each( function( i, val )
    {
        id = $( val ).attr( 'id' );
        el = $( '#' + id );
        input = $( '[name=' + id + ']' );
        label = $( '[for=' + id + ']' );
        format = $( el ).attr( 'rel' );

        $( label ).append( ': <span id="' + id + '-label"></span>' );
        update = $( '#' + id + '-label' );

        if (
            !$( input ).val()
                || 'undefined' === $( input ).val()
                || null === typeof $( input ).val()
            )
        {
            $( input ).val( $( el ).slider( "values", 0 ) );
            $( update ).text( "0" );
        }
        else
        {
            value = $( input ).val();
            $( update ).text( value );
        }
        if ( 0 < format.length )
            $( update ).append( ' ' + format );

        el.slider(
            {
                value: value,
                slide: function( event, ui )
                {
                    $( input ).val( ui.value );
                    $( update ).text( ui.value + ' ' + format );
                }
            } );
    } );
} );

单个幻灯片的HTML:

<div class="rwmb-field rwmb-slider-wrapper">
    <div class="rwmb-label">
        <label for="pm_rating_c1">Rating: 
            <span id="pm_rating_c1-label">0</span><!-- GENERATED FROM JS -->
        </label>
    </div>

    <div class="rwmb-input">
        <div class="clearfix">
            <div class="rwmb-slider" id="pm_rating_c1"></div>
            <input type="hidden" name="pm_rating_c1" value="0">
        </div>
    </div>
</div>

这四天我对此感到头疼(我不是jQuery专家),所以任何帮助都会非常感激。

谢谢你们

1 个答案:

答案 0 :(得分:0)

偶然发现这个问题试图解决类似的问题。

供任何人参考:问题是每次创建滑块时都会重置输入和更新值(对于每个()循环的每次迭代都会重置。

因此,当任何ui滑块对象检测到滑动事件时,它使用您为“input”和“update”设置的最后值调用以下逻辑

$( input ).val( ui.value );
$( update ).text( ui.value + ' ' + format );

解决方案是使用jquery这个对象 $(this)作为选择器的根。

E.G。

el.slider(
            {
                value: value,
                slide: function( event, ui )
                {
                    $(this).find("input").val( ui.value );
                    $(this).closest("label").text( ui.value + ' ' + format );
                }
            } );

有可能有一种更有效的方式来写这个,但它解决了问题的根源。