如果手风琴选项卡的子项与搜索参数匹配,如何激活手风琴选项卡?

时间:2014-04-07 16:09:14

标签: javascript jquery jquery-ui-accordion

我一直在努力实现以下目标,假设我有一个文本框,人们可以输入文本(比如汽车1),然后按回车键,然后在文本存在的地方打开一个jquery手风琴,并且高亮显示内容。我已经找到了highlite部分,以及搜索部分(有点),如下所示:

http://jsfiddle.net/q42ZC/13/

仍然,我不能得到开放部分选项卡,我尝试使用父母或父母,但无济于事,我知道这是我做错了,但我似乎无法理解我做错了什么因此,任何指导都会很高兴地被贬低。

我的代码如下:

HTML

<div id="accordion" class="accordion">
        <h3>Tipo 1</h3>

        <div>   
            <a>
                <div class="">
                    <p>Car 1</p>
                </div>
            </a>
             <a>
                <div class="">
                    <p>Car 2</p>
                </div>
            </a>
             <a>
                <div class="">
                    <p>Car 3</p>
                </div>
            </a>
        </div>
     <h3>Tipo 2</h3>

    <div>   
        <a>
                <div class="">
                    <p>Car 21</p>
                </div>
            </a>
        <a>
            <div class="">
                <p>Car 4</p>
            </div>
        </a>

    </div>
     <h3>Tipo 5</h3>

    <div>   <a>
            <div class="">
                <p>Car 6</p>
            </div>
        </a>
    <a>
            <div class="">
                <p>Car 8</p>
            </div>
        </a>
    <a>
        <div class="">
                <p>Car 12</p>
            </div>
        </a>
    <a>

        <div class="">
                <p>Car 16</p>
            </div>
        </a>

    </div>
</div>

JS

 $("#accordion").accordion({
         header: "h3",
         navigation: true,
         collapsible: true,
         heightStyle: "content",
         active: false
     });

//Simulate the text im getting from textbox.
    var word = "Car 1";

//this is not getting me the index i was expecting it to return, it returns values like 12 and 11.
    alert($('#accordion div').index($('#accordion').find("a :contains('"+word+"')").parents("h3").get( 0 )));
//this works, so i know i'm finding the text inside the accordion
    $('#accordion').find("a :contains('"+word+"')").css( "background-color","red" );
//this does NOT work
    $('#accordion').find("a :contains('"+word+"')").parent("h3").get( 0 ).css( "background-color","blue" );
    //$('#accordion').accordion({active : 1});  <--This works, but how can i find the index to activate ?

我还希望能够“找到”完全匹配的单词,也就是说,截至目前,:contains保留了选择Car 1,Car 12等等我想要它只匹配Car 1,我正在考虑去其他路线并迭代整个手风琴来搜索我的文字,但这似乎有点矫枉过正,特别是因为手风琴最终可能每个“标签”都包含很多项目。

修改

阅读更多内容,似乎更容易jsut忽略索引,并且,作为评论的消息,去点击事件,所以我想出了这个解决方案,如果我内部的元素只有owrks手风琴有独特的文字;解决方案如下:

$('#accordion').find("a :contains('"+word+"')").parent().parent().prev().click();

我真的不喜欢这个解决方案,这也只是部分地解决了我的问题,现在,我如何才能使得只有精确的文本匹配被jquery选中?我试过以下,但似乎没有工作,文本和内部文本之间的每个元素比较只会重新发生错误,即使是匹配也是如此。

//This wont work
    $('#accordion').find("a").filter(function() {
        //alert($.trim($(this).text()) +" "+ $.trim(word) +" = "+ $.trim($(this).text()) === $.trim(word) );
        return $.trim($(this).text()) === $.trim(word);
    }).parent().parent().prev().click();

任何想法?。

编辑2

我只是“解决”了我的问题,但解决方案远非优雅,如果有人指出更好的解决方案,我会很高兴,因此我不会回答这个问题。无论如何,我找到的解决方案是这样的:

$.expr[':'].textEquals = $.expr.createPseudo(function(arg) {
    return function( elem ) {
        return $(elem).text().match("^" + arg + "$");
    };
});

然后单击H3元素,如下所示:

$('#accordion').find("a :textEquals('"+ word +"')").parent().parent().parent().prev().click();

同样,这一切看起来都很糟糕,必须有更好的方法来解决这个问题。

1 个答案:

答案 0 :(得分:0)

我刚刚解决了#34;我的问题,但解决方案远非优雅,如果有人能指出更好的解决方案,我会很高兴,因此,为什么我不能回答这个问题。无论如何,我找到的解决方案是这样的:

$.expr[':'].textEquals = $.expr.createPseudo(function(arg) {
    return function( elem ) {
        return $(elem).text().match("^" + arg + "$");
    };
});

然后激活&#34;标签&#34;通过执行以下操作:

    var selector = $('#acc').find("a :textEquals('" + $.trim(index) + "')");
    //i added a class to the "accordion item container (the div under the H3)" so that i could do the following
    var header = selector.parents(".contenedor-folios").prev();
    var headerList = $('#acc').find('.contenedor-folios').prev();
    // then i can get the index of the "tab" and make it the active one.
    var indexHeader = headerList.index(header);
    $("#acc").accordion({ active: indexHeader });

希望这可以帮助处于相同情况的人。