jquery ui可拖动可排序元素到iframe中

Posted

技术标签:

【中文标题】jquery ui可拖动可排序元素到iframe中【英文标题】:jquery ui draggable sortable elements into an iframe 【发布时间】:2014-02-17 03:14:09 【问题描述】:

我在将 jquery ui 可拖动的可排序元素放入 iframe 时遇到了一些麻烦。

一些代码可以工作here

但我的情况有点不同。事实上,我想将一些单词拖到一个WYSIWYG 编辑器中,该编辑器是通过 javascript 创建一个 iframe。代码在这里:

<script type='text/javascript'>
$(document).ready(function()
    $("#input").cleditor();
    setInterval(function()
    $('.draggable').draggable(
        appendTo:'body',
        helper:'clone',
        iframeFix: true,
        revert:'invalid',
        connectToSortable:$('#w-edit').contents().find('#sortable').sortable(
            iframeFix: true,
            cursorAt:top:0,left:0 
        ),
        cursorAt:top:0,left:0 
    );
    ,1000);
); 
</script>
<body id="my-body">
<ul>
  <li class="draggable">Drag me</li>
  <li class="draggable">Drag me 2</li>
  <li class="draggable">Drag me 3</li>
</ul>
<textarea id="input" name="input"></textarea>
</body>

在线测试代码here

但是我将可排序的元素拖到创建的 iframe 中。如何走对路?谢谢。

【问题讨论】:

【参考方案1】:

更新 3

以下解决方案在Chrome Firefox and Safari 中相当稳定:

var $editor = $("#input").cleditor()[0];
var focused = false;
var isFirefox = typeof InstallTrigger !== 'undefined';
var text = '';
$('.draggable').draggable(
        appendTo:'body',
        helper:'clone',
        iframeFix: true,
        revert:'invalid',
        cursorAt:top:0,left:0 
);

$("#w-edit").droppable(
    drop: function (event, ui) 
        text = ui.draggable.text();
        if(!focused && !isFirefox)
            $editor.focus();
        else
            $editor.focused(); 
    
);

$editor.focused(function()
    if(text != '')
        $editor.execCommand('inserthtml',text, false);
        text = '';
    
    focused = true;
);

$editor.blurred(function()
    focused = false;    
);

$editor.change(function()
    if(!$('#w-edit').hasClass('ui-droppable'))
        focused = false;
        $("#w-edit").droppable(
            drop: function (event, ui) 
                text = ui.draggable.text();
                if(!focused && !isFirefox)
                    $editor.focus();
                else
                    $editor.focused();
           
        );    
    
);

http://jsfiddle.net/C3cFk/

我能找到的唯一问题是,如果您碰巧调整了窗口大小,然后将一个项目拖到它上面,这可能会有点不可预测,新拖动的项目会出现在文本区域中的哪个位置。坦率地说,我不知道如何解决这个问题,我有点筋疲力尽地试图让它发挥作用。 (主要是因为IE)

IE 问题

这在 IE 中效果不佳(在 IE 10 上测试),除非您每次单击编辑器,然后有一半的时间单词相互覆盖。 execCommand('inserthtml' 在 IE 中不能很好地工作。我修改了代码以使用 IE 支持的pasteHTMl,但仍然存在一些问题,例如,如果您单击编辑器然后拖动项目,有时它会替换所有文本。或者,如果您重新调整页面大小,然后在其上拖动更多项目,则会将项目附加到页面顶部而不是编辑器,除非您先在编辑器中单击。我不相信这个解决方案适用于IE8,还有更多的限制需要处理,而且我没有简单的方法在 IE8 上进行测试或开发,所以我将不理会它。

这是我能想到的最好的IE10

$(document).ready(function()
        var $editor = $("#input").cleditor()[0];
        var focused = false;
        var text ='';
        var temp;
        $('.draggable').draggable(
                appendTo:'body',
                helper:'clone',
                iframeFix: true,
                revert:'invalid',
                cursorAt:top:0,left:0 
        );

        $("#w-edit").droppable(
            drop: function (event, ui) 
                temp = $(this).contents().find("html body")[0];
                text = ui.draggable.text();
                if(!focused)
                    $editor.focus();
                else
                    $editor.focused(); 
            
        );

        $editor.focused(function()
            if(text != '')
                var doc = document.getElementById("w-edit").contentWindow.document;
                if (doc.selection && doc.selection.createRange) 
                    var range = doc.selection.createRange();
                    if (range.pasteHTML) 
                        range.pasteHTML(text);
                    
                
                $editor.updateTextArea();
                text = '';
            
            focused = true;
        );

        $editor.blurred(function()
            focused = false;    
        );

        $editor.change(function()
            if(!$('#w-edit').hasClass('ui-droppable'))
                $("#w-edit").droppable(
                    drop: function (event, ui) 
                        temp = $(this).contents().find("html body")[0];
                        text = ui.draggable.text();
                        if(!focused)
                            $editor.focus();
                        else
                            $editor.focused();
                   
                );  
            
        ); 
    );

所有这些类型的事情似乎很难在所有浏览器中正确处理。对于每个浏览器,我必须以不同的方式处理某些事情才能使其正常工作。

注意:

我在IE8 上测试了我之前回答中的代码(您说的代码在 IE8 中不起作用,并且文本不在光标所在的位置),它对我有用(确保您的浏览器模式和doc模式为IE8):

$(document).ready(function()
        var $editor = $("#input").cleditor()[0];
        $('.draggable').draggable(
                appendTo:'body',
                helper:'clone',
                iframeFix: true,
                revert:'invalid',
                cursorAt:top:0,left:0 
        );

        $("#w-edit").droppable(
            drop: function (event, ui) 
                console.log('drop');
                $(this).contents().find("html body").append(ui.draggable.text()+' '); 
                $editor.updateTextArea();
            
        );

        $editor.change(function()
            if(!$('#w-edit').hasClass('ui-droppable'))
                $("#w-edit").droppable(
                    drop: function (event, ui) 
                        $(this).contents().find("html body").append(ui.draggable.text()+' '); 
                        $editor.updateTextArea();
                   
                );    
            
        );
    );

【讨论】:

@Giberno 如果这不能回答您的问题,请给我反馈,以便我可以制定您可以接受的解决方案。 感谢您的更新。现在铬工作。但仍然有 2 个问题,1. 我可以在任何鼠标光标之后拖动单词,而不总是在 WYSIWYG 编辑器的末尾吗? 2.在IE的位置上效果不好。谢谢和问候。 @Giberno 我有一个关于#2 not worked well in IE position. 的问题你是说它在IE 中不起作用吗?你用的是什么版本的IE? cleditor 甚至在 IE10 中为我加载,我可以调查一下,但似乎是插件本身的问题。 @Giberno 你可以查看我的最新更新,这大概是我能做的最好的了,你想要的 Drag and drop 功能与 WYSIWYG 编辑器在寻求浏览器兼容性时很难使用. @revor,它现在可以工作了,顺便说一句,var $editor = $("#input").cleditor()[0]; 是什么意思?【参考方案2】:

这个问题的解决方案:

$("#input").cleditor();
setInterval(function()
$('.draggable').draggable(
    appendTo:'body',
    helper:'clone',
    iframeFix: true,
    revert:'invalid',
    connectToSortable:$('#w-edit').contents().find('#sortable').sortable(
        iframeFix: true,
        cursorAt:top:0,left:0 
    ),
    cursorAt:top:0,left:0 
);
,1000);
$( "#w-edit" ).droppable(
   drop: function( event, ui ) 
       $('#w-edit').val(defaultText);//defaultText is dummy parameter,here we can use anyname
    
);

【讨论】:

一个项目一旦拖动就不能再拖动了jsfiddle.net/aamir/3PAv9/8 jsfiddle.net/8Jwxv/42/-- 只需检查此链接即可。可以任意多次拖动。不受限制 @chinnu,你的代码可以将item拖入iframe,但位置混乱,item应该插入WYSIWYG编辑器写句子,而不是任何地方。如果我再次拖动它(在 iframe 部分),它将复制更多,而不是移动。

以上是关于jquery ui可拖动可排序元素到iframe中的主要内容,如果未能解决你的问题,请参考以下文章

jQuery ui 可拖动拖放到 iframe

无法为 iframe 使用可拖动的 jQuery UI

Jquery ui - 可排序:在可排序元素中按图标“句柄”拖动

jquery ui 可拖动 + 可排序助手样式

使用 jQuery UI 使可拖动元素在可放置中可排序

通过Jquery UI可拖动时应用阴影可排序