【问题标题】:jquery ui draggable sortable elements into an iframejquery ui可拖动可排序元素到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 中。如何走对路?谢谢。

【问题讨论】:

    标签: jquery jquery-ui iframe draggable jquery-ui-sortable


    【解决方案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 部分),它将复制更多,而不是移动。
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    • 2012-01-23
    • 2012-06-27
    • 1970-01-01
    • 2014-01-25
    • 2011-07-25
    相关资源
    最近更新 更多