Rally App SDK 2.0:Ext.Element 方法“不可选择”并没有那么规范化
Rally App SDK 2.0: Ext.Element method "unselectable" isn't so normalized
尽管"unselectable"方法应该禁用文本选择,但它在IE中无法正常工作,至少在IE8中是这样。文本光标仍然存在,并允许输入。
我应该假设它在IE9中也不起作用,因为Microsoft等效的CSS属性"-ms-user-select"最近才在IE10中引入,IE10尚未"正式"发布,并且目前也不被Windows 7支持。
我还应该质疑为什么webkit版本("-webkit-user-select")也不包括在内。我知道webkit是khtml的一个分支,它似乎在Chrome中按预期工作,但我仍然质疑遗漏。
/**
* Disables text selection for this element (normalized across browsers)
* @return {Ext.Element} this
*/
unselectable : function(){
var me = this;
me.dom.unselectable = "on";
me.swallowEvent("selectstart", true);
me.applyStyles("-moz-user-select:-moz-none;-khtml-user-select:none;");
me.addCls(Ext.baseCSSPrefix + 'unselectable');
return me;
}
有没有一种简单的方法来修改此代码,以便在早于 IE10 的 IE 版本中提供适当的功能?
编辑:我在让它工作时遇到了一些麻烦。我已经在onReady调用中插入了以下内容,但在应用程序之前。
(function() {
var Ext = window.Ext4 || window.Ext;
Ext.override(Ext.dom.Element, {
unselectable: function() {
var me = this;
me.dom.unselectable = "on";
me.swallowEvent("selectstart", true);
me.applyStyles([
'-moz-user-select: none;',
'-khtml-user-select: none;',
'-webkit-touch-callout: none;',
'-webkit-user-select: none;',
'-ms-user-select: none;',
'user-select: none'
].join());
me.addCls(Ext.baseCSSPrefix + 'unselectable');
return me;
},
selectable: function() {
var me = this;
me.dom.unselectable = "off";
// Prevent it from bubles up and enables it to be selectable
me.on('selectstart', function(e) {
e.stopPropagation();
return true;
});
me.applyStyles([
'-moz-user-select: text;',
'-khtml-user-select: text;',
'-webkit-touch-callout: text;',
'-webkit-user-select: text;',
'-ms-user-select: text;',
'user-select: text'
].join());
me.removeCls(Ext.baseCSSPrefix + 'unselectable');
return me;
},
});
})();
但是,我收到此错误:
未捕获的类型错误: 无法读取未定义的属性"元素"
me.dom.unselectable = "on";
行用于处理 IE9 及更低版本的unselectable
。这将向元素添加一个属性,如 <div unselectable="on">blah</div>
,这应该会导致div 的文本不再可编辑。这对你不起作用吗?
不幸的是,Ext的unselectable
和selectable
似乎不能完全处理webkit,您可以通过覆盖方法来解决此问题。如何覆盖该方法取决于您使用的 SDK 版本。
适用于应用 SDK 2.0p 和 2.0p2
这些版本的 SDK 是针对 ExtJS 4.0.7 构建的。在 Ext 4.0 中,不能使用 Ext.override
修补Ext.Element
。所以你需要多一点手动并改变原型:
Ext.core.Element.prototype.unselectable = function() {
var me = this;
me.dom.unselectable = "on";
me.swallowEvent("selectstart", true);
me.applyStyles([
'-moz-user-select: none;',
'-khtml-user-select: none;',
'-webkit-touch-callout: none;',
'-webkit-user-select: none;',
'-ms-user-select: none;',
'user-select: none'
].join());
me.addCls(Ext.baseCSSPrefix + 'unselectable');
return me;
};
Ext.core.Element.prototype.selectable = function() {
var me = this;
me.dom.unselectable = "off";
// Prevent it from bubles up and enables it to be selectable
me.on('selectstart', function(e) {
e.stopPropagation();
return true;
});
me.applyStyles([
'-moz-user-select: text;',
'-khtml-user-select: text;',
'-webkit-touch-callout: text;',
'-webkit-user-select: text;',
'-ms-user-select: text;',
'user-select: text'
].join());
me.removeCls(Ext.baseCSSPrefix + 'unselectable');
return me;
};
你应该把这作为Rally.onReady()
里面的第一件事
适用于应用 SDK 2.0p3 及更高版本
适用于 2.0p3 及更高版本的应用 SDK 是针对 ExtJS 4.1 构建的。他们更改了 Ext.Element 以支持 Ext.override
,所以在这里我们可以做一个稍微干净的解决方案(这基本上是我最初发布的):
Ext.override(Ext.dom.Element, {
unselectable: function() {
var me = this;
me.dom.unselectable = "on";
me.swallowEvent("selectstart", true);
me.applyStyles([
'-moz-user-select: none;',
'-khtml-user-select: none;',
'-webkit-touch-callout: none;',
'-webkit-user-select: none;',
'-ms-user-select: none;',
'user-select: none'
].join());
me.addCls(Ext.baseCSSPrefix + 'unselectable');
return me;
},
selectable: function() {
var me = this;
me.dom.unselectable = "off";
// Prevent it from bubles up and enables it to be selectable
me.on('selectstart', function(e) {
e.stopPropagation();
return true;
});
me.applyStyles([
'-moz-user-select: text;',
'-khtml-user-select: text;',
'-webkit-touch-callout: text;',
'-webkit-user-select: text;',
'-ms-user-select: text;',
'user-select: text'
].join());
me.removeCls(Ext.baseCSSPrefix + 'unselectable');
return me;
}
});
在这两种情况下,只需稍微调整一下功能即可为webkit,IE等添加样式。
- 下拉选择可自动更改第二个下拉选择
- 为什么在fabricjs中可选择的不适用于一组圆
- 如何在引导日期选取器中限制可选择的日期范围
- Datatablesjquery插件-限制可选择的行数
- 使用jQuery使动态元素可选择
- jQuery可选择多个项目
- jQuery UI 可选择在选定/未选定时添加/删除类
- 可选择序列化 jQuery UI::如何显示 html 标记中的内容而不是索引值
- 可选择限位止损
- 可选择的限制
- 使用复选框更改背景颜色,可选择有限数量的复选框
- 限制可选择的 DOM 复选框
- 如何在 mtz.monthpicker 中设置可选择的最大月份
- 由用户在可选择的表上使用 innerHTML 写入
- 可选择 iOS Webkit 只读输入
- react native:可选择的部分列表视图出现错误
- 在会话到期前通知用户,可选择续订会话
- 如何提供日期选择器,该日期选择器包含一个可选择的日期、月份和年份选项
- 尝试使用SoundJS和jQuery's可选择,但声音不;我不在萤火虫上工作
- HTML图像地图,可选择区域触发弹出内容