Элементы DnD нельзя сделать редактируемым содержимым

Я разрабатываю wysiwyg, DnD (Drag and Drop), текстовый редактор в html5 и javascript.

Я использую новую библиотеку html5sortable. У меня есть проблема, которая кажется нерешенной. Я хочу сделать некоторые элементы редактируемыми как DnD, так и контентом. Плагин сортировки работает, и желаемые элементы можно сортировать, но сортируемые элементы класса не редактируются.

Что мне не хватает?

<html>
<head>
    <script src="jquery-1.10.2.js"></script>
    <script src="jquery.sortable.js"></script>

    <style>
    li.sortable-placeholder {
        border: 1px dashed #CCC;
        background: none;
    }
    </style>
</head>

<body>
    <h2>Title</h2>
    <div class="sortable">
        <div contenteditable="true">Item 1</div>
        <div contenteditable="true">Item 2</div>
        <div contenteditable="true">Item 3</div>
        <div contenteditable="true">Item 4</div>
    </div>
    <div contenteditable="true">Item editable</div>

    <script>
    $('.sortable').sortable({

    }).bind('sortupdate', function(e, ui){
    });

    </script>

</body>

I try handles, but still it does not make content editable:

    <!doctype html>
<head>
    <meta charset="utf-8">
    <title>HTML5 Sortable jQuery Plugin</title>
  <link href="http://thomasf.github.io/solarized-css/solarized-light.min.css" rel="stylesheet"></link>
    <style>
        header, section {
            display: block;
        }
        #features {
            margin: auto;
            width: 460px;
            font-size: 0.9em;
        }
        .connected, .sortable, .exclude, .handles {
            margin: auto;
            padding: 0;
            width: 310px;
            -webkit-touch-callout: none;
            -webkit-user-select: none;
            -khtml-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
            user-select: none;
        }
        .sortable.grid {
            overflow: hidden;
        }
        .connected li, .sortable li, .exclude li, .handles li {
            list-style: none;
            border: 1px solid #CCC;
            background: #F6F6F6;
            font-family: "Tahoma";
            color: #1C94C4;
            margin: 5px;
            padding: 5px;
            height: 22px;
        }
        .handles span {
            cursor: move;
        }
        li.disabled {
            opacity: 0.5;
        }
        .sortable.grid li {
            line-height: 80px;
            float: left;
            width: 80px;
            height: 80px;
            text-align: center;
        }
        li.highlight {
            background: #FEE25F;
        }
        #connected {
            width: 440px;
            overflow: hidden;
            margin: auto;
        }
        .connected {
            float: left;
            width: 200px;
        }
        .connected.no2 {
            float: right;
        }
        li.sortable-placeholder {
            border: 1px dashed #CCC;
            background: none;
        }
    </style>
    <link href='http://fonts.googleapis.com/css?family=Droid+Serif' rel='stylesheet' type='text/css'>
</head>

<body>
    <section>
        <h2>Sortable List With Handles</h2>
        <ul class="handles list">
            <li contenteditable="true"><span>::</span> Item 1</li>
            <li contenteditable="true"><span>::</span> Item 2</li>
            <li contenteditable="true"><span>::</span> Item 3</li>
            <li contenteditable="true"><span>::</span> Item 4</li>
            <li contenteditable="true"><span>::</span> Item 5</li>
            <li contenteditable="true"><span>::</span> Item 6</li>
        </ul>
    </section>

    <!-- <script src="http://cdnjs.cloudflare.com/ajax/libs/zepto/1.0/zepto.min.js"></script> -->
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
    <script src="../src/html.sortable.js"></script>
    <script>
        $(function() {
            $('.handles').sortable({
                handle: 'span'
            });
        });
    </script>
</body>
</html>

person sçuçu    schedule 06.01.2015    source источник
comment
У jQueryUI была похожая проблема. Для DND они отключают выделение текста для элемента, но была опция handle, которая упростила обходной путь. Вероятно, здесь такая же проблема. Посмотрите в исходном коде.   -  person charlietfl    schedule 06.01.2015


Ответы (1)


Глядя на пример кода на html5 sortable, похоже, проблема связана с атрибутом [role]. Если вы удалите это, это будет работать, я предполагаю, что, возможно, библиотека добавляет этот атрибут?

например попробуйте запустить в консоли JavaScript:

$("li").attr("contentEditable", "true");

Затем - чтобы заставить его работать:

$("li").removeAttr("role");

Обратите внимание, что события dragstart и selectionstart неразличимы, поэтому вы не сможете выбрать редактируемый текст (он инициирует перетаскивание).

person Woody    schedule 06.01.2015
comment
Но у меня не было атрибутов роли в элементах списка, поскольку я дал код выше. - person sçuçu; 07.01.2015
comment
Можете ли вы подтвердить это, проверив элементы с помощью инструментов разработчика браузера? Попробуйте создать демо без библиотеки, у меня вроде нормально работает. - person Woody; 07.01.2015
comment
Да, ты прав. библиотека добавляет этот атрибут роли к элементам. - person sçuçu; 07.01.2015
comment
Но удаление этого не делает его редактируемым. Вы имеете в виду под своей последней строкой, что это невозможно сделать, потому что эти два события неразличимы? - person sçuçu; 07.01.2015
comment
Если вы добавите contenteditable и удалите роль, это должно сработать. Вы просто не можете выделить текст с помощью мыши. - person Woody; 07.01.2015
comment
Это не так. Я в Safari на своем Mac. - person sçuçu; 07.01.2015
comment
Хмммм, это работает в Firefox и в Chrome. Может быть, ContentEditable и Draggable просто не сочетаются в сафари. - person Woody; 07.01.2015
comment
В Safari перетаскивание работает, но контент не редактируется, с другой стороны, в Chrome перетаскивание не работает, но редактируемый контент работает. - person sçuçu; 07.01.2015
comment
мои результаты для этой скрипки; в Safari не работает DND и CE. В Chrome работает только CE. Щелчок и перетаскивание выделяет текст. - person sçuçu; 07.01.2015
comment
ну не знаю что еще посоветовать. Кажется, что текст выделяется только в том случае, если вы пытаетесь перетащить его, сделав жест перетаскивания по тексту, если вы перетащите его в другое место, это сработает. Как я уже сказал в ответе, эти два жеста в любом случае очень похожи, необычно иметь возможность редактировать что-то и перетаскивать, пока оно доступно для редактирования, может быть, отключить перетаскивание, пока оно редактируется, или что-то еще, что я могу предложить. - person Woody; 07.01.2015
comment
Возможно ли иметь перетаскиваемый div, содержащий другой div, содержащий редактируемый текст, чтобы различать область чувствительности к жестам. левая сторона внешнего div чувствительна только к перетаскиванию, а остальная часть чувствительна к редактируемому содержимому, поскольку она перекрывается с внутренним div. - person sçuçu; 07.01.2015