JavaScriptのテキストエリア内のスペルミスをどのようにして検出しますか?これに関連するイベントはありますか?スペルミスのある単語について、Chromeのスペルチェック候補にアクセスするにはどうすればよいですか?
スペルミスのある単語について、Chromeのスペルチェック候補にアクセスするにはどうすればよいですか?
私の知る限り、 できません 。より完全に答えるために、関連する問題についても言及します。
これに関連するイベントはありますか?
いいえ、また contextmenu
イベントはこの目的に役立つものを提供しません。スペルチェック情報がなく、コンテキストメニュー項目のリストを読むことができません(スペルの提案が含まれる場合があります) 。 change
イベントもスペルチェック情報を提供しません。
JavaScriptのテキストエリア内のスペルミスをどのようにして検出しますか?
これを自分でコーディングするか、サードパーティのライブラリを使用できます。このトピックにはスタックオーバーフローに関する他の質問があるか、自分で検索できます。関連するスタックオーバーフローの質問は次のとおりです。
質問は少し広範で解釈に開かれているように見えるので(特に現在の報奨金-「要件」)、私はそれを解釈する方法を説明し、プロセスのサブ質問に答えようとします(Q/Aスタイル)。
あなたは尋ねているようです:
「Google Chrome」/「Chromium」固有:
Q:ブラウザ「Google Chrome」/「Chromium」の場合スペルチェックAPIを公開javascriptを使用してやり取りします一般的なウェブページ
A:いいえ、実際はそうではありません(少なくとも望みどおりではありません)。
Chromium固有の Spellcheck API 提案 (2012年12月以降)があります。
以下にその一部を示します。
このAPIはWebプラットフォームの一部ですか?
スペルチェックがWebプラットフォームの一部になることはまずありません。
さらに重要なことは、「loadDictionary」というメソッドが1つだけあることです。
loadDictionary( myDictionaryFile // string path or URL
, dictionaryFormat // enumerated string [ "hunspell" (concatentation of .aff and .dic files)
// , "text" (plain text)
// ]
) // returns int indicating success or an error code in loading the dictionary.
ポイント? Spellcheckのバグ関連の約20〜30%がサポートされていない言語に関するものだったため、Zulu、Klingonなどのカスタム辞書の作成をコミュニティが支援します。
では、ChromeのSpellCheck API(上記)とChrome/WebkitのSpellCheck APIを混同しないようにしましょう。
ボノヒロノリ(Google Chromeのソフトウェアエンジニア) APIの提案 2011年頃と一部の 関連するバグの関係 および パッチ Chromeにあった(/まだ?).
void addSpellcheckRange( unsigned long start
, unsigned long length
, DOMStringList suggestions
// [, unsigned short options]
);
void removeSpellcheckRange(SpellcheckRange range);
使用例:
var input = document.querySelector('input');
input.addSpellcheckRange( 4
, 9
, [ 'Chrome'
, 'Firefox'
, 'Opera'
, 'Internet Explorer'
]
);
ソース:
http://html5-demos.appspot.com/static/html5-whats-new/template/index.html#42 、
http://peter.sh/experiments/spellcheck-api/ (このAPIがまだ動作する場合は、そこでライブで試すことができるはずです。)
ポイント?数日これを熟考した後、突然クリックしました:ブラウザとのカスタムスペルチェック統合-ブラウザをブロックして独自のものを提供する代わりに、ブラウザのコンテキストメニューを使用します。したがって、既存の外部スペルチェックライブラリとリンクできます。
上記の歴史的および実験的APIは明らかに、達成したいことを直接サポートすることはありませんでした。
一般:
Q: JavaScriptのテキストエリア内のスペルミスを検出する方法
A: Internet Explorerでは、次のコードスニペットにリストされているように、ActiveX経由でMicrosoft Wordに統合されたスペルチェッカーを使用できます。
function CheckText(text) {
var result = new Array;
var app = new ActiveXObject('Word.Application');
var doc = app.Documents.Add();
doc.Content = text;
for (var i = 1; i <= doc.SpellingErrors.Count; i++) {
var spellingError = doc.SpellingErrors.Item(i);
for (var j = 1; j <= spellingError.Words.Count; j++) {
var Word = spellingError.Words.Item(j);
var error = {};
error.Word = Word.Text;
error.start = Word.Start;
error.length = Word.Text.length;
error.suggestions = new Array;
var suggestions = Word.GetSpellingSuggestions();
for (var k = 1; k <= suggestions.Count; k++) {
error.suggestions.Push(suggestions.Item(k).Name);
}
result.Push(error);
}
}
return result;
}
ソース: https://lists.w3.org/Archives/Public/public-webapps/2011AprJun/0516.html
しかし、IE/ActiveX/MS-Wordはあなたが求めているものではありません。また、非常にクロスプラットフォーム/ブラウザでもありません。ローカルJavaScriptスペルチェックライブラリが残ります:
Javascriptスペルチェックメソッド
http://code.google.com/p/bjspell/
http://www.javascriptspellcheck.com/
http://ejohn.org/blog/revised-javascript-dictionary-search/
等。
それらの比較/説明は、この回答の範囲外です。
使用する辞書の形式に注意してください。
または、外部のスペルチェックAPIサービスを使用できます(サーバーがデータを処理し、AJAXを使用してデータと通信します)。
明らかにプライバシーの問題を考慮する必要があります!
報奨金-「要件」は以下を要求します:
お役に立てれば!
Chromeのスペルチェックの提案にアクセスするためのAPIはありません。また、単語の入力ミス時にネイティブに発生するイベントもありません。ただし、イベントを実装できました。
この機能のユースケースが何であるかはわかりませんが、 montanaflynnのMashApeのSpellcheck API を使用してデモを作成しました。デモはテキスト領域を監視し、ユーザーが入力を一時停止すると、テスト対象のAPIを介してテキストを送信します。 APIは、元の文字列、推奨される修正された文字列、および修正された単語と推奨される置換を含むオブジェクトを含むJSONを返します。
テキストエリアの下に提案が表示されます。候補にカーソルを合わせると、入力ミスしたWordが強調表示されます。クリックすると、入力ミスが提案に置き換えられます。
また、APIの使用にプライバシーの層を追加するために、送信する前に文字列内の単語をスクランブルするシャッフル機能も追加しました(SSLも使用します)。 APIもChromeはコンテキストベースの提案を使用しないため、シャッフルは結果を変更しません。
CodePenへのリンクは次のとおりです。 http://codepen.io/aecend/pen/rOebQq
そして、ここにコードがあります:
[〜#〜] css [〜#〜]
<style>
* {
font-family: sans-serif;
}
textarea {
margin-bottom: 10px;
width: 500px;
height: 300px;
padding: 10px;
}
.words {
width: 500px;
}
.Word {
display: inline-block;
padding: 2px 5px 1px 5px;
border-radius: 2px;
background: #00B1E6;
color: white;
margin: 2px;
cursor: pointer;
}
</style>
[〜#〜] html [〜#〜]
<textarea id="text" placeholder="Type something here..."></textarea>
<div id="words"></div>
JavaScript
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>
;(function(){
"use strict";
var words = document.getElementById("words"),
input = document.getElementById("text"),
timeout, xhr;
input.addEventListener("keyup", function(e){
if (timeout) clearTimeout(timeout);
if (!this.value.trim()) words.innerHTML = '';
timeout = setTimeout(function() {
var test_phrase = shuffle_words( input.value );
spell_check(test_phrase);
timeout = null;
}, 500);
});
function shuffle_words(inp) {
inp = inp.replace(/\s+/g, ' ');
var arr = inp.split(" "),
n = arr.length;
while (n > 0) {
var i = Math.floor(Math.random() * n--),
t = arr[n];
arr[n] = arr[i];
arr[i] = t;
}
return arr.join(' ');
}
function spell_check(text){
if (xhr) xhr.abort();
xhr = $.ajax({
url: 'https://montanaflynn-spellcheck.p.mashape.com/check/',
headers: {
'X-Mashape-Key': 'U3ogA8RAAMmshGOJkNxkTBbuYYRTp1gMAuGjsniThZuaoKIyaj',
'Accept': 'application/json'
},
data: {
'text': text
},
cache: false,
success: function(result){
xhr = null;
suggest_words(result);
}
});
}
function suggest_words(obj){
if (!obj.corrections) return;
words.innerHTML = '';
for (var key in obj.corrections) {
if (obj.corrections.hasOwnProperty(key)) {
var div = document.createElement("div");
div.className = "Word";
div.innerHTML = obj.corrections[key][0];
div.orig = key;
div.onmouseover = function() {
var start = input.value.indexOf(this.orig);
input.selectionStart = start;
input.selectionEnd = start + this.orig.length;
};
div.onmouseout = function() {
var len = input.value.length;
input.selectionStart = len;
input.selectionEnd = len;
}
div.onclick = function() {
input.value = input.value.replace(this.orig, this.innerHTML);
this.parentNode.removeChild(this);
}
words.appendChild(div);
}
}
}
})();
</script>
このデモのAJAX要求を単純化するためにjQueryのみを使用しました。これはVanilla JSで簡単に実行できます。
内部ブラウザのスペルチェックを無効にし、他のオープンソースのスペルチェックライブラリを統合できます。たとえば、 JavaScript SpellCheck です。深い統合に必要なすべてのイベントが含まれています。 APIページ を確認してください。