2016-04-23 13 views
0

テキストボックスで編集したいテキストが入っているウェブページにキャンバス要素があります。キャンバスのテキストは「これはリンゴですが」後で変更したいこのテキストは、このような "アップルは私には好きではない"このことは、javascriptまたはjQueryを使ったテキストボックスのキーアップイベントを介して行う必要があります。私にいくつかの提案をお願いします。ページの読み込み後にキャンバスのテキストを更新する

<!DOCTYPE html> 
 
<html> 
 
<body> 
 

 
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;"> 
 
Your browser does not support the HTML5 canvas tag.</canvas> 
 

 
<script> 
 

 
var c = document.getElementById("myCanvas"); 
 
var ctx = c.getContext("2d"); 
 

 
ctx.font = "20px Georgia"; 
 
ctx.fillText("This is a apple", 10, 50); 
 

 
ctx.font = "30px Verdana"; 
 
// Create gradient 
 
var gradient = ctx.createLinearGradient(0, 0, c.width, 0); 
 
gradient.addColorStop("0", "magenta"); 
 
gradient.addColorStop("0.5", "blue"); 
 
gradient.addColorStop("1.0", "red"); 
 
// Fill with gradient 
 
ctx.fillStyle = gradient; 
 
ctx.fillText("Big smile!", 10, 90); 
 

 
</script> 
 
    <input id="sourceText1" type=text> 
 
</body> 
 
</html>

私は、テキストボックスでテキストを変更したいです。

+0

は、いくつかのコードを教えてください。 – hindmost

+0

私はロードしています。 –

+0

あなたは** minimal **と** verifiable **の例で質問を更新します。 – evolutionxbox

答えて

1

ここに、あなたの現在の例で動作するコードがあります。しかし、ひどく欠陥があります - 私はそれを非常に明確にしたいと思います。

0)テキストを適切に覆うために消去矩形を得るには、4ピクセルを追加する必要がありました。なぜこれが必要なのかわからない、またはこれをクエリ/計算する方法 - イメージエディタを使用しました。あなたのテキストのサイズが違っていたら、私は4よりも異なる「マジックナンバー」を使う必要があると思います。

1)バックグラウンドが白でない場合、あなたは単色ではなく模様を持っています。

2)キーストロークごとにテキスト全体が消去され、再描画されます。理想的に言えば、必要な場合にのみクリアしてください。つまり、テキストが長くなり、新しい文字が新しい文字まで同じであれば、消去するものは何もありません。

3)コードの脆弱性をさらに調べるには、あまりにも疲れました。

4)実際に私は約99.9999999%の確かにこの種のタスクを実行するコードを見つけることができます。これははるかに堅牢で、プロダクション対応のコードです。

このコードは、「動作するハック」にすぎません。私がそれを単にコメントとして投稿できるのであれば、私はそうするでしょう。

おそらく、より良い選択肢は、白を色として使用して再度テキストを描画することです。ただし、アンチエイリアシングのためにこれがうまくいかないと感じていますが、これは微妙なアウトラインを残します。既存のテキストを適切にカバーする。

コードが適切でない場合は、領収書とともに返却していただき、全額返金してください。 :笑:言っ

、ここに行く:

<!DOCTYPE html> 
<html> 
<head> 
<script> 
function byId(id){return document.getElementById(id);} 

window.addEventListener('load', onDocLoaded, false); 

var textPosX = 10, textPosY = 50; 
var defaultText = "This is a apple"; 
var curText = defaultText; 
var defaultFont = "20px Georgia"; 

function onDocLoaded(evt) 
{ 
    // add event listener to the input element, this will fire any time (text) input is received 
    byId('sourceText1').addEventListener('input', onSourceTextInput, false); 

    var c = byId("myCanvas"); 
    var ctx = c.getContext("2d"); 

    ctx.font = defaultFont; 
    ctx.fillText(defaultText, textPosX, textPosY); 

    ctx.font = "30px Verdana"; 
    // Create gradient 
    var gradient = ctx.createLinearGradient(0, 0, c.width, 0); 
    gradient.addColorStop("0", "magenta"); 
    gradient.addColorStop("0.5", "blue"); 
    gradient.addColorStop("1.0", "red"); 
    // Fill with gradient 
    ctx.fillStyle = gradient; 
    ctx.fillText("Big smile!", 10, 90); 
} 

function onSourceTextInput(evt) 
{ 
    var can = byId('myCanvas'); 
    var ctx = can.getContext('2d'); 
    var curTextWidth, curTextHeight; 

    curTextWidth = ctx.measureText(curText).width; 
    curTextHeight = 20; 

    var curStyle = ctx.fillStyle; 
    ctx.fillStyle = "white"; 
    ctx.fillRect(textPosX, (textPosY-curTextHeight)+4, curTextWidth, curTextHeight); 
    ctx.fillStyle = 'BLACK'; 
    ctx.font = defaultFont; 
    ctx.fillText(this.value, textPosX, textPosY); 
    ctx.fillStyle = curStyle; 

    curText = this.value; 
} 
</script> 
</head> 
<body> 
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">Your browser does not support the HTML5 canvas tag.</canvas> 
<input id="sourceText1" type='text'/> 
</body> 
</html> 
+0

あなたの助けてくれてありがとう、私はfirbugやchromeの開発ツールで遊ぶことができるように私のキャンバス要素をデバッグする方法を知りたい。キャンバスの子要素を確認する拡張機能はありますか? –

+0

@Developer_world - キャンバスに子要素を入れることはできません。デバッグするものは何もありません。キャンバスの仕組みは、個々の(ブラウザ)ベンダーの実装に依存します。あなたができる唯一のことは、ブラウザがcanvas要素をサポートしていない場合にフォールバックテキストを表示することです。 :一口: – enhzflep

関連する問題