2017-09-21 6 views
2

コンテンツ編集可能なdivにスパンがあり、一度に削除する必要があります。さて、これはクロムデスクトップ上の正常に動作しますが、私は次のデバイス上でそれを削除しようとすると、これはworks.Iは、Mac、iOSの上でAndroidの上モバイルで編集可能なコンテンツのスパンの削除が機能しない

  1. クローム
  2. サファリを以下にそれをテストしていないん
  3. Firefoxの私はボックスを削除しようとすると

のWindows には焦点を当て失い、スパンは削除されません。

これは私がこれまでに試したものです。linkです。

var EditableDiv = document.getElementById('EditableDiv'); 
 

 
     EditableDiv.onkeydown = function(event) { 
 
     var ignoreKey; 
 
     var key = event.keyCode || event.charCode; 
 
     if (!window.getSelection) return; 
 
     var selection = window.getSelection(); 
 
     var focusNode = selection.focusNode, 
 
      anchorNode = selection.anchorNode; 
 

 
     var anchorOffset = selection.anchorOffset; 
 

 
     if (!anchorNode) return 
 

 
     if (anchorNode.nodeName.toLowerCase() != '#text') { 
 
      if (anchorOffset < anchorNode.childNodes.length) 
 
      anchorNode = anchorNode.childNodes[anchorOffset] 
 
      else { 
 
      while (!anchorNode.nextSibling) anchorNode = anchorNode.parentNode // this might step out of EditableDiv to "justincase" comment node 
 
      anchorNode = anchorNode.nextSibling 
 
      } 
 
      anchorOffset = 0 
 
     } 
 

 
     function backseek() { 
 

 
      while ((anchorOffset == 0) && (anchorNode != EditableDiv)) { 
 

 
      if (anchorNode.previousSibling) { 
 
       if (anchorNode.previousSibling.nodeName.toLowerCase() == '#text') { 
 
       if (anchorNode.previousSibling.nodeValue.length == 0) 
 
        anchorNode.parentNode.removeChild(anchorNode.previousSibling) 
 
       else { 
 
        anchorNode = anchorNode.previousSibling 
 
        anchorOffset = anchorNode.nodeValue.length 
 
       } 
 
       } else if ((anchorNode.previousSibling.offsetWidth == 0) && (anchorNode.previousSibling.offsetHeight == 0)) 
 
       anchorNode.parentNode.removeChild(anchorNode.previousSibling) 
 

 
       else { 
 
       anchorNode = anchorNode.previousSibling 
 

 
       while ((anchorNode.lastChild) && (anchorNode.nodeName.toUpperCase() != 'SPAN')) { 
 

 
        if ((anchorNode.lastChild.offsetWidth == 0) && (anchorNode.lastChild.offsetHeight == 0)) 
 
        anchorNode.removeChild(anchorNode.lastChild) 
 

 
        else if (anchorNode.lastChild.nodeName.toLowerCase() != '#text') 
 
        anchorNode = anchorNode.lastChild 
 

 
        else if (anchorNode.lastChild.nodeValue.length == 0) 
 
        anchorNode.removeChild(anchorNode.lastChild) 
 

 
        else { 
 
        anchorNode = anchorNode.lastChild 
 
        anchorOffset = anchorNode.nodeValue.length 
 
         //break \t \t \t \t \t \t \t //don't need to break, textnode has no children 
 
        } 
 
       } 
 
       break 
 
       } 
 
      } else 
 
       while (((anchorNode = anchorNode.parentNode) != EditableDiv) && !anchorNode.previousSibling) {} 
 
      } 
 
     } 
 

 
     if (key == 8) { //backspace 
 
      if (!selection.isCollapsed) { 
 

 
      try { 
 
       document.createElement("select").size = -1 
 
      } catch (e) { //kludge for IE when 2+ SPANs are back-to-back adjacent 
 

 
       if (anchorNode.nodeName.toUpperCase() == 'SPAN') { 
 
       backseek() 
 
       if (anchorNode.nodeName.toUpperCase() == 'SPAN') { 
 
        var k = document.createTextNode(" ") // doesn't work here between two spans. IE makes TWO EMPTY textnodes instead ! 
 
        anchorNode.parentNode.insertBefore(k, anchorNode) // this works 
 
        anchorNode.parentNode.insertBefore(anchorNode, k) // simulate "insertAfter" 
 
       } 
 
       } 
 
      } 
 

 

 
      } else { 
 
      backseek() 
 

 
      if (anchorNode == EditableDiv) 
 
       ignoreKey = true 
 

 
      else if (anchorNode.nodeName.toUpperCase() == 'SPAN') { 
 
       SelectText(event, anchorNode) 
 
       ignoreKey = true 
 
      } else if ((anchorNode.nodeName.toLowerCase() == '#text') && (anchorOffset <= 1)) { 
 

 
       var prev, anchorNodeSave = anchorNode, 
 
       anchorOffsetSave = anchorOffset 
 
       anchorOffset = 0 
 
       backseek() 
 
       if (anchorNode.nodeName.toUpperCase() == 'SPAN') prev = anchorNode 
 
       anchorNode = anchorNodeSave 
 
       anchorOffset = anchorOffsetSave 
 

 
       if (prev) { 
 
       if (anchorOffset == 0) 
 
        SelectEvent(prev) 
 

 
       else { 
 
        var r = document.createRange() 
 
        selection.removeAllRanges() 
 

 
        if (anchorNode.nodeValue.length > 1) { 
 
        r.setStart(anchorNode, 0) 
 
        selection.addRange(r) 
 
        anchorNode.deleteData(0, 1) 
 
        } 
 
        else { 
 
        for (var i = 0, p = prev.parentNode; true; i++) 
 
         if (p.childNodes[i] == prev) break 
 
        r.setStart(p, ++i) 
 
        selection.addRange(r) 
 
        anchorNode.parentNode.removeChild(anchorNode) 
 
        } 
 
       } 
 
       ignoreKey = true 
 
       } 
 
      } 
 
      } 
 
     } 
 
     if (ignoreKey) { 
 
      var evt = event || window.event; 
 
      if (evt.stopPropagation) evt.stopPropagation(); 
 
      evt.preventDefault(); 
 
      return false; 
 
     } 
 
     } 
 

 
     function SelectText(event, element) { 
 
     var range, selection; 
 
     EditableDiv.focus(); 
 
     if (window.getSelection) { 
 
      selection = window.getSelection(); 
 
      range = document.createRange(); 
 
      range.selectNode(element) 
 
      selection.removeAllRanges(); 
 
      selection.addRange(range); 
 
     } else { 
 
      range = document.body.createTextRange(); 
 
      range.moveToElementText(element); 
 
      range.select(); 
 
     } 
 
     var evt = (event) ? event : window.event; 
 
     if (evt.stopPropagation) evt.stopPropagation(); 
 
     if (evt.cancelBubble != null) evt.cancelBubble = true; 
 
     return false; 
 
     }
#EditableDiv { 
 
      height: 75px; 
 
      width: 500px; 
 
      font-family: Consolas; 
 
      font-size: 10pt; 
 
      font-weight: normal; 
 
      letter-spacing: 1px; 
 
      background-color: white; 
 
      overflow-y: scroll; 
 
      overflow-x: hidden; 
 
      border: 1px solid black; 
 
      padding: 5px; 
 
     } 
 
     #EditableDiv span { 
 
      color: brown; 
 
      font-family: Verdana; 
 
      font-size: 8.5pt; 
 
      min-width: 10px; 
 
      /*_width: 10px;*/ 
 
      /* what is this? */ 
 
     } 
 
     #EditableDiv p, 
 
     #EditableDiv br { 
 
      display: inline; 
 
     }
<div id="EditableDiv" contenteditable="true"> 
 
&nbsp;(<span contenteditable='false' onclick='SelectText(event, this);' unselectable='on'>Field1</span> < 500) <span contenteditable='false' onclick='SelectText(event, this);' unselectable='on'>OR</span> (<span contenteditable='false' onclick='SelectText(event, this);' unselectable='on'>Field2</span> > 100 <span contenteditable='false' onclick='SelectText(event, this);' unselectable='on'>AND</span> (<span contenteditable='false' onclick='SelectText(event, this);' unselectable='on'>Field3</span> <= 200)) 
 
</div>

私はこのためにJavaScriptを使用しています。 iOS上で動作するテンプレート用の流星と炎のUIを使用して、アプリケーションのためのソリューションを開発しています。

答えて

1

クリックして削除するdivにcss cursor:pointer;を入れてみてください。

時にはモバイルブラウザ、 Safariは、カーソル:ポインタを持たない限り、要素のclickイベントを許可しません。このdivがリンクまたはクリック可能であることをトリガーします。

+0

これはバックスペースでスパンを削除しますか? –

+0

それは動作しません 'cursor:pointer;'私はフィドルを更新しました。チェックしてください –

関連する問題