【问题标题】:I am having a few problems trying to create a jquery live search function for basic data set?我在尝试为基本数据集创建 jquery 实时搜索功能时遇到了一些问题?
【发布时间】:2011-12-05 22:54:50
【问题描述】:

我正在我正在开发的网站上的一个小部件中设计一个简单的 jquery 实时搜索功能。我借用了一些我找到的代码,它运行良好。问题是,而不是使用这样的列表:

  <ul>
    <li>Searchable Item 1</li>
    <li>Searchable Item 2</li>
etc

我正在使用这样的列表:

<ul>
<li>
<a href="#">
<div class="something>
<img src="something.jpg">
<p>Searchable Item 1</p>
</div>
</a>
</li>
etc.

如您所见,我要搜索的文本位于 p 标签中。我使用的功能是搜索所有其他内容(a href、div、img)和在这些标签中找到的匹配文本以及 p 标签中的项目。对不起,如果我的解释有点混乱,但我会在这里向您展示代码示例:

//includes im using
<script type="text/javascript" src="js/jquery-1.7.min.js" ></script>
<script type="text/javascript" src="js/quicksilver.js"></script>
<script type="text/javascript" src="js/jquery.livesearch.js"></script>



//document ready function
$(document).ready(function() {
$('#q').liveUpdate('#share_list').fo…
});



//actual search text input field
<input class="textInput" name="q" id="q" type="text" />



//part of the <ul> that is being searched
<ul id="share_list">
<li>
<a href="#">
<div class="element"><img src="images/social/propellercom_icon.jpg… />
<p>propeller</p>
</div>
</a>
</li>


<li>
<a href="#">
<div class="element"><img src="images/social/diggcom_icon.jpg" />
<p>Digg</p>
</div>
</a>
</li>


<li>
<a href="#">
<div class="element"><img src="images/social/delicios_icon.jpg" />
<p>delicious</p>
</div>
</a>
</li>
</ul>

这也是我正在使用的 jquery.livesearch.js 文件

jQuery.fn.liveUpdate = function(list){
list = jQuery(list);

if ( list.length ) {

var rows = list.children('li'),
cache = rows.map(function(){
return this.innerHTML.toLowerCase();
});


this
.keyup(filter).keyup()
.parents('form').submit(function(){
return false;
});
}

return this;

function filter(){
var term = jQuery.trim( jQuery(this).val().toLowerCase() ), scores = [];

if ( !term ) {
rows.show();
} else {
rows.hide();

cache.each(function(i){
var score = this.score(term);
if (score > 0) { scores.push([score, i]); }
});

jQuery.each(scores.sort(function(a, b){return b[0] - a[0];}), function(){
jQuery(rows[ this[1] ]).show();
});
}
}
};

我相信问题出在这里:

var rows = list.children('li'),
cache = rows.map(function(){
return this.innerHTML.toLowerCase();
});

它只是使用它在 li 标签之间找到的任何内容作为搜索词来与输入到文本输入字段中的字符串进行比较。搜索功能确实有效,但似乎找到了太多匹配项并且并不具体,因为我也在使用 quicksilver.js 搜索功能来匹配根据分数相似的术语。当我从 li 列表(a href、img、div 等)中删除所有其他内容时,搜索功能完美运行。如果有人对此有任何解决方案,我会非常感激,我尝试过类似的方法:

返回 this.children('p').innerHTML 但它不起作用,我可以使用 PHP、C++、C# 等,但对 javascript 和 Jquery 完全没用,它们对我来说就像外语!

【问题讨论】:

    标签: javascript jquery search live


    【解决方案1】:

    jquery.livesearch.js文件中我相信你可以替换这一行:

    var rows = list.children('li'),
    

    与:

    var rows = list.children('li').find('p'),
    

    这样livesearch 插件将只搜索列表中的段落标签。

    您需要更改 .show()/.hide() 行以反映您正在尝试显示父 &lt;li&gt; 元素,因为您现在正在选择子 &lt;p&gt; 元素:

    变化:

    rows.show();//1
    rows.hide();//2
    jQuery(rows[ this[1] ]).show();//3
    

    收件人:

    rows.parents('li:first').show();//1
    rows.parents('li:first').hide();//2
    jQuery(rows[ this[1] ]).parents('li').show();//3
    

    【讨论】:

    • 首先感谢您的快速回复,我真的很感激。您写的内容似乎完全合乎逻辑,因此我相应地编辑了 jquery.livesearch.js 文件,但现在该功能根本不起作用。奇怪的是,现在每当我在搜索框中输入任何内容时,第一个 li 元素都会消失,但无论我输入什么内容都没有其他内容。
    • 嗨,从字面上看,只是复制并粘贴了您所说的更改到我的代码中,但仍然是同样的问题。无论如何,非常感谢您的尝试,我仍然非常感谢。不想成为害虫,所以我只能继续努力。不过谢谢。 p.s.我正在制作的小部件的整个代码位于alvuk.com/widget_test1.html(原始)和alvuk.com/widget_test2.html(您建议的更改)。谢谢。
    • 终于让它工作了。刚刚将 li:first 替换为 li。似乎 li:first 总是指向 ul 中的第一个元素。也许只是我使用的 jquery 版本的一个怪癖。感谢贾斯珀的帮助!
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2021-11-12
    相关资源
    最近更新 更多