【问题标题】:How to add jquery autocomplete UI functionality to each cell in my table如何将 jquery 自动完成 UI 功能添加到表中的每个单元格
【发布时间】:2015-06-14 10:25:54
【问题描述】:

我有一个项目要求,我需要使用 Jquery 创建一个动态表。 我已经达到了可以向表中添加动态列或行的状态。 您可以在这里查看小提琴代码:DEMO LINK HERE

此处为 HTML 代码:

<br /><br />
<div id='input_div' name='input_div'>
Please Input your Matrix Dimensions : <input type="text" id="rowcount" size="2" value="1"> 
<span>X <input type="text" id="columncount" size ="2" value="1">
</div> <br><br>
<input type="button" id="tablebtn" value="Create Table">
<input type="button" id="newabilitybtn" value="Add Ability">
<input type="button" id="newlevelbtn" value="Add Level">
<input type="button" id="submit" value="Submit">
<br><br>
<div id="box">
</div>  

这里是jQuery代码:

var arr = [
  {val : 1, text: 'One'},
  {val : 2, text: 'Two'},
  {val : 3, text: 'Three'},
  {val : 4, text: 'Four'}
];
$("#newabilitybtn").hide();
$("#newlevelbtn").hide();
$("#submit").hide();

$("#tablebtn").click(function(){     
    mytable = $('<table></table>').attr({ id: "MatrixTable" });
    var rows = new Number($("#rowcount").val());
    var cols = new Number($("#columncount").val());
    var tr = [];

    for (var i = 0; i < rows; i++) {
        var row;
        if( i == 0){
            row=$('<tr><th></th><th>Level</th></tr>').attr({ class: ["Lheader"] }).appendTo(mytable);
        }
        row = $('<tr><th>Ability</th>').attr({ class: ["Aheader"] }).appendTo(mytable);

        for (var j = 0; j < cols; j++) {
            var td;
            td = $('<td>').attr({ class: ["matrix_row"] }).appendTo(row);
            var sel = $('<select />').attr({ class: ["matrix"], text:'Elway',id: "MatrixTable"+"_"+i+"_"+j  }).appendTo(td);
            $(arr).each(function() {
                sel.append($("<option>").attr('value',this.val).text(this.text));
            });  
            $('<br><br><span>').attr({'class':'rubric_span' }).html('Selected: ').appendTo(td);
            // $('#rubric_name').html(span);
            $('</span>').appendTo(row);
            $('</td>').appendTo(row);
        }   
        $('</tr>').appendTo(row);
    }
    //console.log("TTTTT:"+mytable.html());
    mytable.appendTo("#box");   
    $("#tablebtn").hide(); $("#input_div").hide();
    $("#newabilitybtn").show();
    $("#newlevelbtn").show();
    $("#submit").show();
});

$("#newabilitybtn").click(function(){
    $('#MatrixTable').append($('#MatrixTable').find("tr:last").clone());
});


$("#newlevelbtn").click(function(){
    $('#MatrixTable tr').each(function(){
        $(this).append($(this).find(">*:last").clone());
    });
});

$("#submit").click(function(){

    jsonObj = [];
    var dropdown_count = 0;
    var rowCount = $('#MatrixTable tr').length;
    var ColCount = $('#MatrixTable').find("tr:last td").length;
    var row = 1;
    var col = 1;

    // Fetching the Level and Ability Names
    //$("select[class=LHeader]").each(function() {

    //    var id = "Level_"+ row + "_" + col++  ;
    //    var selected_val = 0 ;//$(this).text();
    //    item = {}
    //    item ["id"] = id;
    //    item ["names"] = selected_val;
    //    jsonObj.push(item);
    //}); 

    //row = 1;
    //col = 1;    

    // Fetching the rubric Selections
    $("span[class=rubric_span]").each(function() {

        var id = "selected_rubric_"+ row + "_" + col++  ;
        //var selected_val = $(this).val();
        var selected_val = $(this).text();
        item = {}
        item ["id"] = id;
        item ["selected_rubric"] = selected_val;
        if( row == rowCount ){
            row = 1;
        }   
        if( col == ColCount + 1 ){
            col = 1;
            row++;
        }
        jsonObj.push(item);
    });
    console.log(jsonObj);    
});

CSS 代码:

table{
    width:200px;
    height:200px;
}
table td{
    padding:10px;
    margin:10px;
    border:1px solid #ccc;
}
table tr{
    height:10px;
}

现在,问题是我需要用搜索输入字段替换每个单元格中的下拉菜单。我在网上搜索,发现这个链接是合适的。 Autocomplete widget。我搜索了如何实现这一点,发现如果 DOM 元素是使用 clone 函数动态创建的,那么它将不起作用,或者他们中的大多数人都建议改变我的表的创建方式。任何人都可以指导我到教程或博客,它可以教育我如何完成这项任务。我的项目是使用 Perl 语言开发的。

我最初的方法是,清除我的数组arr 的内容,在页面加载时使用选项列表加载它(Ajax 调用)。为每个单元格中的所有下拉列表重新使用该列表。这是正确的方法吗?

我是 jquery 的新手。请指导我。谢谢

【问题讨论】:

  • 我找到的一个参考链接link

标签: javascript jquery html jquery-ui


【解决方案1】:

创建新元素后只需运行.autocomplete() 函数:https://jsfiddle.net/hmfpkdxh/5/

$('#MatrixTable tr').each(function () {
    $(this).append($(this).find(">*:last").clone());
    $(this).find(">*:last input").val("").autocomplete({
        source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"]
    });
});

$('#MatrixTable').append($('#MatrixTable').find("tr:last").clone());
$('#MatrixTable tr:last td input').val("").autocomplete({
    source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"]
});

【讨论】:

  • 感谢您的解决方案。但我想改变源数组。如何将自动完成中的源选项更改为如下所示的结构。我有一个 mysql 表,我需要从中获取和填充搜索所需的数据。我有一个 ajax 调用来检索这些数据。 @ajax_data = {'name' => 'P1','id' => '2'}, {'name' => 'P2', 'id' => '3'}, {'name' => ' P3','id' => '9'}。在选择产品时,我必须将 id 保存到数据库中。我计划在每个单元格中都有一个隐藏变量来存储 ID。在页面提交时,我会将其发送到 Perl 代码并将其存储在数据库中。
  • @llpo Oksanen:你能解释一下我们在这一步中到底在做什么$('#MatrixTable tr:last td input').val("") and $(this).find("&gt;*:last input").val("")。这是否会清除克隆 tr/td 中的选择?我已经进一步开发了这段代码,现在克隆的单元格正在获取前一个 td 或 tr 的属性。你能指导我吗..请DEMO
  • @llpo Oksanen:我在 stackoverflow 中找到了解决问题的方法。 SOLUTION。我正在尝试在我的示例中加入相同的内容。
  • @llpo Oksanen:我还有一个关于自动完成的问题。自动完成是否支持保留页面刷新时的值?我处于将所有单元格的选定数据保存到数据库中的情况。现在,如果用户返回到保存的矩阵,他应该会看到保存时的相应单元格值。我该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2014-01-21
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 2020-08-16
相关资源
最近更新 更多