Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

JQ wysiwyg

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> JQ wysiwyg
Имя
Сообщение << Старые топики   Новые топики >>
JQ wysiwyg - 2009-05-07 14:44:19.830000   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
возникла небольшая проблемма с виз редактором на jquery
немогу придумать как решить

короче есть кнопка в нём просмотр хтмл кода
но когда на неё нажимаеш просто создаётся textarea (точнее делается видимым) в которую и суётся хтмл код.
я хочу чтоб он отображался в том же окне что и редактируемый код.. подскажите пожалуйста как это сделать
вот код яваскрипта без библиотеки
(function( $ ) { $.fn.document = function() { var element = this[0]; if ( element.nodeName.toLowerCase() == 'iframe' ) return element.contentWindow.document; /* return ( $.browser.msie ) ? document.frames[element.id].document : element.contentWindow.document // contentDocument; */ else return $(this); }; $.fn.documentSelection = function() { var element = this[0]; if ( element.contentWindow.document.selection ) return element.contentWindow.document.selection.createRange().text; else return element.contentWindow.getSelection().toString(); }; $.fn.wysiwyg = function( options ) { if ( arguments.length &gt; 0 && arguments[0].constructor == String ) { var action = arguments[0].toString(); var params = []; for ( var i = 1; i &lt; arguments.length; i++ ) params[i - 1] = arguments[i]; if ( action in Wysiwyg ) { return this.each(function() { $.data(this, 'wysiwyg') .designMode(); Wysiwyg[action].apply(this, params); }); } else return this; } var controls = {}; if ( options && options.controls ) { var controls = options.controls; delete options.controls; } var options = $.extend({ html : '&lt;'+'?xml version="1.0" encoding="UTF-8"?'+'&gt;&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"&gt;&lt;head&gt;&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&gt;STYLE_SHEET&lt;/head&gt;&lt;body&gt;INITIAL_CONTENT&lt;/body&gt;&lt;/html&gt;', css : {}, debug : false, autoSave : true, rmUnwantedBr : true, brIE : true, controls : {}, messages : {} }, options); options.messages = $.extend(true, options.messages, Wysiwyg.MSGS_EN); options.controls = $.extend(true, options.controls, Wysiwyg.TOOLBAR); for ( var control in controls ) { if ( control in options.controls ) $.extend(options.controls[control], controls[control]); else options.controls[control] = controls[control]; } // not break the chain return this.each(function() { Wysiwyg(this, options); }); }; function Wysiwyg( element, options ) { return this instanceof Wysiwyg ? this.init(element, options) : new Wysiwyg(element, options); } $.extend(Wysiwyg, { insertImage : function( szURL, attributes ) { var self = $.data(this, 'wysiwyg'); if ( self.constructor == Wysiwyg && szURL && szURL.length &gt; 0 ) { if ( attributes ) { self.editorDoc.execCommand('insertImage', false, '#jwysiwyg#'); var img = self.getElementByAttributeValue('img', 'src', '#jwysiwyg#'); if ( img ) { img.src = szURL; for ( var attribute in attributes ) { img.setAttribute(attribute, attributes[attribute]); } } } else { self.editorDoc.execCommand('insertImage', false, szURL); } } }, createLink : function( szURL ) { var self = $.data(this, 'wysiwyg'); if ( self.constructor == Wysiwyg && szURL && szURL.length &gt; 0 ) { var selection = $(self.editor).documentSelection(); if ( selection.length &gt; 0 ) { self.editorDoc.execCommand('unlink', false, []); self.editorDoc.execCommand('createLink', false, szURL); } else if ( self.options.messages.nonSelection ) alert(self.options.messages.nonSelection); } }, setContent : function( newContent ) { var self = $.data(this, 'wysiwyg'); self.setContent( newContent ); self.saveContent(); }, clear : function() { var self = $.data(this, 'wysiwyg'); self.setContent(''); self.saveContent(); }, MSGS_EN : { nonSelection : 'select the text you wish to link' }, TOOLBAR : { bold : { visible : true, tags : ['b', 'strong'], css : { fontWeight : 'bold' } }, italic : { visible : true, tags : ['i', 'em'], css : { fontStyle : 'italic' } }, strikeThrough : { visible : false, tags : ['s', 'strike'], css : { textDecoration : 'line-through' } }, underline : { visible : false, tags : ['u'], css : { textDecoration : 'underline' } }, separator00 : { visible : false, separator : true }, justifyLeft : { visible : false, css : { textAlign : 'left' } }, justifyCenter : { visible : false, tags : ['center'], css : { textAlign : 'center' } }, justifyRight : { visible : false, css : { textAlign : 'right' } }, justifyFull : { visible : false, css : { textAlign : 'justify' } }, separator01 : { visible : false, separator : true }, indent : { visible : false }, outdent : { visible : false }, separator02 : { visible : false, separator : true }, subscript : { visible : false, tags : ['sub'] }, superscript : { visible : false, tags : ['sup'] }, separator03 : { visible : false, separator : true }, undo : { visible : false }, redo : { visible : false }, separator04 : { visible : false, separator : true }, insertOrderedList : { visible : false, tags : ['ol'] }, insertUnorderedList : { visible : false, tags : ['ul'] }, insertHorizontalRule : { visible : false, tags : ['hr'] }, separator05 : { separator : true }, createLink : { visible : true, exec : function() { var selection = $(this.editor).documentSelection(); if ( selection.length &gt; 0 ) { if ( $.browser.msie ) this.editorDoc.execCommand('createLink', true, null); else { var szURL = prompt('URL', 'http://'); if ( szURL && szURL.length &gt; 0 ) { this.editorDoc.execCommand('unlink', false, []); this.editorDoc.execCommand('createLink', false, szURL); } } } else if ( this.options.messages.nonSelection ) alert(this.options.messages.nonSelection); }, tags : ['a'] }, insertImage : { visible : true, exec : function() { if ( $.browser.msie ) this.editorDoc.execCommand('insertImage', true, null); else { var szURL = prompt('URL', 'http://'); if ( szURL && szURL.length &gt; 0 ) this.editorDoc.execCommand('insertImage', false, szURL); } }, tags : ['img'] }, separator06 : { separator : true }, h1mozilla : { visible : true && $.browser.mozilla, className : 'h1', command : 'heading', arguments : ['h1'], tags : ['h1'] }, h2mozilla : { visible : true && $.browser.mozilla, className : 'h2', command : 'heading', arguments : ['h2'], tags : ['h2'] }, h3mozilla : { visible : true && $.browser.mozilla, className : 'h3', command : 'heading', arguments : ['h3'], tags : ['h3'] }, h1 : { visible : true && !( $.browser.mozilla ), className : 'h1', command : 'formatBlock', arguments : ['Heading 1'], tags : ['h1'] }, h2 : { visible : true && !( $.browser.mozilla ), className : 'h2', command : 'formatBlock', arguments : ['Heading 2'], tags : ['h2'] }, h3 : { visible : true && !( $.browser.mozilla ), className : 'h3', command : 'formatBlock', arguments : ['Heading 3'], tags : ['h3'] }, separator07 : { visible : false, separator : true }, cut : { visible : false }, copy : { visible : false }, paste : { visible : false }, separator08 : { separator : true && !( $.browser.msie ) }, increaseFontSize : { visible : true && !( $.browser.msie ), tags : ['big'] }, decreaseFontSize : { visible : true && !( $.browser.msie ), tags : ['small'] }, separator09 : { separator : true }, html : { visible : false, exec : function() { if ( this.viewHTML ) { this.setContent( $(this.original).val() ); $(this.original).hide(); } else { this.saveContent(); $(this.original).show(); } this.viewHTML = !( this.viewHTML ); } }, removeFormat : { visible : true, exec : function() { this.editorDoc.execCommand('removeFormat', false, []); this.editorDoc.execCommand('unlink', false, []); } } } }); $.extend(Wysiwyg.prototype, { original : null, options : {}, element : null, editor : null, init : function( element, options ) { var self = this; this.editor = element; this.options = options || {}; $.data(element, 'wysiwyg', this); var newX = element.width || element.clientWidth; var newY = element.height || element.clientHeight; if ( element.nodeName.toLowerCase() == 'textarea' ) { this.original = element; if ( newX == 0 && element.cols ) newX = ( element.cols * 8 ) + 21; if ( newY == 0 && element.rows ) newY = ( element.rows * 16 ) + 16; var editor = this.editor = $('&lt;iframe&gt;&lt;/iframe&gt;').css({ minHeight : ( newY - 6 ).toString() + 'px', width : ( newX - 8 ).toString() + 'px' }).attr('id', $(element).attr('id') + 'IFrame'); if ( $.browser.msie ) { this.editor .css('height', ( newY ).toString() + 'px'); /** var editor = $('&lt;span&gt;&lt;/span&gt;').css({ width : ( newX - 6 ).toString() + 'px', height : ( newY - 8 ).toString() + 'px' }).attr('id', $(element).attr('id') + 'IFrame'); editor.outerHTML = this.editor.outerHTML; */ } } var panel = this.panel = $('&lt;ul&gt;&lt;/ul&gt;').addClass('panel'); this.appendControls(); this.element = $('&lt;div&gt;&lt;/div&gt;').css({ width : ( newX &gt; 0 ) ? ( newX ).toString() + 'px' : '100%' }).addClass('wysiwyg') .append(panel) .append( $('&lt;div&gt;&lt;!-- --&gt;&lt;/div&gt;').css({ clear : 'both' }) ) .append(editor); $(element) // .css('display', 'none') .hide() .before(this.element); this.viewHTML = false; this.initialHeight = newY - 8; this.initialContent = $(element).val(); this.initFrame(); if ( this.initialContent.length == 0 ) this.setContent(''); if ( this.options.autoSave ) $('form').submit(function() { self.saveContent(); }); $('form').bind('reset', function() { self.setContent( self.initialContent ); self.saveContent(); }); }, initFrame : function() { var self = this; var style = ''; /** * @link http://code.google.com/p/jwysiwyg/issues/detail?id=14 */ if ( this.options.css && this.options.css.constructor == String ) style = '&lt;link rel="stylesheet" type="text/css" media="screen" href="' + this.options.css + '" /&gt;'; this.editorDoc = $(this.editor).document(); this.editorDoc_designMode = false; try { this.editorDoc.designMode = 'on'; this.editorDoc_designMode = true; } catch ( e ) { // Will fail on Gecko if the editor is placed in an hidden container element // The design mode will be set ones the editor is focused $(this.editorDoc).focus(function() { self.designMode(); }); } this.editorDoc.open(); this.editorDoc.write( this.options.html .replace(/INITIAL_CONTENT/, this.initialContent) .replace(/STYLE_SHEET/, style) ); this.editorDoc.close(); this.editorDoc.contentEditable = 'true'; if ( $.browser.msie ) { /** * Remove the horrible border it has on IE. */ setTimeout(function() { $(self.editorDoc.body).css('border', 'none'); }, 0); } $(this.editorDoc).click(function( event ) { self.checkTargets( event.target ? event.target : event.srcElement); }); $(this.original).focus(function() { $(self.editorDoc.body).focus(); }); if ( this.options.autoSave ) { $(this.editorDoc).keydown(function() { self.saveContent(); }) .keyup(function() { self.saveContent(); }) .mousedown(function() { self.saveContent(); }); } if ( this.options.css ) { setTimeout(function() { if ( self.options.css.constructor == String ) { } else $(self.editorDoc).find('body').css(self.options.css); }, 0); } $(this.editorDoc).keydown(function( event ) { if ( $.browser.msie && self.options.brIE && event.keyCode == 13 ) { var rng = self.getRange(); rng.pasteHTML('&lt;br /&gt;'); rng.collapse(false); rng.select(); return false; } }); }, designMode : function() { if ( !( this.editorDoc_designMode ) ) { try { this.editorDoc.designMode = 'on'; this.editorDoc_designMode = true; } catch ( e ) {} } }, getSelection : function() { return ( window.getSelection ) ? window.getSelection() : document.selection; }, getRange : function() { var selection = this.getSelection(); if ( !( selection ) ) return null; return ( selection.rangeCount &gt; 0 ) ? selection.getRangeAt(0) : selection.createRange(); }, getContent : function() { return $( $(this.editor).document() ).find('body').html(); }, setContent : function( newContent ) { $( $(this.editor).document() ).find('body').html(newContent); }, saveContent : function() { if ( this.original ) { var content = this.getContent(); if ( this.options.rmUnwantedBr ) content = ( content.substr(-4) == '&lt;br&gt;' ) ? content.substr(0, content.length - 4) : content; $(this.original).val(content); } }, appendMenu : function( cmd, args, className, fn ) { var self = this; var args = args || []; $('&lt;li&gt;&lt;/li&gt;').append( $('&lt;a&gt;&lt;!-- --&gt;&lt;/a&gt;').addClass(className || cmd) ).mousedown(function() { if ( fn ) fn.apply(self); else self.editorDoc.execCommand(cmd, false, args); if ( self.options.autoSave ) self.saveContent(); }).appendTo( this.panel ); }, appendMenuSeparator : function() { $('&lt;li class="separator"&gt;&lt;/li&gt;').appendTo( this.panel ); }, appendControls : function() { for ( var name in this.options.controls ) { var control = this.options.controls[name]; if ( control.separator ) { if ( control.visible !== false ) this.appendMenuSeparator(); } else if ( control.visible ) { this.appendMenu( control.command || name, control.arguments || [], control.className || control.command || name || 'empty', control.exec ); } } }, checkTargets : function( element ) { for ( var name in this.options.controls ) { var control = this.options.controls[name]; var className = control.className || control.command || name || 'empty'; $('.' + className, this.panel).removeClass('active'); if ( control.tags ) { var elm = element; do { if ( elm.nodeType != 1 ) break; if ( $.inArray(elm.tagName.toLowerCase(), control.tags) != -1 ) $('.' + className, this.panel).addClass('active'); } while ( elm = elm.parentNode ); } if ( control.css ) { var elm = $(element); do { if ( elm[0].nodeType != 1 ) break; for ( var cssProperty in control.css ) if ( elm.css(cssProperty).toString().toLowerCase() == control.css[cssProperty] ) $('.' + className, this.panel).addClass('active'); } while ( elm = elm.parent() ); } } }, getElementByAttributeValue : function( tagName, attributeName, attributeValue ) { var elements = this.editorDoc.getElementsByTagName(tagName); for ( var i = 0; i &lt; elements.length; i++ ) { var value = elements[i].getAttribute(attributeName); if ( $.browser.msie ) { value = value.substr(value.length - attributeValue.length); } if ( value == attributeValue ) return elements[i]; } return false; } }); })(jQuery);
полный скрипт скачать тут http://codeismy.name/download/dialog+wysiwyg.zip
Post #: 1
RE: JQ wysiwyg - 2009-05-08 17:14:24.556666   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
вот изменил кусок
html : { visible : false, exec : function() { if ( this.viewHTML ) { this.setContent( $(this.original).val() ); $(this.original).hide(); document.getElementById("wysiwygIFrame").style.display="inline"; } else { this.saveContent(); $(this.original).show(); document.getElementById("wysiwygIFrame").style.display="none"; } this.viewHTML = !( this.viewHTML ); } },
но блин решение не оптимальное… теперь немогу идшник рэндомный назначить .. а в жквери не силён….
может кто придумает более оптимальное решение?
Post #: 2
RE: JQ wysiwyg - 2009-05-08 17:29:54.936666   
Cep}|{

Сообщений: 1396
Оценки: 0
Присоединился: 2007-06-26 01:11:51.416666
А другой редактор заюзать ?
Post #: 3
RE: JQ wysiwyg - 2009-05-08 22:54:49.860000   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
а засчем?
у меня фрэймворк в любом раскладе используется ещё для других целей.. и сам виз редактор очень маленький по объёму и тем более он меня вполне устраивает даже в таком виде… просто нет предела совершенству :)
Post #: 4
RE: JQ wysiwyg - 2009-05-10 13:43:05.200000   
Agent Smith

Сообщений: 976
Оценки: 0
Присоединился: 2007-04-10 21:56:49.593333
Я не совсем вопрос, возможно, это связано с тем, что он не совсем правильно сформулирован.  Jquery - очень простой фреймворк. Когда я начинал с ним работать, то мне тоже казалось все очень сложным, но, когда я почитал документацию на официальном сайте и нашел пару ярких примеров, то мне стало все понятно. Советую и вам почитать  jquery.com
Кстати идея с новым редактором не так уж и плоха.
Post #: 5
RE: JQ wysiwyg - 2009-05-10 14:04:05.620000   
magistr_bender

Сообщений: 977
Оценки: 0
Присоединился: 2008-02-22 20:10:21.133333
почитал, действительно оказалось всё гораздо проще чем я думал :)
но немного не разобрался с конструктором.. но думаю разберусь на прктике..

а вообще класный цусицуг получился бы если его доработать :) собственно чем и занимаюсь :) главное что очень маленький по колическтву кода… в данный момент если почистить немного то выходит 13к символов.. по сравнению с другими аналогами это вообще мизер :)
так что буду дорабатывать )
Post #: 6
Страниц:  [1]
Все форумы >> [Веб-программинг] >> JQ wysiwyg







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.