junkerstock
 AI解説ボタンのサンプル3 

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>選択範囲対応 AI解説 選択されない時は全文となる</title>
<style>
body { font-family: sans-serif; padding: 1em; }
.container { display: flex; flex-direction: column; gap: 10px; max-width: 600px; }

/* 動作確認用にテキストエリアとcontenteditable両方置いておきます */
textarea { width: 100%; height: 100px; padding: 8px; }
.editable-area {
width: 100%; height: 100px; border: 1px solid #767676; padding: 8px; overflow: auto; background: #fff;
}

.controls { display: flex; gap: 10px; align-items: center; background: #f0f0f0; padding: 10px; border-radius: 8px; }
select, button { padding: 8px 12px; cursor: pointer; }
button { background-color: #007bff; color: white; border: none; border-radius: 4px; }
button:hover { background-color: #0056b3; }
</style>
</head>
<body>

<h1>AI解説(選択範囲対応)</h1>
<p>文字を選択してボタンを押すと「その部分」だけ、選択しないと「全文」を解説します。</p>

<div class="container">
<textarea id="myEditor" placeholder="ここにコードを入力...">
function test() {
console.log("一部分だけ選択して試してみて!");
return true;
}
</textarea>

<div class="controls">
<select id="aiSelector">
<option value="perplexity">Perplexity (自動送信)</option>
<option value="gemini">Google Gemini</option>
<option value="chatgpt">ChatGPT</option>
<option value="claude">Claude</option>
</select>
<button onclick="askAI()">🚀 解説を聞く</button>
</div>
</div>

<script>
function askAI() {
const editor = document.getElementById('myEditor');

// --- ★ここが今回のキモとなる部分です★ ---
let targetText = "";

// 1. まず、画面上で選択されている文字(青くなっている部分)を取得
const selection = window.getSelection().toString();

if (selection.trim() !== "") {
// A. 選択範囲がある場合 → それを使う
targetText = selection;
} else {
// B. 選択範囲がない場合 → エディタの全文を使う
// (textareaなら .value, div(contenteditable)なら .innerText を取得)
targetText = editor.value || editor.innerText;
}
// ------------------------------------------

if (!targetText.trim()) {
alert("コードが入力されていません。");
return;
}

// プロンプト作成
const prompt = "以下のコードを初心者向けに日本語で解説してください:\n\n" + targetText;

// 以下、前回のAI呼び出しロジックと同じ
const aiService = document.getElementById('aiSelector').value;
const encodedPrompt = encodeURIComponent(prompt);

if (aiService === 'perplexity') {
const url = `https://www.perplexity.ai/search?q=${encodedPrompt}`;
window.open(url, '_blank');
} else {
let url = "";
switch (aiService) {
case "gemini": url = "https://gemini.google.com/app"; break;
case "chatgpt": url = "https://chatgpt.com/"; break;
case "claude": url = "https://claude.ai/new"; break;
}

if (navigator.clipboard) {
navigator.clipboard.writeText(prompt).then(() => {
const msg = (selection.trim() !== "")
? "【選択部分】をコピーしました!"
: "【全文】をコピーしました!";

const confirmOpen = confirm(msg + "\n\n" + aiService + "の画面が開いたら「貼り付け」してください。\n移動しますか?");
if (confirmOpen) {
window.open(url, '_blank');
}
});
} else {
alert("コピー機能が使えません。");
window.open(url, '_blank');
}
}
}
</script>

</body>
</html>


使用変数

aiService
askAI -------( Function )
charset
class
confirmOpen
editor
encodedPrompt
id
lang
msg
onclick
placeholder
prompt
q
selection
targetText
test -------( Function )
url
value