- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个想法...
我将尝试制作一个 JavaScript 库,它将支持 canvas
向后兼容 HTML5 之前的所有浏览器。
我将库函数制作为简单的包含,其中,如果不支持 canvas
,则库将接管并为所有 canvas
调用创建支持函数,否则如果支持canvas,则该库不执行任何操作。我希望用户能够像平常一样使用所有 canvas
调用,而无需更改语法。
我知道这听起来很疯狂,但除了一些小问题之外,我的论文开始听起来相当可行......
我需要拦截 document.createElement
(先别开枪,我会解释的!)
当调用 document.createElement("tagName")
时,我需要以某种方式拦截该函数以检查 tagName
参数的 值> Canvas
。
if(canvasNotSupported && tagName === 'canvas')
tagName = 'img';
我还必须在 return 语句之前拦截 document.createElement
函数,以包含用于假 Canvas 的函数,例如 getContext'、'toDataURL
和 toBlob
.
我还没有尝试过任何拦截 document.createElement
函数的方法,但这可能吗?能做到吗?怎么办?
另外,我将提供一个设置变量( bool 值),它会告诉我的函数覆盖 canvas
的创建,无论是否支持。这应该提供完整的跨浏览器兼容性,并且还为恼人的“通过跨源数据污染 Canvas ”****错误提供了一个漂亮的小解决方法。
谢谢大家!
最佳答案
我已经明白了!
从长远来看,这可能不是该函数的编写方式,但它是一个工作原型(prototype)。
//Support for `bind` from MSDN
if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== 'function') {
// closest thing possible to the ECMAScript 5
// internal IsCallable function
throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this,
fNOP = function() {},
fBound = function() {
return fToBind.apply(this instanceof fNOP && oThis
? this
: oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
//Checking for HTML5 canvas support
function time_capsule_canvas_exists()
{
var elem = time_capsule_canvas_original_document_createElement.call(document, 'canvas');
if(elem.getContext)
{
delete elem;
return true;
}
else
{
delete elem;
return false;
}
}
/*Time Capsule Canvas Override value
@var time_capsule_canvas_override
Setting this value to true will cause
time_capsule_canvas to override the
creation of canvases regardless of
HTML5 support by the browser
*/
var time_capsule_canvas_override = false;
//Stored original document.createElement
var time_capsule_canvas_original_document_createElement = document.createElement;
document.createElement = function (tag)
{
var elem;
if(tag.toLowerCase() === 'canvas' && (!time_capsule_canvas_exists() || time_capsule_canvas_override))
{
//tag is 'canvas'
//Either there is no HTML5 support, or it was explicitly defined to be overriden
elem = time_capsule_canvas_original_document_createElement.call(document, 'img');
elem.getContext = function(dimension)
{
//Do something
}.bind(elem);
elem.toDataURL = function()
{
//Do something
}.bind(elem);
elem.toBlob = function()
{
//Do something
}.bind(elem);
}
else//either non 'canvas' tag, or HTML5 and override not explicitly set
{
elem = time_capsule_canvas_original_document_createElement.call(document, tag);
}
return elem;
};
它可以在 IE6 中运行!!!
关于javascript - HTML5 之前的 Canvas : Is backwards compatibility posible/Intercept document. createElement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27843821/
我是学习深度学习的新手,我一直在努力理解 Pytorch 中的“.backward()”是做什么的,因为它几乎完成了那里的大部分工作。因此,我试图详细了解反向函数的作用,因此,我将尝试逐步编写该函数的
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在开发一个同时具有 GUI(图形)和 API(脚本)界面的应用程序。我们的产品有一个非常大的安装基础。许多客户投入了大量时间和精力来编写使用我们产品的脚本。 在我们所有的设计和实现中,我们(可以理
我从事的项目以源代码和二进制形式免费分发,因为我们的许多用户需要专门为他们的系统编译它。这需要一定程度的考虑,以保持与旧主机系统(主要是它们的编译器)的向后兼容性。 其中一些最糟糕的,例如 GCC 3
我需要在 Python 中创建一个树状结构。我有一个函数 get(parentId),它返回具有该父级的对象列表——我认为应该递归地完成。 结果应该是这样的:["root object", ["chi
我正在尝试为移动菜单制作动画,因此当点击它时三条纹应该变成“X”,当关闭菜单时它应该恢复为三条纹。 “X”的动画效果非常好,但关闭时它会跳回三条纹,而不是平滑地过渡回它。这是因为我当然完全删除了 x
训练用PyTorch编写的LSTM或RNN时,在loss.backward()上报错: RuntimeError: Trying to backward through the graph
为什么参数到atan2功能是“倒退”的?即,为什么它接受 y, x 形式的坐标而不是标准 x, y ? 最佳答案 因为它类似于atan(y / x) , 与 y作为分子和 x作为分母。 关于math
data.table很棒,因为我可以进行滚动连接,甚至可以在组内进行滚动连接! library(data.table) set.seed(42) metrics metrics[calendar,r
我正在开发一个 grails 插件,它添加了一个新的标签库并呈现了一个模板。 我的问题是这个模板输出一个 JSON 并且我不需要它被编码。 如果我使用 raw() 函数,它工作正常,但这与 grail
我想匹配字符串中的数字:'abc@2003,或其他@2017'我想通过 match 函数获得结果 [2003, 2007]。 let strReg = 'abc@2003, or something
Douglas Crockford,因此,JSLint 真的不喜欢 for 循环。大多数时候我同意,并使用 [].forEach 和 Object.keys(obj) 遍历数组或字典。 但是,在某些情
这个问题在这里已经有了答案: Difference between null == x and x == null? [duplicate] (5 个答案) 关闭 7 年前。 我正在查看一些代码,发
我有一个 PyTorch 计算图,它由一个执行某些计算的子图组成,这个计算的结果(我们称它为 x)然后被分支到另外两个子图中。这两个子图的每一个都会产生一些标量结果(我们称它们为 y1 和 y2)。我
不是从前面读取文件,而是可以向后读取它吗?这样输出是从文件的后面到文件的前面。 编辑:最后一行首先显示,而不是完全向后显示。 最佳答案 这是可能的,但很麻烦。 Lua API 提供 seek函数来设置
我用 Storyboard 创建了我的应用程序,直到很晚才意识到 iOS4.3 设备将不受支持。是否有一个选项可以将 Storyboard View 复制到 xib 中或在运行时以编程方式执行此操作?
我为那些犯了同样错误的人发布了这个问题。尝试计算梯度时出现此错误: criterion = torch.nn.CrossEntropyLoss() loss = criterion(y_hat, y_
我一直在阅读this article并且在他们的一节中指出: Lenses compose backwards. Can't we make (.) behave like functions? Yo
编辑:这对我来说是“倒退” - 我可能缺少一些直觉 给定一个 glm 变换函数,例如 glm::translate,两个参数首先是一个矩阵 m,然后是一个用于平移的 vector v。 直观上,我希望
我正在使用调查图/图遍历 compile group: 'org.jgrapht', name: 'jgrapht-core', version: '1.1.0' 使用下面的代码我可以创建一个简单的图
我是一名优秀的程序员,十分优秀!