Suneditor: Question. How to find the location of the currently focused cursor?

Created on 29 Jun 2020  ยท  12Comments  ยท  Source: JiHong88/SunEditor

@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>
help wanted

All 12 comments

ํ˜„์žฌ ์„ ํƒ๋œ ํฌ๋งทํƒœ๊ทธ ์ฐพ๊ธฐ
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

ํ•ด๋‹น ์ด์Šˆ ๋งํฌ ๋‚จ๊ฒจ๋“œ๋ฆด๊ฒŒ์š”.

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์žˆ์œผ๋ฉด ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์–ด์„œ, ์šฐ์„  ์ œ๊ฐ€ ๋†“์นœ๋ถ€๋ถ„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค^^ ์—ฌ๋Ÿฌ๋ชจ๋กœ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

setesolutions picture setesolutions  ยท  7Comments

sirlancelot picture sirlancelot  ยท  5Comments

Saeeed-B picture Saeeed-B  ยท  7Comments

BrianJVarley picture BrianJVarley  ยท  3Comments

BuiChiBach picture BuiChiBach  ยท  6Comments