Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Вставка в jQuery WYSIWYG редактор HTML кода из Popup окна (https://javascript.ru/forum/jquery/23758-vstavka-v-jquery-wysiwyg-redaktor-html-koda-iz-popup-okna.html)

Amro 05.12.2011 00:55

Вставка в jQuery WYSIWYG редактор HTML кода из Popup окна
 
Начал прикручивать вот этот http://www.samclarke.com/sceditor/example/example.php редактор (SCEditor) к своему проекту. Редактор неплохой, написан на jquery поддерживает WYSIWYG BBCode режим, как раз то что мне нужно.

Столкнулся со следующей проблемой:

Мне необходимо из Popup окна в визивиг ифрайм окно этого редактора вставлять картинки и ссылки на файлы.

В самом Popup окне как можно догадаться я подгружаю данные из файлового архива моей CMS-ки. Т.е. из родительского окна, где инициализирован данный редактор, я жмакаю ссылку, открывается Popup окно, где я выбираю картинку и при клике на неё или на ссылку она должна вставляеться в родительское окно в WYSIWYG, в позицию курсора.

Набросал пример http://dym.su/sceditor/

За вставку HTML в редакторе отвечает функция:
base.wysiwygEditorInsertHtml = function (html, endHtml) {
			base.focus();

			// don't apply to code elements
			if($(getWysiwygSelectedContainerNode()).is('code') ||
				$(getWysiwygSelectedContainerNode()).parents('code').length !== 0)
				return;

			if(typeof endHtml !== "undefined")
				html = html + base.getWysiwygSelectedHtml() + endHtml;

			if (getWysiwygDoc().getSelection) {
				var range          = getWysiwygSelection();
				var htmlNode       = getWysiwygDoc().createElement('div');
				htmlNode.innerHTML = html;
				
				// A better way of inserting the HTML would be to use documentFragments 
				// however you then need to find the last inserted node to setStartAfter
				htmlNode           = htmlNode.children[0];

				range.deleteContents();
				range.insertNode(htmlNode);
				range = range.cloneRange();

				// move the cursor to the end of the insertion
				if(htmlNode.parentNode !== range.startContainer || !$.browser.opera)
					range.setStartAfter(htmlNode);
				else // this is only needed for opera
				{
					return;
					//range.setStart(htmlNode.parentNode, range.startOffset+1);
					//range.setEnd(htmlNode.parentNode, range.endOffset+1);
				}

				// change current range
				wysiwygEditor.contentWindow.getSelection().removeAllRanges();
				wysiwygEditor.contentWindow.getSelection().addRange(range);
			}
			else if (getWysiwygDoc().selection && getWysiwygDoc().selection.createRange)
				getWysiwygDoc().selection.createRange().pasteHTML(html);
			else
				base.execCommand("insertHtml", html);

			lastRange = null;
		};

но она вшита в объект и как до нее достучаться из вне я ума не представляю, понимаю, что без window.opener здесь не обойтись, но как добраться до этой функции, не инициализировав заново редактор я не знаю :(

Может есть какой способ? или нужно своебразное API к нему дописывать? Если не сложно направьте на путь истинный...


Часовой пояс GMT +3, время: 18:52.