рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ WYSIWYG HTML рд╕рдВрдкрд╛рджрдХред рднрд╛рдЧ рей

рд▓реЗрдЦ рдореЗрдВ рдбрд┐рдЬрд╝рд╛рдЗрдирд░реЛрдб рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЧреБрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрднреНрдпрд╛рд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдкрд╛рджрдХ рд╕рдВрдкрд╛рджрдХ рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рдПрдкреАрдЖрдИред
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдкрд╣рд▓реЗ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдбрд┐рдЬрд╛рдЗрдирдореЛрдб рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдЦреЛрдЬ рдХрд░рдирд╛ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдПрдкреАрдЖрдИ: рднрд╛рдЧ 1 ред рднрд╛рдЧ реи

рдкрд░рд┐рдЪрдп

рд▓реЗрдЦ рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдбрд┐рдЬрд╝рд╛рдЗрдирдореЛрдб рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рдВрдкрд╛рджрдХ рдмрдирд╛рдиреЗ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдВрдЪ рдХреАред рдпреЗ DOM рдкреНрд░реЙрдкрд░реНрдЯреАрдЬрд╝ HTML 5 рдореЗрдВ рдорд╛рдирдХреАрдХреГрдд рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрдореЛрдмреЗрд╢ рд╕рдорд░реНрдерд┐рдд рд╣реИрдВред рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ, рдореИрдВ рдПрдХ рд╕рд░рд▓ рдХреНрд░реЙрд╕-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд╛рда рд╕рдВрдкрд╛рджрдХ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдЕрднреНрдпрд╛рд╕ рдХреА рдУрд░ рдмрдврд╝реВрдВрдЧрд╛ред
рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕рдВрдкрд╛рджрдХ рдХрд╛ рддреИрдпрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрд╕рдХрд╛ рдХреЛрдб рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рдХреЗрд╡рд▓ рдХреЛрдб рдХреЗ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рджрд┐рдЦрд╛рддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдмрд╛рдХреА рдХреЛрдб рдХреЛ рдорд╛рдирд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдмрд╛рдК рд╣реИред рдХреЛрдб рддреАрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ:

рдврд╛рдВрдЪрд╛

рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ IFrame рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЦрд╛рд▓реА рдкреГрд╖реНрда рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
<iframe id="editorFrame" src="blank.html"></iframe> 
рд╣рдо рд╢рд░реАрд░ рдХреЗ рдЕрдВрджрд░ рддрддреНрд╡реЛрдВ рдХреЗ рдмрд┐рдирд╛, рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдЦрд╛рд▓реА рдкреГрд╖реНрда рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрдкрдирд╛ "рдЦрд╛рд▓реА" рдкреГрд╖реНрда рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рд╣рдо рд╢рд░реАрд░ рдореЗрдВ рдПрдХ рдЦрд╛рд▓реА рдЕрдиреБрдЪреНрдЫреЗрдж рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХреЗрдВрдЧреЗред
 <title></title> <body><p></p></body> 
рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЛрдЬрд╝рд┐рд▓рд╛ рдЦрд╛рд▓реА рдкреА рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдп рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреА рддрд░рд╣ред рдпрджрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рд╕реАрдзреЗ рд╢рд░реАрд░ рдореЗрдВ рдкрд╛рда рджрд░реНрдЬ рдХрд░рддреА рд╣реИред ContentEditable рд╕рдВрдкрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдПрдХ рдлреНрд░реЗрдо рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди Firefox 2 contentEditable рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП iFrame рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред ( рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдзреНрдпрд╛рди рджреЗрдВ: FF2 рд╣реИ, рдЗрд╕реЗ рд╣рд▓реНрдХреЗ рдврдВрдЧ рд╕реЗ рд░рдЦрдирд╛, рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рднреА iframe рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред )

рд╕рдВрдкрд╛рджрди рдореЛрдб рд╕реЗрдЯ рдХрд░реЗрдВ

рдЬрдм рдкреГрд╖реНрда рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рдВрдкрд╛рджрди рдореЛрдб рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП (Editor.js рдореЗрдВ рд╕реНрдерд┐рдд)
 function createEditor() { var editFrame = document.getElementById("editorFrame"); editFrame.contentWindow.document.designMode="on"; } bindEvent(window, "load", createEditor); 
bindEvent рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЗрд╡реЗрдВрдЯ рдореЗрдВ рдмрд╛рдБрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ (use.js рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд)ред JQuery рдЬреИрд╕реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛ рдЪрд░рдг рдиреНрдпреВрдирддрдо рд╕реНрд╡рд░реВрдкрдг рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдмрдирд╛рдирд╛ рд╣реИред

рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖

рдЖрдЗрдП рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ: "рдмреЛрд▓реНрдб" рдмрдЯрди, рдЬреЛ рдЪрдпрдирд┐рдд рдкрд╛рда рдХреА рд╢реИрд▓реА рдХреЛ рдмреЛрд▓реНрдб рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред рдмрдЯрди рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП - рдпрджрд┐ рдкрд╛рда рдХреЗ рдЕрдВрджрд░ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдмреЛрд▓реНрдб рд╣реИ, рддреЛ рдмрдЯрди рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рддрд░реНрдХ рдХреЛ рджреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдмреАрдЪ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ, рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЪрдпрди рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдСрдмреНрдЬреЗрдХреНрдЯ, рдЬреЛ рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИред рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдХреНрд▓рд┐рдХ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдкреГрдердХреНрдХрд░рдг рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдЯреАрдореЛрдВ рдХреЛ рдПрдХ рд╣реА рддрд░реНрдХ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред рдШрдЯрдирд╛рдУрдВ рдХреЛ рджреЛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдкрд░ рдПрдХ рдмрдЯрди рджрдмрд╛рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдХ рдПрдХ рдЖрджреЗрд╢ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдХрд░реНрд╕рд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╣рдо рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдкрд░ рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреЗ рд╣реИрдВред

рдХрдорд╛рди рдФрд░ рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдЪреВрдВрдХрд┐ рдмреЛрд▓реНрдб рдХрдорд╛рдВрдб рд╢реБрд░реВ рдореЗрдВ рдПрдкреАрдЖрдИ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рд╣рдорд╛рд░реА рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд┐рд░реНрдл рдПрдХ рдЫреЛрдЯрд╛ рдЖрд╡рд░рдг рд╣реИред
 function Command(command, editDoc) { this.execute = function() { editDoc.execCommand(command, false, null); }; this.queryState = function() { return editDoc.queryCommandState(command) }; } 
рд╣рдореЗрдВ рдПрдХ рд░реИрдкрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЪреВрдБрдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рдЕрдорд╛рдирдХ рдЯреАрдореЗрдВ рдорд╛рдирдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реЛрдВред
рд╣рдорд╛рд░рд╛ рдмрдЯрди рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдкреИрди рд╣реИ:
 <span id="boldButton">Bold</span> 
рд╕реНрдкрд╛рди рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ:
 function TogglCommandController(command, elem) { this.updateUI = function() { var state = command.queryState(); elem.className = state?"active":""; } bindEvent(elem, "click", function(evt) { command.execute(); updateToolbar(); }); } 
рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдкрд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдкрд░ рд╕рдВрдкрд╛рджрди рд╡рд┐рдВрдбреЛ рджреНрд╡рд╛рд░рд╛ рдлрд╝реЛрдХрд╕ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рдХреЛрдб рдХреЛ рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдиреАрдЪреЗ рд╣рдо ToggleCommandController рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЙрдирдХреЗ рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдкрд╛рда рдХреА рд╢реИрд▓реА рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВред рдЬрдм рдПрдХ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЬрдм рдЕрдкрдбреЗрдЯрдпреВрдЖрдИ рдШрдЯрдирд╛ рдХреЛ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕реНрдкреИрди рдХреЛ "рд╕рдХреНрд░рд┐рдп" рд╡рд░реНрдЧ рдорд┐рд▓рддрд╛ рд╣реИ, рдпрд╛ рдкрд╛рда рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЗрд╕реЗ рдЦреЛ рджреЗрддрд╛ рд╣реИред рд╕реАрдПрд╕рдПрд╕ рдЧреБрдг рдЬреЛ рдмрдЯрди рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 .toolbar span { border: outset; } .toolbar span.active { border: inset; } 
рдШрдЯрдХ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ:
 var command = Command("Bold", editDoc); var elem = document.getElementById(├оboldButton); var controller = new TogglCommandController(command, elem); updateListeners.push(controller); 
UpdateListeners рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рдХрдВрдЯреНрд░реЛрд▓ рдкреИрдирд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдВрддреНрд░рдХ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдкрдбреЗрдЯрдЯреВрд▓рдмрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рд╕реВрдЪреА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯрдпреВрдЖрдИ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рднреА рдирд┐рдпрдВрддреНрд░рдг рдмрд┐рд▓реНрдХреБрд▓ рдЕрджреНрдпрддрд┐рдд рд╣реЛрдВред рд╣рдо рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЕрдкрдбреЗрдЯрдЯреВрд▓рдмрд╛рд░ рдХреЛ рд╣рд░ рдмрд╛рд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЪрдпрди рдкрд░рд┐рд╡рд░реНрддрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
 bindEvent(editDoc, "keyup", updateToolbar); bindEvent(editDoc, "mouseup", updateToolbar); 
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрдм рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддрд╛ рд╣реИ рддреЛ рдЕрдкрдбреЗрдЯрдЯреВрд▓рдмрд╛рд░ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдмрдЯрди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдкреНрд░рддреНрдпреЗрдХ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреВрд░реЗ рдХрдВрдЯреНрд░реЛрд▓ рдкреИрдирд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХреНрдпреЛрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рдЪреВрдВрдХрд┐ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдиреНрдп рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд░рд╛рдЬреНрдп рднреА рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рджрд╛рдПрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмрд╛рдПрдВ рд╕рдВрд░реЗрдЦрд┐рдд рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдХреЗрдВрджреНрд░ рдмрдЯрди рднреА рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред рд╕рднреА рд╕рдВрднрд╡ рдирд┐рд░реНрднрд░рддрд╛ рдкрд░ рдирдЬрд╝рд░ рд░рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдкреВрд░реЗ рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рд╡рд╛рд▓реА рдЯреАрдореЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИред рдкрд░рд┐рдгрд╛рдореА рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдмреЛрд▓реНрдб, рдЗрдЯреИрд▓рд┐рдХ, рдЬрд╕реНрдЯрд┐рдлрд╛рдпрд▓реЗрдЯ, рдЬрд╕реНрдЯрд┐рдлрд╝рд╛рдпрд░, рдФрд░ рдЬрд╕реНрдЯрд┐рдлрд╝рд╛рдЗрдХреЗрдВрдЯрд░ рдЯреАрдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред

рд▓рд┐рдВрдХ

рд╣рдордиреЗ рдореВрд▓ рдкрд╛рда рдкреНрд░рд╛рд░реВрдкрдг рдЖрджреЗрд╢реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд▓рд┐рдВрдХ рдкреНрд░рдмрдВрдзрди рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ createLink рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд▓рд┐рдВрдХ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЪрдпрди рд▓рд┐рдВрдХ рдХреЗ рдЕрдВрджрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдФрд░ рд╣рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдФрд░ рдЪрдпрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓рд┐рдВрдХ рдХреЗ рдЕрдВрджрд░ рдЪрдпрди рд╣реЛрдиреЗ рдкрд░ рд╣рдо рдХреИрд╕реЗ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рдо getContaining рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд┐рдЦрдХрд░ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ DOM рдЯреНрд░реА рдореЗрдВ рдЙрд╕ рддрддреНрд╡ рд╕реЗ рдЕрдзрд┐рдХ рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд░реНрд╕рд░ рд╕реНрдерд┐рдд рд╣реИ, рдЬрдм рддрдХ рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд┐рдВрдХред рдлрд╝рдВрдХреНрд╢рди рддрддреНрд╡ рдирд╣реАрдВ рдорд┐рд▓рдиреЗ рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ)ред рдпрджрд┐ рдЪрдпрди рдПрдХ рдЯреИрдЧ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ рд╣рдо рд▓рд┐рдВрдХ рдХреЗ рдЕрдВрджрд░ рд╣реИрдВред рд╣рдореЗрдВ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП URL рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдкреВрдЫрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рднреА рдЪрд╛рд╣рд┐рдПред рдПрдХ рдХреВрд▓рд░ рд╕рдВрдкрд╛рджрдХ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреИрд░-рдорд╛рдирдХ рд╕рдВрд╡рд╛рдж рдмрдирд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд┐рд░реНрдл рдорд╛рдирдХ window.promet рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЪрдпрди рд▓рд┐рдВрдХ рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рд╡рд░реНрддрдорд╛рди URL рджрд┐рдЦрд╛рдПрдВрдЧреЗ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдмрджрд▓ рд╕рдХреЗред рдЕрдиреНрдпрдерд╛, рд╣рдо рдмрд╕ http: // рдЙрдкрд╕рд░реНрдЧ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред Linkcommand рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб:
 function LinkCommand(editDoc) { var tagFilter = function(elem){ return elem.tagName=="A"; }; //(1) this.execute = function() { var a = getContaining(editWindow, tagFilter); //(2) var initialUrl = a ? a.href : "http://"; //(3) var url = window.prompt("Enter an URL:", initialUrl); if (url===null) return; //(4) if (url==="") { editDoc.execCommand("unlink", false, null); //(5) } else { editDoc.execCommand("createLink", false, url); //(6) } }; this.queryState = function() { return !!getContaining(editWindow, tagFilter); //(7) }; } 
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рддрд░реНрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
  1. рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдЦреЛрдЬрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рдХреЛрдб рдореЗрдВ рдорд╛рдорд▓реЗ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдЯреИрдЧрдирд╛рдо рд╣рдореЗрд╢рд╛ рдЕрдкрд░рдХреЗрд╕ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
  2. getContain рддрддреНрд╡ рджрд┐рдП рдЧрдП рдирд╛рдо рдХреЗ рд╕рд╛рде рддрддреНрд╡ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдЕрд╢рдХреНрдд рд╣реИред
  3. рдпрджрд┐ рдореВрд▓ рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд▓рд┐рдВрдХ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╕рдВрд╡рд╛рдж рдореЗрдВ href рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЕрдиреНрдпрдерд╛, рдпрд╣ рдПрдХ рдорд╛рдирдХ http: // рд╣реЛрдЧрд╛ред
  4. рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреНрд▓рд┐рдХ рдХреЛ рд░рджреНрдж рдХрд░рддрд╛ рд╣реИ рддреЛ рд╢реАрдШреНрд░ рд░рд┐рдЯрд░реНрди рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдХрдорд╛рдВрдб рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
  5. рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ URL рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ OK рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдВрдХ рдХреЛ рд╣рдЯрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирдХ рдЕрдирд▓рд┐рдВрдХ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  6. рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ URL рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ OK рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо createLink рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд┐рдВрдХ рдмрдирд╛рддреЗ рд╣реИрдВред (рдпрджрд┐ рд▓рд┐рдВрдХ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рддреЛ рд╣рдо URL рдХреЛ рдПрдХ рдирдП рдХреЗ рд╕рд╛рде рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ)ред
  7. рдПрдХ рдмреВрд▓рд┐рдпрди рдкреНрд░рдХрд╛рд░ рдореЗрдВ рджреЛрд╣рд░рд╛ рдирдХрд╛рд░ рдкрд░рд┐рдгрд╛рдо - рд╕рдЪ рд╣реИ рдЕрдЧрд░ рддрддреНрд╡ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдпрдерд╛ рдЭреВрда рд╣реИред
  8. рд╣рдо LinkCommand рдХреЛ рдорд╛рдирдХ ToggleCommandController рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдХрдХреНрд╖ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИ: рд╕рднреА рд╕рдорд╛рди рдирд┐рд╖реНрдкрд╛рджрди рдФрд░ рдХреНрд╡реЗрд░реАрд╕реНрдЯреНрд░реЗрдЯ рд╡рд┐рдзрд┐рдпрд╛рдБред

GetContaining

рдЪрд▓реЛ getContain рдлрд╝рдВрдХреНрд╢рди (editlib.js рдореЗрдВ рд╕реНрдерд┐рдд) рдХреЛ рджреЗрдЦреЗрдВред рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЪрдпрди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡ рдХреЗ рдЕрдВрджрд░ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ IE рдПрдкреАрдЖрдИ рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рдПрдкреАрдЖрдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдПрдХ рддрдВрддреНрд░ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рд╣рдо рдЧреЗрдЯреНрд╕рд▓реЗрдХреНрд╢рди рд╕рдВрдкрддреНрддрд┐ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рддрд░рд╣:
 var getContaining = (window.getSelection)?w3_getContaining:ie_getContaining; 
IE рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ IE рдореЗрдВ рдЪрдпрди рдПрдкреАрдЖрдИ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
 function ie_getContaining(editWindow, filter) { var selection = editWindow.document.selection; if (selection.type=="Control") { //(1) // control selection var range = selection.createRange(); if (range.length==1) { var elem = range.item(0); //(3) } else { // multiple control selection return null; //(2) } } else { var range = selection.createRange(); //(4) var elem = range.parentElement(); } return getAncestor(elem, filter); } 
рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
  1. рдЪрдпрди рд╡рд╕реНрддреБ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдпрд╛ рддреЛ "рдирд┐рдпрдВрддреНрд░рдг" рдпрд╛ "рдкрд╛рда" рд╣реИред рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рдирд┐рдпрдВрддреНрд░рдг) рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдпрд╛рдиреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ ctrl + рдХреНрд▓рд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдЖрд╕рдиреНрди рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред
  2. рд╣рдо рдХрдИ рдЪрдпрдирд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд╣реАрдВ рд╕рдВрднрд╛рд▓реЗрдВрдЧреЗ; рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдмрд╕ рдХрдорд╛рдВрдб рдХреЛ рд░рджреНрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
  3. рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЪрдпрди рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред
  4. рдпрджрд┐ рдЪрдпрди рдкрд╛рдард╛рддреНрдордХ рд╣реИ, рддреЛ рд╣рдо рдХрдВрдЯреЗрдирд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдиреНрдп рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдПрдкреАрдЖрдИ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИ:
 function w3_getContaining(editWindow, filter) { var range = editWindow.getSelection().getRangeAt(0); //(1) var container = range.commonAncestorContainer; //(2) return getAncestor(container, filter); } 
рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
  1. рдЬрдмрдХрд┐ рдПрдкреАрдЖрдИ рдХрдИ рдЪрдпрди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗрд╡рд▓ рдПрдХ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдФрд░ рдПрдХрдорд╛рддреНрд░ рд╢реНрд░реЗрдгреА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
  2. рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ рд╡рд╣ рддрддреНрд╡ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЪрдпрди рд╣реЛрддрд╛ рд╣реИред
GetAncestor рдлрд╝рдВрдХреНрд╢рди рд╕рд░рд▓ рд╣реИ - рд╣рдо рдмрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рддрдХ рдКрдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрдм рддрдХ рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдЬрдм рддрдХ рд╣рдо рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╢реАрд░реНрд╖ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдЕрд╢рдХреНрдд рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ:
 /* walks up the hierachy until an element with the tagName if found. Returns null if no element is found before BODY */ function getAncestor(elem, filter) { while (elem.tagName!="BODY") { if (filter(elem)) return elem; elem = elem.parentNode; } return null; } 

рдХрдИ рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ

рдлрд╝реЙрдиреНрдЯ рдФрд░ рдЖрдХрд╛рд░ рдЪрдпрди рдЬреИрд╕реЗ рд╕рдВрдкрд╛рджрди рддрддреНрд╡реЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдПрдХ рдмрдЯрди рдХреЗ рдмрдЬрд╛рдп рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдХрдорд╛рдВрдб рдФрд░ рдХрдВрдЯреНрд░реЛрд▓рд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рддрд╛рдХрд┐ рд╡реЗ рдХрдИ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХреЗрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдмрд╛рдЗрдирд░реА рд╕реНрдЯреЗрдЯреНрд╕ред рдпрд╣рд╛рдВ рдлрд╝реЙрдиреНрдЯ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП HTML рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 <select id="fontSelector"> <option value="">Default</option> <option value="Courier">Courier</option> <option value="Verdana">Verdana</option> <option value="Georgia">Georgia</option> </select> 
рдХрдорд╛рдВрдб рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрднреА рднреА рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдорд╛рдирдХ FontName рдХрдорд╛рдВрдб рдореЗрдВ рдПрдХ рдРрдб-рдСрди рд╣реИ:
 function ValueCommand(command, editDoc) { this.execute = function(value) { editDoc.execCommand(command, false, value); }; this.queryValue = function() { return editDoc.queryCommandValue(command) }; } 
ValueCommand рдФрд░ рдкрд╣рд▓реЗ рд╡рд░реНрдгрд┐рдд рдмрд╛рдЗрдирд░реА рд╕реНрдЯреЗрдЯ рдХрдорд╛рдВрдб рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХреНрд╡реЗрд░реАрд╡реНрдпреВ рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рд╕реЗ рдорд╛рди рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред
 function ValueSelectorController(command, elem) { this.updateUI = function() { var value = command.queryValue(); elem.value = value; } bindEvent(elem, "change", function(evt) { editWindow.focus(); command.execute(elem.value); updateToolbar(); }); } 
рдирд┐рдпрдВрддреНрд░рдХ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдореЗрдВ рдорд╛рдиреЛрдВ рдХреЛ рдХрдорд╛рдВрдб рдХреЗ рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдлрд╝реЙрдиреНрдЯ рдЖрдХрд╛рд░ рдХреА рдбреНрд░реЙрдк-рдбрд╛рдЙрди рд╕реВрдЪреА рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ - рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдлреЙрдиреНрдЯрд╕рд╛рдЗрдЬрд╝ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрд▓рдмреНрдз рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ 1 рд╕реЗ 7 рддрдХ рдЖрдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХрд╕реНрдЯрдо рдЯреАрдо

рдЕрдм рддрдХ, рд╣рдордиреЗ HTML рдореЗрдВ рдорд╛рдирдХ, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА HTML рдХреЛ рдмрджрд▓рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХреЛрдИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдорд╛рдВрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо DOM рдФрд░ рд░реЗрдВрдЬ API рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рдХрдорд╛рдВрдб рдмрдирд╛рдПрдВрдЧреЗ рдЬреЛ рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдкрд░ рдХреБрдЫ HTML рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ "рд╣реИрд▓реЛ рд╡рд░реНрд▓реНрдб" рдкрд╛рда рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдкреИрди рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдХрд┐рд╕реА рдЕрдиреНрдп HTML рдХреЛ рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ред рдХрдорд╛рдВрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
 function HelloWorldCommand() { this.execute = function() { var elem = editWindow.document.createElement("SPAN"); elem.style.backgroundColor = "red"; elem.innerHTML = "Hello world!"; overwriteWithNode(elem); } this.queryState = function() { return false; } } 
OverwriteWithNode рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЯреЛрдХрди, рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдкрд░ рдПрдХ рддрддреНрд╡ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред (рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдХреЛрдИ рдЧреИрд░-рд░рд┐рдХреНрдд рдЪрдпрди рд╣реИ, рддреЛ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред IE рдФрд░ DOM рд░реЗрдВрдЬ рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдХреЗ рдмреАрдЪ DOM рдЕрдВрддрд░ рдХреЗ рдХрд╛рд░рдг, рд╡рд┐рдзрд┐ рдХреЛ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЗрдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ DOM рд░реЗрдВрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
 function w3_overwriteWithNode(node) { var rng = editWindow.getSelection().getRangeAt(0); rng.deleteContents(); if (isTextNode(rng.startContainer)) { var refNode = rightPart(rng.startContainer, rng.startOffset) refNode.parentNode.insertBefore(node, refNode); } else { var refNode = rng.startContainer.childNodes[rng.startOffset]; rng.startContainer.insertBefore(node, refNode); } } 
range.deleteContents, рдЗрд╕рдХреЗ рдирд╛рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЪрдпрди рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЕрдЧрд░ рдпрд╣ рдкрддрд┐рдд рдирд╣реАрдВ рд╣реИред (рдпрджрд┐ рдЪрдпрди рдкрддрд┐рдд рд╣реИ, рддреЛ рдпрд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)ред DOM рд░реЗрдВрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдРрд╕реЗ рдЧреБрдг рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ DOM рдореЗрдВ рдПрдХ рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ: startContainer рд╡рд╣ рдиреЛрдб рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдСрдлрд╝рд╕реЗрдЯ рдПрдХ рдирдВрдмрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкреЗрд░реЗрдВрдЯ рдиреЛрдб рдореЗрдВ рдПрдВрдЯреНрд░реА рдкреЙрдЗрдВрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ startContainer рдПрдХ рддрддреНрд╡ рд╣реИ рдФрд░ startOffset рддреАрди рд╣реИ, рддреЛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рддрддреНрд╡ рдХреЗ рддреАрд╕рд░реЗ рдФрд░ рдЪреМрдереЗ рдмрдЪреНрдЪреЛрдВ рдХреЗ рдмреАрдЪ рд╣реИред рдпрджрд┐ startContainer рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдб рд╣реИ, рддреЛ startOffset рдХрд╛ рдЕрд░реНрде рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рд╡рд░реНрдгреЛрдВ рдореЗрдВ рдСрдлрд╕реЗрдЯ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 3 рдХреЗ рдмрд░рд╛рдмрд░ рд╕реНрдЯрд╛рд░реНрдЯрдСрдлрд╕реЗрдЯ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рддреАрд╕рд░реЗ рдФрд░ рдЪреМрдереЗ рд╡рд░реНрдг рдХреЗ рдмреАрдЪ рд╣реИред

рдПрдВрдбрдХрдВрдЯреЗрдирд░ рдФрд░ рдПрдВрдбрдСрдлрд╕реЗрдЯ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЪрдпрди рдХреЗ рдЕрдВрдд рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реИрдВред рдпрджрд┐ рдЪрдпрди рдЦрд╛рд▓реА (рдкрддрд┐рдд) рд╣реИ, рддреЛ рдЙрдирдХреЗ рдкрд╛рд╕ рд╕реНрдЯрд╛рд░реНрдЯрдСрдирдЯреЗрдирд░ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдСрдлрд╕реЗрдЯ рдХреЗ рд╕рдорд╛рди рдореВрд▓реНрдп рд╣реИред


рдпрджрд┐ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдкрд╛рда рдиреЛрдб рдХреЗ рдЕрдВрджрд░ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдЗрд╕реЗ рджреЛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╣рдо рдЙрдирдХреЗ рдмреАрдЪ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХреЗрдВред рд░рд╛рдЗрдЯрдкрд╛рд░реНрдЯ рдПрдХ рдРрд╕рд╛ рдлрдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╕рд┐рд░реНрдл рдЗрддрдирд╛ рд╣реА рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдЯреЗрдХреНрд╕реНрдЯ рдиреЛрдб рдХреЛ рджреЛ рдиреЛрдбреНрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рджрд╛рд╣рд┐рдиреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдЗрдЪреНрдЫрд┐рдд рдмрд┐рдВрджреБ рдкрд░ рдирдП рдиреЛрдбреНрд╕ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП InsertBefore рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред IE рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдереЛрдбрд╝рд╛ рдкреЗрдЪреАрджрд╛ рд╣реИред IE рдореЗрдВ, рдПрдХ рд░реЗрдВрдЬ рдСрдмреНрдЬреЗрдХреНрдЯ DOM рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдмрд┐рдВрджреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдкреЗрд╕реНрдЯрдПрдЪрдЯреАрдПрдордПрд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ, рди рдХрд┐ рдбреЛрдо рдиреЛрдб рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, IE рд░реЗрдВрдЬ API рдХреЛ DOM API рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ! рд▓реЗрдХрд┐рди рдПрдХ рдЪрд╛рд▓ рд╣реИ рдЬреЛ рд╣рдореЗрдВ DOM рдПрдкреАрдЖрдИ рдФрд░ IE рд░реЗрдВрдЬ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛: рд╣рдо DOM рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдПрдХ рдорд╛рд░реНрдХрд░ рддрддреНрд╡ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП pasteHTML рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 function ie_overwriteWithNode(node) { var range = editWindow.document.selection.createRange(); var marker = writeMarkerNode(range); marker.appendChild(node); marker.removeNode(); // removes node but not children } // writes a marker node on a range and returns the node. function writeMarkerNode(range) { var id = editWindow.document.uniqueID; var html = "<span id='" + id + "'></span>"; range.pasteHTML(html); var node = editWindow.document.getElementById(id); return node; } 
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рдорд╛рд░реНрдХрд░ рдиреЛрдб рдХреЛ рд╣рдЯрд╛ рджреЗрдВрдЧреЗред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ HTML рдХреЛрдб рдХреЛ рдЕрд╡реНрдпрд╡рд╕реНрдерд┐рдд рди рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдХрдорд╛рдВрдб рд╣реИ рдЬреЛ рдЪрдпрди рдмрд┐рдВрджреБ рдореЗрдВ рдордирдорд╛рдирд╛ HTML рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдХрдВрдЯреНрд░реЛрд▓ рдкреИрдирд▓ рдФрд░ ToggleCommandController рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдмрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ HTML рд╕рдВрдкрд╛рджрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд░реВрдкрд░реЗрдЦрд╛ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╕рдВрдкрд╛рджрдХреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреЛ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In107907/


All Articles