13

这是我第一次在 stackoverflow 上提问,如果我做错了什么,请原谅我。我也是 jquery 的新手,但通过阅读和教程,我设法创建了一个工作示例。

下面的代码是我创建的。这意味着我有三个具有可拖动需求的列表和三个可以删除需求的占位符。这个想法是,占位符 1 只接受来自列表 1 的项目,占位符 2 只接受来自列表 2 的项目,以及来自列表 3 的占位符 3。当一个需求被拖动时,占位符将被突出显示,以便用户知道它可以放在哪里。

所以现在的问题是:有没有办法裁剪这段代码?我觉得这不是最好的方法,它是三个相同的代码,只有两个单词在变化。正如我从教程中学到的:永远不要写两次。

还有另一个问题:当要求在占位符中删除时,是否有可能在它之间创建一条线?我希望用户单击一个占位符并单击另一个占位符以绘制连接。我已经看到了很多关于 html5 canvas 和 jsPlumb 的示例,但我不需要所有这些功能。单击时占位符之间只有一行。

$(function() {
    $( "#requirements" ).accordion();
    $( "#requirements ul li" ).draggable({ 
    appendTo: "body", 
    helper: "clone" 
});

$( ".row1 .placeholder" ).droppable({ //makes row1 .placeholder a droppable area
     accept: "#requirements .row1 li ", 
     activeClass: "ui-state-hover",
     drop: function( event, ui ) {
        var $this = $(this);
        $( "<li></li>" ).text( ui.draggable.text() ).appendTo( this );
        $this.droppable('disable').addClass("highlighted");
     }
});

$( ".row2 .placeholder" ).droppable({ //makes row2 .placeholder a droppable area
     accept: "#requirements .row2 li ", 
     activeClass: "ui-state-hover",
     drop: function( event, ui ) {
        var $this = $(this);
        $this.find( ".placeholder" ).remove();
        $( "<li></li>" ).text( ui.draggable.text() ).appendTo( this );
        $this.droppable('disable').addClass("highlighted");
     }
});

$( ".row3 .placeholder" ).droppable({ //makes row3 .placeholder a droppable area
     accept: "#requirements .row3 li ", 
     activeClass: "ui-state-hover",
     drop: function( event, ui ) {
        var $this = $(this);
        $this.find( ".placeholder" ).remove();
        $( "<li></li>" ).text( ui.draggable.text() ).appendTo( this );
        $this.droppable('disable').addClass("highlighted");
    }    
});

如前所述,我是 jquery 的新手,所以欢迎提供很好的解释。提前致谢!

4

3 回答 3

3

编写一个函数,返回您正在重用的对象,插入行类或任何需要更改的参数:

function getSettings(rowClass){
    var obj ={ //makes row1 .placeholder a droppable area
      accept: "#requirements "+rowClass+" li ", 
      activeClass: "ui-state-hover",
      drop: function( event, ui ) {
        var $this = $(this);
        $( "<li></li>" ).text( ui.draggable.text() ).appendTo( this );
        $this.droppable('disable').addClass("highlighted");
      }
    }
    return obj;
}

然后将其称为 in $( ".row2 .placeholder" ).droppable(getSettings(".row2")。没有测试过,但它应该可以工作。如果用例是您描述的用例,则将任何非静态部分更改为函数参数就足够了。

欢迎来到 jQuery!

于 2013-08-09T08:06:09.037 回答
2

像这样的东西应该工作

var rowArr = [".row1", ".row2", ".row3"];
$(rowArr).each(function(curr) {
    $(curr + " .placeholder").droppable({
        accept: "#requirements " + curr + " li",
        /*rest of the code remains the same*/
    });
});
于 2013-08-09T08:07:24.310 回答
0

像这样使用怎么样:

    $( ".row1 .placeholder, .row2 .placeholder, .row3 .placeholder" ).droppable({ //makes row1 .placeholder a droppable area
var rowClass = [".row1",".row2", ".row3"];
$(rowClass).each(function(thisrow){
     accept: "#requirements" +  thisrow + "li ", 
         activeClass: "ui-state-hover",
         drop: function( event, ui ) {
            var $this = $(this);
            $( "<li></li>" ).text( ui.draggable.text() ).appendTo( this );
            $this.droppable('disable').addClass("highlighted");
         }
});
    });
于 2013-08-09T08:29:38.160 回答