BX9054: 各浏览器对 document.execCommand 方法的首参数可选值范围存在差异

标准参考

无。

问题描述

execCommand 方法通常用于控制可编辑的 IFRAME 内容,制作富文本编辑器。 但他现在为止还是非标准的,方法的首参数 Commmands 的可选值由各个浏览器厂商制定,支持程度并不统一。

造成的影响

使用仅有某个浏览器支持的 Commmands 参数会造成其他浏览器运行时脚本出错,从而影响其他浏览器内正常脚本继续执行。

受影响的浏览器

所有浏览器 

问题分析

document.execCommand 方法提供了对浏览器内置命令调用的接口,他暂时不属于任何现行规范定义范围,由浏览器各自实现。

在现有 HTML5 规范草案中,已经加入对 execCommand 方法的描述,他被安置在 HTMLDocument 接口定义中。该方法执行参数:document.execCommand(commandId [, showUI [, value ] ] )

通常 document.execCommand 方法可以使脚本程序执行在当前选择或在当前插入符位置进行一系列操作。一般来说,这些命令主要都是是用来实现富文本编辑器的核心功能。

execCommand 方法的参数 commandId 可选值以及作用,在 HTML5 规范草案中有部分描述,并定义了核心的可选参数列表,以及最后说明的自定义其他参数 vendorID-customCommandID 可由厂商自行扩展。详细内容可以参考 :7.11 Editing APIs

另外在各浏览器对应的开发者站点 msdn.microsoft.com (MSDN)、developer.mozilla.org (Mozilla Developer Network)、developer.apple.com (Apple Developer)、dev.opera.com (Opera Developer Community) 中,MSDN 与 Mozilla Developer Network 均有详细的 execCommand 方法的首参数可选值描述,Opera Developer Community 有简要说明, Apple Developer 无任何可查资料。

其中详细内容可参考开发者站点:

MSDN:execCommand MethodCommand Identifiers

MDC:Rich-Text Editing in Mozilla

dev.opera.com :Rich HTML editing in the browser: part 1Rich HTML editing in the browser: part 2

这里需要注意,由于 HTML5 规范草案与各浏览器具体开发文档中对,execCommand 方法的首形参数的形参名称规定不相同,为了避免混淆,本文以后均采用 sCommands 来表示。

MSDN MDC HTML5 草案中提出的全部 sCommands 参数,如下表:

MSDN MDC HTML5 草案 2
2D-Position  
AbsolutePosition  
BackColorbackColor 
BlockDirLTR1  
BlockDirRTL1  
Boldboldbold
BrowseMode1  
ClearAuthenticationCache  
 contentReadOnly 
Copycopy 
CreateBookmark  
CreateLinkcreateLinkcreateLink
Cutcut 
 decreaseFontSize 
Deletedeletedelete
DirLTR1  
DirRTL1  
EditMode1  
FontNamefontName 
FontSizefontSize 
ForeColorforeColor 
FormatBlockformatBlockformatBlock
 enableInlineTableEditing 
 enableObjectResizing 
  forwardDelete
 heading 
 hiliteColor 
 increaseFontSize 
Indentindent 
InlineDirLTR1  
InlineDirRTL1  
InsertButton  
InsertFieldset  
InsertIFrame  
InsertInputButton  
InsertInputCheckbox  
InsertInputFileUpload  
InsertInputHidden  
InsertInputImage  
InsertInputPassword  
InsertInputRadio  
InsertInputReset  
InsertInputSubmit  
InsertInputText  
InsertMarquee  
 insertBrOnReturn 
InsertHorizontalRuleinsertHorizontalRule 
InsertImageinsertImageinsertImage
 insertHTMLinsertHTML
  insertLineBreak
 insertOrderedListinsertOrderedList
InsertUnorderedListinsertUnorderedListinsertUnorderedList
InsertParagraphinsertParagraphinsertParagraph
InsertSelectDropdown  
InsertSelectListbox  
InsertTextArea  
  insertText
Italicitalicitalic
JustifyCenterjustifyCenter 
JustifyLeftjustifyLeft 
JustifyRightjustifyRight 
JustifyFull1  
JustifyNone1  
LiveResize  
MultipleSelection  
Open1  
OverWrite  
Outdentoutdent 
Pastepaste 
PlayImage1  
Print  
Redo1redoredo
RemoveFormatremoveFormat 
Refresh  
RemoveParaFormat1  
SelectAllselectAllselectAll
SaveAs  
SizeToControl1  
SizeToControlHeight1  
SizeToControlWidth1  
Stop1  
StopImage1  
StrikeThrough1strikeThrough 
Subscript1subscriptsubscript
Superscript1superscriptsuperscript
UnBookmark  
Underlineunderline 
Undoundoundo
Unlinkunlinkunlink
 useCSS 
Unselect unselect
 styleWithCSS 

【注1】:MSDN 中标注为不支持的 sCommands 参数。

【注2】:仅为文章写作时期 HTML5 草案中存在的 sCommands 参数,不含说明中由厂商具体指定部分。

将所有 sCommands 参数汇集起来,构建测试用例,检查他们被支持程度。由于本例代码较多,故不在文中贴出,您可以直接观看下方的 测试页面

根据测试页,得出实际 sCommands 可选参数支持度对照表:

sCommands IE6 IE7 IE8 Firefox Chrome Safari Opera
2D-PositionYYYNNNN
absolutePositionYYYNNNN
backColorYYYYYYY
blockDirLTRYYYNNNN
blockDirRTLYYYNNNN
boldYYYYYYY
browseModeYYYNNNN
clearAuthenticationCacheYYYNNNN
contentReadOnlyNNNYNNY
copyYYYNNNN
createBookmarkYYYNNNN
createLinkYYYYYYY
cutYYYNNNN
decreaseFontSizeNNNYNNY
deleteYYYYYYY
dirLTRYYYNNNN
dirRTLYYYNNNN
editModeYYYNNNN
fontNameYYYYYYY
fontSizeYYYYYYY
foreColorYYYYYYY
formatBlock1YYYYYYY
enableInlineTableEditingNNNYNNN
enableObjectResizingNNNYNNN
forwardDeleteNNNNYYN
headingNNNYNNN
increaseFontSizeNNNYNNY
indentYYYYYYY
inlineDirLTRNNNNNNN
inlineDirRTLNNNNNNN
insertButtonYYYNNNN
insertFieldsetYYYNNNN
insertIFrameYYYNNNN
insertInputButtonYYYNNNN
insertInputCheckboxYYYNNNN
insertInputFileUploadYYYNNNN
insertInputHiddenYYYNNNN
insertInputImageYYYNNNN
insertInputPasswordYYYNNNN
insertInputRadioYYYNNNN
insertInputResetYYYNNNN
insertInputSubmitYYYNNNN
insertInputTextYYYNNNN
insertMarqueeYYYNNNN
insertBrOnReturnNNNYNNN
insertHorizontalRuleYYYYYYY
insertImageYYYYYYY
insertHTMLNNNYYYY
insertLineBreakNNNNYYN
insertOrderedListYYYYYYY
insertUnorderedListYYYYYYY
insertParagraphYYYYYYY
insertSelectDropdownYYYNNNN
insertSelectListboxYYYNNNN
insertTextAreaYYYNNNN
insertTextNNNNYYN
italicYYYYYYY
justifyCenterYYYYYYY
justifyLeftYYYYYYY
justifyRightYYYYYYY
justifyFullYYYYYYY
justifyNoneYYYNYYN
liveResizeYYYNNNN
multipleSelection1YYYNNNN
openYYYNNNN
overWriteYYYNNNN
outdentYYYYYYY
pasteYYYNNNN
playImageNNNNNNN
printYYYNYYN
redoYYYYNNY
removeFormatYYYYYYY
refreshYYYNNNN
removeParaFormatNNNNNNN
selectAllYYYYYYY
saveAsYYYNNNN
sizeToControlNNNNNNN
sizeToControlHeightNNNNNNN
sizeToControlWidthYNYNNNN
stopYYYNNNN
stopImageNNNNNNN
strikeThroughYYYYYYY
subscriptYYYYYYY
superscriptYYYYYYY
unBookmarkYYYNNNN
underlineYYYYYYY
undoYYYYNNY
unlinkYYYYYYY
useCSSNNNYNNY
hiliteColorNNNYYYY
unselectYYYNYYY
styleWithCSSNNNYNNY

【注】:formatBlock 指令可接收的 vValue 值不同,IE 中需要 vValue 值为目标块标记名,而其他浏览器可以接收空字符串。
multipleSelection 指令在 Windows XP sp3 中可构建出多选列表,Windows 7 中指令只会返回 TRUE,对代码结构不会有任何改变。

解决方案

在调用 execCommand 方法时建议仅从以下参数中选择其一作为首参数传入,他们均被所有浏览器支持:

backColor设置或获取当前选中区的背景颜色。
bold切换当前选中区的粗体显示与否。
createLink在当前选中区上插入超级链接,或显示一个对话框允许用户指定要为当前选中区插入的超级链接的URL。
delete删除当前选中区。
fontSize设置或获取当前选中区的字体大小。
foreColor设置或获取当前选中区的前景(文本)颜色。
formatBlock设置当前块格式化标签。
indent增加选中文本的缩进。
insertHorizontalRule用水平线覆盖当前选中区。
insertImage用图像覆盖当前选中区。
insertOrderedList切换当前选中区是编号列表还是常规格式化块。
insertUnorderedList切换当前选中区是项目符号列表还是常规格式化块。
insertParagraph用换行覆盖当前选中区。
italic切换当前选中区斜体显示与否。
justifyCenter将当前选中区在所在格式化块置中。
justifyLeft将当前选中区所在格式化块左对齐。
justifyRight将当前选中区所在格式化块右对齐。
justifyFull目前尚未支持。
outdent减少选中区所在格式化块的缩进。
removeFormat从当前选中区中删除格式化标签。
selectAll选中整个文档。
strikeThrough目前尚未支持。
subscript目前尚未支持。
superscript目前尚未支持。
underline切换当前选中区的下划线显示与否。
unlink从当前选中区中删除全部超级链接。


附1:

execCommand() 参数描述

commanddesc
2D-Position允许通过拖曳移动绝对定位的对象。
AbsolutePosition设定元素的position属性为“absolute”(绝对)。
BackColor设置或获取当前选中区的背景颜色。
BlockDirLTR目前尚未支持。
BlockDirRTL目前尚未支持。
Bold切换当前选中区的粗体显示与否。
BrowseMode目前尚未支持。
Copy将当前选中区复制到剪贴板。
CreateBookmark创建一个书签锚或获取当前选中区或插入点的书签锚的名称。
CreateLink在当前选中区上插入超级链接,或显示一个对话框允许用户指定要为当前选中区插入的超级链接的URL。
Cut将当前选中区复制到剪贴板并删除之。
Delete删除当前选中区。
DirLTR目前尚未支持。
DirRTL目前尚未支持。
EditMode目前尚未支持。
FontName设置或获取当前选中区的字体。
FontSize设置或获取当前选中区的字体大小。
ForeColor设置或获取当前选中区的前景(文本)颜色。
FormatBlock设置当前块格式化标签。
Indent增加选中文本的缩进。
InlineDirLTR目前尚未支持。
InlineDirRTL目前尚未支持。
InsertButton用按钮控件覆盖当前选中区。
InsertFieldset用方框覆盖当前选中区。
InsertHorizontalRule用水平线覆盖当前选中区。
InsertIFrame用内嵌框架覆盖当前选中区。
InsertImage用图像覆盖当前选中区。
InsertInputButton用按钮控件覆盖当前选中区。
InsertInputCheckbox用复选框控件覆盖当前选中区。
InsertInputFileUpload用文件上载控件覆盖当前选中区。
InsertInputHidden插入隐藏控件覆盖当前选中区。
InsertInputImage用图像控件覆盖当前选中区。
InsertInputPassword用密码控件覆盖当前选中区。
InsertInputRadio用单选钮控件覆盖当前选中区。
InsertInputReset用重置控件覆盖当前选中区。
InsertInputSubmit用提交控件覆盖当前选中区。
InsertInputText用文本控件覆盖当前选中区。
InsertMarquee用空字幕覆盖当前选中区。
InsertOrderedList切换当前选中区是编号列表还是常规格式化块。
InsertParagraph用换行覆盖当前选中区。
InsertSelectDropdown用下拉框控件覆盖当前选中区。
InsertSelectListbox用列表框控件覆盖当前选中区。
InsertTextArea用多行文本输入控件覆盖当前选中区。
InsertUnorderedList切换当前选中区是项目符号列表还是常规格式化块。
Italic切换当前选中区斜体显示与否。
JustifyCenter将当前选中区在所在格式化块置中。
JustifyFull目前尚未支持。
JustifyLeft将当前选中区所在格式化块左对齐。
JustifyNone目前尚未支持。
JustifyRight将当前选中区所在格式化块右对齐。
LiveResize迫使MSHTML编辑器在缩放或移动过程中持续更新元素外观,而不是只在移动或缩放完成后更新。
MultipleSelection允许当用户按住Shift或Ctrl键时一次选中多于一个站点可选元素。
Open目前尚未支持。
Outdent减少选中区所在格式化块的缩进。
OverWrite切换文本状态的插入和覆盖。
Paste用剪贴板内容覆盖当前选中区。
PlayImage目前尚未支持。
Print打开打印对话框以便用户可以打印当前页。
Redo目前尚未支持。
Refresh刷新当前文档。
RemoveFormat从当前选中区中删除格式化标签。
RemoveParaFormat目前尚未支持。
SaveAs将当前Web页面保存为文件。
SelectAll选中整个文档。
SizeToControl目前尚未支持。
SizeToControlHeight目前尚未支持。
SizeToControlWidth目前尚未支持。
Stop目前尚未支持。
StopImage目前尚未支持。
StrikeThrough目前尚未支持。
Subscript目前尚未支持。
Superscript目前尚未支持。
UnBookmark从当前选中区中删除全部书签。
Underline切换当前选中区的下划线显示与否。
Undo目前尚未支持。
Unlink从当前选中区中删除全部超级链接。
Unselect清除当前选中区的选中状态。


附2:

键值对应表

键盘名称键值(keycode) 键盘名称键值(keycode)
BackSpace8 Tab9
Clear12 Enter13
Shift_L16 Control_L17
Alt_L18 Pause19
Caps_Lock20 Escape27
Space32 Prior33
Next34 End35
Home36 Left37
Up38 Right39
Down40 Select41
Print42 Execute43
Insert45 Delete46
Help47 0 equal braceright48
1 exclam onesuperior49 2 quotedbl twosuperior50
3 section threesuperior51 4 dollar52
5 percent53 6 ampersand54
7 slash braceleft55 8 parenleft bracketleft56
9 parenright bracketright57 a A65
b B66 c C67
d D68 e E EuroSign69
f F70 g G71
h H72 i I73
j J74 k K75
l L76 m M mu77
n N78 o O79
p P80 q Q at81
r R82 s S83
t T84 u U85
v V86 w W87
x X88 y Y89
z Z90 KP_096
KP_197 KP_298
KP_399 KP_4100
KP_5101 KP_6102
KP_7103 KP_8104
KP_9105 KP_Multiply106
KP_Add107 KP_Separator108
KP_Subtract109 KP_Decimal110
KP_Divide111 F1112
F2113 F3114
F4115 F5116
F6117 F8119
F9120 F10121
F11122 F12123
F13124 F14125
F15126 F16127
F17128 F18129
F19130 F20131
F21132 F22133
F23134 F24135
Num_Lock136 Scroll_Lock137
Acute grave187 Comma semicolon188
Minus underscore189 Period colon190
Numbersign apostrophe192 Plusminus hyphen macron210
Copyright registered212 Guillemotleft guillemotright213
Masculine ordfeminine214 ae AE215
Cent yen216 Questiondown exclamdown217
Onequarter onehalf threequarters218 Less greater bar219
Plus asterisk asciitilde221 Multiply division227
acircumflex Acircumflex228 ecircumflex Ecircumflex229
icircumflex Icircumflex230 ocircumflex Ocircumflex231
ucircumflex Ucircumflex232 ntilde Ntilde233
yacute Yacute234 oslash Ooblique235
aring Aring236 ccedilla Ccedilla237
thorn THORN238 eth ETH239
diaeresis cedilla currency240 agrave Agrave atilde Atilde241
egrave Egrave242 igrave Igrave243
ograve Ograve otilde Otilde244 ugrave Ugrave245
adiaeresis Adiaeresis246 ediaeresis Ediaeresis247
idiaeresis Idiaeresis248 odiaeresis Odiaeresis249
udiaeresis Udiaeresis250 ssharp question backslash251
asciicircum degree252 3 sterling253
Mode_switch254   
A0X65 B0X66
C0X67 D0X68
E0X69 F0X70
J0X71 H0X72
I0X73 J0X74
K0X75 L0X76
M0X77 N0X78
O0X79 P0X80
Q0X81 R0X82
S0X83 T0X84
U0X85 V0X86
W0X87 X0X88
Y0X89 Z0X90
00X48 10X49
20X50 30X51
40X52 50X53
60X54 70X55
80X56 90X57
ESC0X1B CTRL0X11
SHIFT0X10 ENTER0XD



---------------------------------------------

参考文献

1. BX9054: 各浏览器对 document.execCommand 方法的首参数可选值范围存在差异

2. 当前浏览器针对execCommand方法参数的兼容性测试



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值