Javascript 在Safari中未定义的对象原型中新添加的函数/属性
以下Javascript 在Safari中未定义的对象原型中新添加的函数/属性,javascript,jquery,safari,prototype,Javascript,Jquery,Safari,Prototype,以下load功能在macOS上的Safari中未被识别,但在Chrome和Firefox中可以完美地工作(截至目前,所有这些功能都在最新的稳定版本上,jquery是v3.1.0): Safari报告说: jQuery.Deferred exception: img.load is not a function. (In 'img.load(imgURL)', 'img.load' is undefined) 我不明白,Image.prototype.load显然是在上面几行声明的。在研究Saf
load
功能在macOS上的Safari中未被识别,但在Chrome和Firefox中可以完美地工作(截至目前,所有这些功能都在最新的稳定版本上,jquery是v3.1.0):
Safari报告说:
jQuery.Deferred exception: img.load is not a function. (In 'img.load(imgURL)', 'img.load' is undefined)
我不明白,Image.prototype.load
显然是在上面几行声明的。在研究Safari上的jquery
load
问题时,我遇到了一些似乎已经在更新中解决的问题。我没有遇到任何显示load
函数在图像
对象上被归类为未定义对象的情况
MDN web文档建议使用Safari创建object.prototype
我被难住了。似乎没有提到这个地区与Safari不兼容的问题。SO和其他地方的类似问题通常以范围或订单问题结束。这仍然是我最好的预感,但我已经一遍又一遍地重复这一点,并试图转换订单,只是为了实证证据,这不是问题所在。这些都导致了可理解的未定义的错误,但这。。。我不能四处走动
JSFIDLE中的工作示例:
如果在大多数浏览器中检查控制台,它会报告:
Uncaught ReferenceError: createImgElement is not defined
at XMLHttpRequest.xmlHTTP.onloadend ((index):64)
这是有道理的,我没有在示例中提供该函数。但是,在Safari中运行该示例,并没有看到该函数不存在。相反,它会在报告后中止:
TypeError: img.load is not a function. (In 'img.load(imgURL)', 'img.load' is undefined)
更新
console.log(img)
在创建对象后立即成功地报告对象的存在,并且在所有浏览器中都没有错误
console.log(img.\uu proto\uu)
同时显示load
出现在Chrome和Firefox上,但在Safari的功能列表中不存在。有关声明Image.prototype.load=function()
的某些内容不符合Safari的要求,即这是要附加到继承对象的函数
我的问题代码简化为最简单的形式,但仍然产生相同的错误:
Image.prototype.load = function () {
console.log('Success!');
};
var img = new Image();
img.load(); // produces the same undefined error
但是,如果我创建自己的对象,它会工作吗
function testObject() {};
testObject.prototype.load = function () {
console.log('Success!');
};
var img = new testObject();
img.load(); // outputs 'success!'
关于使用已建立的javascript对象的某些内容在Safari中不起作用。如何正确定义此问题?此问题的较新版本中的一位用户留下了一条评论,使我怀疑这可能是我的Safari版本(10.1)的一个错误,它是我使用的macOS版本(10.12.4)的最新版本,但是macOS最新版本(10.12.6)的最新版本(10.1.2)
我刚刚将macOS和Safari升级到这些最新版本,问题依然存在。意外但有助于隔离问题所在。我禁用了所有的扩展,突然它就工作了。沮丧的是,我最初没有尝试这个(我不认为javascript的核心方面会受到影响),我分别尝试了每个扩展,发现罪魁祸首是uBlock源的当前测试版
我还没有一个解决方案(除了不使用扩展),但至少有一个答案,并且不会向他们提出这个问题
function testObject() {};
testObject.prototype.load = function () {
console.log('Success!');
};
var img = new testObject();
img.load(); // outputs 'success!'