- 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/
“所有浏览器兼容”和“跨浏览器兼容”有什么区别? “交叉”是什么意思,是指不同的操作系统吗? 如果任何网站在 IE 7、8 FF 3+、Safari 3+ 的桌面版本上运行良好,我们可以说它是跨浏
我们目前正在维护一个基于 ASP.Net 3.5、MS Enterprise Lib 4.1 和 Telerik ASP.Net AJAX 2010 的企业应用程序。该应用程序由 2 个不同的部分组成
我有一个基于 Ant 的构建系统,我想我可以编写一个 python 脚本来测试目录层次结构中的所有已编译/jarred 类,以避免在编译时与运行时使用不同版本时可能出现的问题。 脚本最初检查了在各种
对于纯 C 共享库,是否有可能在 API 兼容性未被破坏的情况下破坏 ABI 兼容性? 此外,如果编写一个库 A,它提供现有库 B 的所有 API 函数,以及一些额外的 API 函数,那么库 A AB
我可以看到这个问题在这里之前已经被问过 tensorflow-has-no-attribute-compat 但给出的答案是 Microsoft Visual C++ 2015-2019 Redist
我有以下错误。我正在使用 tensorflow 的 conda 安装。我正在努力尝试将它与我的 GPU 一起使用。 Loaded runtime CuDNN library: 5005 (compat
添加 Android 平台(ionic cordova platform add android)后,我构建了我的 Ionic 项目(ionic cordova build android),但出现错
我刚刚在野外看到了这个元标记,想知道它的作用以及为什么要使用它? 阅读documentation在 About.com 上,它说: "IE=edge" tells Internet Explorer
切换到 Android Studio 3.2 canary 后,我收到以下构建错误。 我看过this发布这个人有类似问题但没有提到解决方案的地方。 我想尝试新的 Material 组件和喷气背包,所以
我刚刚将 build.gradle 编译 SDK 更新为 27 API。 compileSdkVersion 27 buildToolsVersion '27.0.3' targetSdkVersio
我有一个简单的 HTML5/ASP.NET 网站,我今天开始在 IE10 中测试它,因为它是为 Win7 发布的。 这是我组织内的一个 Intranet 站点,我相信不久前部署了一个组策略以默认启用在
假设您有一个需要维护的旧代码库,它显然不符合当前标准。在获得标准合规性的同时,您将如何分配您的工作以保持代码库向后兼容?什么对你很重要? 最佳答案 在我的工作场所,我们没有任何时间仅仅因为它可以使代码
我已经在 JDK7 中创建了一个应用程序,但 jre6 仍在市场上使用,如果我将我的 jar 文件发送给使用 jre6 的人,它不会工作,应用程序是否有检查 jre 版本的方法,如果它不兼容然后要
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我正在开发一个同时具有 GUI(图形)和 API(脚本)界面的应用程序。我们的产品有一个非常大的安装基础。许多客户投入了大量时间和精力来编写使用我们产品的脚本。 在我们所有的设计和实现中,我们(可以理
我有以下类层次结构: class O_Base {...} class O extends O_Base {...} abstract class A_Abstract { public fu
我得到了这两个 ko.compulateds 列表,我想在其中拖放,但也使用按钮移动以删除添加到列表的内容。 但是我无法让它们同时使用拖放和按钮功能。 对于拖放,我使用 Ryan Niemeyers
我从事的项目以源代码和二进制形式免费分发,因为我们的许多用户需要专门为他们的系统编译它。这需要一定程度的考虑,以保持与旧主机系统(主要是它们的编译器)的向后兼容性。 其中一些最糟糕的,例如 GCC 3
我的应用程序以 API/minSDKversion 5 为目标,并在 2.2 上运行良好。我的 friend 刚刚尝试将我的应用程序下载到他运行 2.3.4 的 Samsung Galaxy S2 上
简而言之,我的问题是: C 标准明确规定结构成员的相对地址应该按照声明的顺序增长。它也没有说明结构成员应该如何精确对齐的任何细节。显然,这样做是为了允许填充结构和打包结构的实现。然而,从理论上讲,可以
我是一名优秀的程序员,十分优秀!