【问题标题】:Adding a function to jQuery draggable revert "event"将函数添加到 jQuery 可拖动还原“事件”
【发布时间】:2013-01-12 08:59:55
【问题描述】:

我有什么:

我有一个可拖动的 div,其还原参数设置为“无效”。

我需要什么:

当还原发生时,我想触发对另一个元素的 CSS 更改。

问题:

“revert”是参数而不是事件,所以当恢复发生时我在触发所需的 CSS 更改时遇到了很大的困难。

我的代码:

$('#peg_icon').draggable({
    revert: 'invalid',
    scroll: false,
    stack: "#peg_icon",
    drag: function(event, ui) {
        $('#peg_icon').css('background-image','url(images/peg-icon-when-dragged.png)');
    }
});

我尝试过的:

我尝试使用“revert”作为事件未成功:

revert: function(event, ui) {
    $('#peg_icon').css('background-image','url(images/peg-icon-default.png)');
},

我也尝试让 revert 参数获取此功能,但未成功:

function(socketObj)
  {
     //if false then no socket object drop occurred.
     if(socketObj === false)
     {
        //revert the peg by returning true
        $('#peg_icon').css('background-image','url(images/peg-icon-default.png)');
        return true;
     }
     else
     {
        //return false so that the peg does not revert
        return false;
     }
  }

上下文:

我正在拖动一个 div,当拖动时,背景图像会发生变化,当拖动恢复时,背景图像会恢复到原始状态。

我的问题:

当拖动发生还原时,如何触发对另一个元素的 CSS 更改?

【问题讨论】:

  • 只是想说,经过深思熟虑和沟通的问题!
  • 感谢感谢。

标签: jquery-ui revert jquery-draggable


【解决方案1】:

原来revert可以接受一个方法。有关完整示例,请参见此内容: http://jsfiddle.net/mori57/Xpscw/

具体来说:

$(function() {
    $("#ducky").draggable({
        revert: function(is_valid_drop){
            console.log("is_valid_drop = " + is_valid_drop);
            // when you're done, you need to remove the "dragging" class
            // and yes, I'm sure this can be refactored better, but I'm 
            // out of time for today! :)
            if(!is_valid_drop){
               console.log("revert triggered");
                $(".pond").addClass("green");
                $(this).removeClass("inmotion");
               return true;
            } else {
                $(".pond").removeClass("green");
                $(this).removeClass("inmotion");
            }
        },
        drag: function(){
            // as you drag, add your "dragging" class, like so:
            $(this).addClass("inmotion");
        }
    });
    $("#boat").droppable({
      drop: function( event, ui ) {
        $(this)
          .addClass("ui-state-highlight");
      }
    });
  });

希望这会有所帮助...我猜您尝试修改的内容是问题所在,而不是尝试将 revert 与函数调用一起使用。再次查看您尝试设置的 CSS,看看是否存在您的问题。

【讨论】:

  • 具体来说,我不会使用 .css() 方法,而是使用 addClass() 向您的可拖动对象添加一个类...在 CSS 中而不是在 Javascript 中更改图标,所以当你恢复时,你所要做的就是从你的可拖动对象中调用 .removeCSS('drag-indicator-class'),图像会自动恢复到默认值。
  • 感谢您提供全面的答案、代码和工作示例。 小提示:我不知道这些类可以附加到 CSS 中的 id 上,即 #some_id.some_class。这是我第一次看到这种选择器。我改为使用!important 来强制.inmotion 类覆盖默认的#peg_icon id。
  • 问题:使用 addClass/removeClass 代替 JavaScript 方法有什么好处?是否使用开/关操作而不是两个单独的操作?我最初使用 JavaScript 方法的原因主要是基于这样一种迷信,即默认和“动态”背景图像不会通过 CSS 预加载,并且 JavaScript 方法以某种方式“强制”在背景图像之间更快地切换。简而言之,这两种方法(即 CSS 与 JavaScript)是否比另一种更快地预加载或加载背景图像?
  • 优势在于灵活性,将呈现与逻辑分离。在某些时候,您可能想要重用代码,或更改使用的图像。 CSS 是这类信息所属的地方,与直接在 JS 中进行更改相比,在 CSS 中更改它不太可能无意中引入错误。我无法回答问题的预加载部分......这是我必须研究的内容,但通过 JS 强制也意味着引入更多 HTTP 请求(每次切换图像时一个),这也是低效的,而不是缓存的 css。
  • 次要注意: is_valid_drop 绝不是真的,而是成功放置时的可放置​​元素。
【解决方案2】:

你想做这样的事情:

 $('#peg_icon').draggable({
        revert: function (socketObj) {
        if (socketObj === true) {
            // success
            return false;
        }
        else {
            // reverting
            return true;
        }
    },
        scroll: false,
        stack: "#peg_icon",
        drag: function(event, ui) {
            $('#peg_icon').css('background-image','url(images/peg-icon-when-dragged.png)');
        }
    });

演示: http://jsfiddle.net/yTMwu/35/

希望这会有所帮助!

【讨论】:

  • 感谢代码和小提琴演示。出于某种原因,此代码阻止我将 #peg_icon 拖放到辅助放置区域(即拖放区域以外的放置区域)。我很欣赏我在上述问题中提供的有限上下文可能是导致此问题的原因。 旁注:你可怕的 Cage 头像让我有些受伤。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2015-10-30
相关资源
最近更新 更多