2017-01-13 89 views
2

我想在vue.js中創建一個具有這樣結構的編輯器。如何在vuejs/vue.js中的contenteditable true div中的span標籤中調用keypress事件?

這是代碼片段:

<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>ContentEditable problem in vue.js</title> 
 
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"> 
 
</head> 
 
<body> 
 
<div class="container"> 
 
    <div class="row"> 
 
     <div id="editor" 
 
      contenteditable="true" 
 
      class="form-control" 
 
      style="height: 200px; overflow-y: auto"> 
 
      <!-- @input="update($event,anyBlock)" if I put this inside the div tag it will call update method--> 
 

 
      <span @input="update($event,block1)"> 
 
       <!-- This update method is not getting called 
 
       If we make this span tag contenteditable true and 
 
       put it inside a contenteditable false tag(say a span tag) it will work 
 
       But It will not give you feel like an editor, so please avoid that solution.--> 
 
        {{ block1.text }} 
 
      </span> 
 
      <span @input="update($event,block2)"> 
 
       <!-- Not need to say. This has similar problem--> 
 
        {{ block1.text }} 
 
      </span> 
 
     </div> 
 
    </div> 
 
    <pre> 
 
     {{ $data }} 
 
    </pre> 
 
</div> 
 

 
</body> 
 
<script src='https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js'></script> 
 
<script> 
 
    new Vue({ 
 
     el:'.container', 
 
     data:{ 
 
      block1: { 
 
       id: '1', 
 
       type: 'text', 
 
       text: 'Edit me id :1!' 
 
      }, 
 
      block2: { 
 
       id: '2', 
 
       type: 'text', 
 
       text: 'Edit me id :2!' 
 
      } 
 
     }, 
 
     methods: { 
 
      update: function (event, block) { 
 
       console.dir(event) 
 
       if (block.id === '1') { 
 
        this.block1.text = event.target.innerText 
 
        // If you call this function from div the whole text is going to be copied inside the div. 
 
       } else { 
 
        this.block2.text = event.target.innerText 
 
       } 
 
      } 
 
     } 
 

 
    }) 
 
</script> 
 
</html>

但像往常一樣的按鍵,KEYDOWN,KEYUP事件在div,因爲它是CONTENTEDITABLE抓獲。

我不想使用

<span contenteditable="false"> 
     <span contenteditable="true"> 
       {{block1.text}} 
     </span> 
</span> 
<span contenteditable="false"> 
     <span contenteditable="true"> 
       {{block2.text}} 
     </span> 
</span> 

因爲這個塊編輯器內部的自由光標移動。

對於我的問題,最好的解決方案是什麼?

+0

你可以使用JSFiddle來證明這一點嗎?我不是很清楚問題是什麼以及你想做什麼 – anthonygore

+0

@anthonygore你是否熟悉vue js? –

+0

看起來你需要的是模型綁定到HTML標籤的內部文本/ html。我相信Vue無法實現這一點(因爲它現在就是這樣) 您可能無法以{{block1.text}}這個值開始,而是必須將其賦值(在組件加載時加載)到元素innerHTML。 –

回答

2

對不起,現在我明白你的困境更好,讓我看看,如果我能改寫這個問題:

  • 您使用的是contenteditablediv改變在運行過程中的造型爲一個準所見即所得輸入現場
  • 從子元素div燕子事件
  • 你還要留意事件從特定跨度

而現在的一些東西,我發現您在嘗試解決您的問題:

不幸的是,我沒能弄清楚Ø你正在尋找的確切答案 - 也就是說,我無法弄清楚如何從DOMNodeElementcontenteditablediv中得到一個Vue事件。我所做的卻是這種非常冒險的解決方案,我用ref觀察div的內容,然後將每行渲染爲span元素,並將其推回到div兩個事件中:blur或更改div外部的焦點,和一個特定的按鍵(元+輸入)。

你可以看到,在這裏:https://jsfiddle.net/briankung/9fpg40q0/1/

不幸的是,我不知道你要什麼了,但是這是在凌晨1點我的最好的嘗試。對不起,我不能更有幫助。

+0

謝謝你。但我真的不想使用外部庫。我已經重新格式化了我希望現在有用的問題。我會接受你的答案,你真的接近解決它。 –

相關問題