@JiHong88
How to find the location of the currently focused cursor?
ํ์ฌ ์๋ํฐ์์ 3์ค์ ์
๋ ฅํ์์ ๊ฒฝ์ฐ, 2๋ฒ์งธ ๋ผ์ธ์ ํฌ์ปค์ค ๋์ด ์์๋ ์๋ํฐ ๋ด๋ถ์์ focusing์ค์ธ ํด๋น ๋ผ์ธ์ ๋์ด๋ฅผ ๊ตฌํ ์์๋์?
(offsetTop, height ๋ฑ๋ฑ)
core๊ฐ์ฒด์ ์ ๊ทผํ๋ฉด firstElement, lastElement์ ๋ํด์ ์ ์ ์๋๋ฐ, ํ์ฌ ํฌ์ปค์ค์ค์ธ ๊ฐ์ฒด์ ๋ํ ๊ฐ์ ์ฐพ์ง ๋ชปํด ๋ฌธ์๋๋ฆฝ๋๋ค.
<p>์ฒซ๋ฒ์งธ</p>
<p>๋๋ฒ์งธ</p> <---- focus
<p>์ธ๋ฒ์งธ</p>
ํ์ฌ ์ ํ๋ ํฌ๋งทํ๊ทธ ์ฐพ๊ธฐ
getSelectedElements
ํ์ฌ ์ ํ๋ ํฌ๋งทํ๊ทธ ๋ฐ ์ปดํฌ๋ํธ ์ฐพ๊ธฐ
getSelectedElementsAndComponents
ํ
์ด๋ธ์ ์
๋ง๋ค ํฌ๋งทํ๊ทธ๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์..
๋ผ์ธ ์ญ์ ๋๋ฌธ์ด๋ฉด ์๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ ๊ฑฐ ๊ฐ๋ค์.
// ํ์ฌ ๋
ธ๋
const currentNode = core.getSelectionNode();
// ํ์ฌ ์ด๋ฏธ์ง, ํ
์ด๋ธ, ๋งํฌ ๋ฑ์ ํฌ์ปค์ค๊ฐ ์์ด์ ํธ์ง ์ปจํธ๋กค๋ฌ๊ฐ ์์๋ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ด๋ฆ , ํ์ผ ์๋ฆฌ๋จผํธ
core.currentControllerName; core.currentControllerTarget;
let f;
// ์ด๋ฏธ์ง ๋ฑ์ file component ์๋ ํฌ์ปค์ค๊ฐ ๊ฐ์ง ์์ต๋๋ค.
const fileComponentInfo = this.getFileComponent(core.currentControllerTarget);
if (!!fileComponentInfo) {
f = fileComponentInfo.component;
} else {
// ํ
์ด๋ธ ํฌํจ๋ ํ์ฌ ๋
ธ๋์ ์ต์์ ๋ผ์ธ ์ฐพ๊ธฐ
f = util.getParentElement(currentNode, function (current) {return this.isWysiwygDiv(current.parentElement)}.bind(util))
}
ํ์ฌ ์ ํ๋ ํฌ๋งทํ๊ทธ ์ฐพ๊ธฐ
getSelectedElementsํ์ฌ ์ ํ๋ ํฌ๋งทํ๊ทธ ๋ฐ ์ปดํฌ๋ํธ ์ฐพ๊ธฐ
getSelectedElementsAndComponentsํ ์ด๋ธ์ ์ ๋ง๋ค ํฌ๋งทํ๊ทธ๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์..
๋ผ์ธ ์ญ์ ๋๋ฌธ์ด๋ฉด ์๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ ๊ฑฐ ๊ฐ๋ค์.// ํ์ฌ ๋ ธ๋ const currentNode = core.getSelectionNode(); // ํ์ฌ ์ด๋ฏธ์ง, ํ ์ด๋ธ, ๋งํฌ ๋ฑ์ ํฌ์ปค์ค๊ฐ ์์ด์ ํธ์ง ์ปจํธ๋กค๋ฌ๊ฐ ์์๋ ํด๋น ํ๋ฌ๊ทธ์ธ์ ์ด๋ฆ , ํ์ผ ์๋ฆฌ๋จผํธ core.currentControllerName; core.currentControllerTarget; let f; // ์ด๋ฏธ์ง ๋ฑ์ file component ์๋ ํฌ์ปค์ค๊ฐ ๊ฐ์ง ์์ต๋๋ค. const fileComponentInfo = this.getFileComponent(core.currentControllerTarget); if (!!fileComponentInfo) { f = fileComponentInfo.component; } else { // ํ ์ด๋ธ ํฌํจ๋ ํ์ฌ ๋ ธ๋์ ์ต์์ ๋ผ์ธ ์ฐพ๊ธฐ f = util.getParentElement(currentNode, function (current) {return this.isWysiwygDiv(current.parentElement)}.bind(util)) }
๋ต, ์ฐธ๊ณ ํ๊ฒ ์ต๋๋ค. ์ถ๊ฐ๋ก ์ด๋ฏธ์ง ์ฝ์
์์ ์๋ณธํ์ผ์ด ๊ทธ๋๋ก ๋ค์ด๊ฐ ๊ณ ํ์ง์ ์ฌ์ง์ผ ๊ฒฝ์ฐ
์ฉ๋์ด ์์ฒญ ์ปค์ง๋ ์ด์๊ฐ ์์ด์ ๊ทธ๋ฐ๋ฐ, ์ด๋ฏธ์ง ์ฝ์
์ ํด์๋๋ฅผ ๋ฎ์ถฐ์ ์ฉ๋์ ์ค์ด๋ ์ต์
๋ฑ์ ํด๊ฒฐ๋ฐฉ๋ฒ์ด ์์๊น์?
ํด๋น ์ด์ ๋งํฌ ๋จ๊ฒจ๋๋ฆด๊ฒ์.
ํด๋น ์ด์ ๋งํฌ ๋จ๊ฒจ๋๋ฆด๊ฒ์.
378
์ ๋ง ๊ฐ์ฌํฉ๋๋ค. ์ด๋ฏธ์ง ๊ด๋ จํ์ฌ ์ถ๊ฐ ์ง๋ฌธ ๋๋ ค๋ ๋ ๊น์?
์ด๋ฏธ์ง๋งํฌ๋ฅผ ํตํ ์ฝ์ ์ด ์๋, ๋ก์ปฌํ์ผ์ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆด ๊ฒฝ์ฐ html์ฝ๋๊ฐ ๋งค์ฐ ๊ธธ์ด์ ธ ๋ก์ปฌ ํ์ผ ์ ๋ก๋์ ์ ํ์ผ์๋ฒ์ ์ฌ๋ฆฐํ handleImageUpload() ๋ฉ์๋์ targetImgElement.src = โ์ด๋ฏธ์ง๋งํฌโ ๋ฅผ ํตํด html์ฝ๋๋ฅผ ์ค์ด๊ณ ์ถ์ต๋๋ค.
์ฒ์๋ถํฐ ์ด๋ฏธ์ง ๋งํฌ๋ก ์ฝ์
์์๋ handleImageUpload
๋ก์ปฌ ํ์ผ ์ฝ์
์์๋ ๋ด๋ถ์ ์ผ๋ก handleImageUploadBefore-> handleImageUpload ์์๋ก ๋์ํ๋ ๊ฒ ๊ฐ์๋ฐ
๋ก์ปฌํ์ผ์ ์ฌ๋ฆฐ ๊ฒฝ์ฐ์๋ง ํ์ผ ์๋ฒ์ ์
๋ก๋ํ ๋งํฌ๋ฅผ ๋ฐ๊ฟ์ฃผ๋ ๋ฐฉ์์ ๊ตฌํํ๊ณ ์ถ์๋ฐ์.
handleImageUploadBefore์์ Files ๊ฐ์ฒด์์ ์์์ ๊ฐ์ ์ถ๊ฐํ ํ uploadHandler๋ก ๋๊ฒจ๋ handleImageUpload ์ imageInfo์๋ ํด๋น ๊ฐ์ด ์๋์ด ์ค๋๋ผ๊ณ ์. ๋ก์ปฌํ์ผ์ ์ฝ์
ํ๊ฑด์ง, ์ด๋ฏธ์ง ๋งํฌ๋ก ์ฝ์
ํ๊ฑด์ง ๊ตฌ๋ณ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์๊น์?
๋๋, ์ด ๋ฐฉ๋ฒ๋ง๊ณ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆด ๊ฒฝ์ฐ html์ฝ๋๋ฅผ ์งง๊ฒ ํ ์ ์๋ ๋ ์ข์๋ฐฉ๋ฒ์ด ์์๊น์?
+) ์ด๋ฏธ์ง๋ 2์ฅ์ด์ ํ๋ฒ์ ๋ฃ์ ์ ์๋๊ฑฐ์ฃ ?
์ด๋ฏธ์ง ๋งํฌ๋ ํ์ผ์ด ์๋๊ธฐ ๋๋ฌธ์ upload ๊ด๋ จ ํจ์๋ค์ด ํธ์ถ๋์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง๋ ์๋ฒ์ ์
๋ก๋ํ๋๊ฒ ๋ง๊ณ ๋ ๋ค๋ฅธ ์ ํ์ง๊ฐ ์๋๊ฒ ๊ฐ๋ค์.
base64 ๋ก ์ฒ๋ฆฌํ๋๊ฑด ๊ธฐ๋ณธ ์ต์
์ด์ง ์ถ์ฒ๋๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์๋๋๋ค.
"handleImageUpload" ๋ฉ์๋๋ ์๊ณ "imageUploadHandler" ๋ฅผ ๋ง์ํ์ ๊ฑฐ๋ผ๋ฉด,
์ด๊ฑด ๊ธฐ๋ณธ ์
๋ก๋ํจ์๋ฅผ ๋์ฒดํ๋ ๋ฉ์๋ ์
๋๋ค.
"imageUploadUrl" ์ต์
๋ง ์ง์ ํ๊ณ ์๋ฒ์์ ์ง์ ๋ ํฌ๋งท์ผ๋ก response ๋ฅผ ์ฃผ๋ฉด ๋ฉ๋๋ค.
์์ธํ๊ฑด README ํ์ผ์ ์ค๋ช
๋์ด ์์ต๋๋ค. https://github.com/JiHong88/SunEditor#options
+) ์ด๋ฏธ์ง๋ 2์ฅ์ด์ ํ๋ฒ์ ๋ฃ์ ์ ์๋๊ฑฐ์ฃ ?
imageMultipleFile: true ๋ก ์ค์ ํ๋ฉด ์ฌ๋ฌ์ฅ ์ ํ์ด ๊ฐ๋ฅํฉ๋๋ค.
imageUploadHandler
๋ค imageUploadUrl์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ์ด์์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทผ๋ฐ ์ api ์๋ฒ์์๋ ๋ฌด์กฐ๊ฑด ๊ถํ์ฒดํฌ๋ฅผ ํด์ผํด์ ๋งตํํ ์ฃผ์์ ํ์ผ์ ์ ์กํ ๋
Request Header์ ํ ํฐ ๊ฐ ๋ฐ Request Body์ ์ถ๊ฐ์ ์ธ ๊ฐ์ ๋ฃ๊ณ ์ถ์๋ฐ ๋ฐฉ๋ฒ์ด ์์๊น์?
"imageUploadHeader" ์ต์
์ด ์์ต๋๋ค.
Body ์ ๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฃ๋๊ฑด๊ฐ์?
"imageUploadHeader" ์ต์ ์ด ์์ต๋๋ค.
Body ์ ๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ ๋ฃ๋๊ฑด๊ฐ์?
์ฐ์ , ์ฆ์ ์ง๋ฌธ์๋ ๋น ๋ฅธ ํผ๋๋ฐฑ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
Body์๋ ํ์ฌ ๋ค๋ฅธ API๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ, ์๋ก๋ค๋ฉด ๋ก๊ธดํ ์ฌ์ฉ์์ ํด๋ํฐ๋ฒํธ๋ฅผ ๊ณตํต์ ์ผ๋ก ๋ฃ์ด์ ํด๋ํฐ๋ฒํธ๋ก ๊ตฌ๋ถํ์ฌ
ํน์ Body๋ ์ค์ ๋ฐฉ๋ฒ์ด ์๋ํด์ ์ฌ์ญค๋ดค์ต๋๋ค. ์๋ค๋ฉด API๋ฅผ ์์ ํ์ฌ ๋ค๋ฅธ๋ฐฉ๋ฒ์ ์ด์ฉํ ๋ ค๊ณ ํฉ๋๋ค.
Body ์ ๋ํ ์ค์ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
API ๋ฅผ ์์ ํ๊ฑฐ๋..
onImageUploadBefore ์์ ์ง์ ์
๋ก๋ ํ "register" ๋ฅผ ํธ์ถํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ฝ์
ํ ์ ์์ต๋๋ค.
Body ์ ๋ํ ์ค์ ๋ฐฉ๋ฒ์ ์์ต๋๋ค.
API ๋ฅผ ์์ ํ๊ฑฐ๋..
onImageUploadBefore ์์ ์ง์ ์ ๋ก๋ ํ "register" ๋ฅผ ํธ์ถํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ฝ์ ํ ์ ์์ต๋๋ค.
๋ค, Promise()์์ ํ์ผ์
๋ก๋ ์ฑ๊ณตํ then ํจ์ ๋ด๋ถ์์ core.plugins.image.register.call์ ํ์ ํ๋ผ๋ฏธํฐ ์ฝ์
ํ ํธ์ถํ์๋๋ฐ
404๊ฐ ๋ ์ ํ์ผ ๋ค์ด์ ๋ฐ์ง ๋ชปํ๋ค์. ๊ทธ ์ดํ์ ๋ค์ ๋๊ฐ์ ์ฃผ์๋กํ๋ฉด ํ์ผ ๋ค์ด์ด ์ฑ๊ณต๋๋๋ฐ ใ
ใ
๋ฑํ ์ข์ ๋ฐฉ๋ฒ์ด ์๋ ์ค๋ฅด๊ตฐ์
b4fc9980-bc45-11ea-af3f-3d75673c335a.jpg:1 GET http://dev.api0.~~~/2020/07/02/b4fc9980-bc45-11ea-af3f-3d75673c335a.jpg 404 (Not Found)
์.. ๊ทธ๋ฌ๋ฉด ์ง๊ธ ํ์ผ์ด ์
๋ก๋ ๋๊ธฐ์ ์ "register" ๊ฐํธ์ถ๋๋๊ฑฐ ๊ฐ์๋ฐ์
register ์ ์ฃผ๋url ๊ฐ๋ ํ์ธํด๋ณด์ธ์
์.. ๊ทธ๋ฌ๋ฉด ์ง๊ธ ํ์ผ์ด ์ ๋ก๋ ๋๊ธฐ์ ์ "register" ๊ฐํธ์ถ๋๋๊ฑฐ ๊ฐ์๋ฐ์
register ์ ์ฃผ๋url ๊ฐ๋ ํ์ธํด๋ณด์ธ์
then์์์ url์์ผ๋ฉด ํธ์ถํ๊ณ ์์ด์, ์ฐ์ ์ ๊ฐ ๋์น๋ถ๋ถ์ด ์๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค^^ ์ฌ๋ฌ๋ชจ๋ก ๊ฐ์ฌํฉ๋๋ค.