gpt4 book ai didi

javascript - 向 Safari 中 undefined object 原型(prototype)新添加的函数/属性

转载 作者:行者123 更新时间:2023-11-30 21:11:51 24 4
gpt4 key购买 nike

macOS 上的 Safari 无法识别以下load 函数,但在 ChromeFirefox(截至今天,所有版本都在最新的稳定版本中,jquery 是 v3.1.0):

Image.prototype.load = function (url) {
var thisImg = this;
xmlHTTP = new XMLHttpRequest();
xmlHTTP.open('GET', url, true);
xmlHTTP.responseType = 'arraybuffer';
xmlHTTP.onload = function (e) {
var blob = new Blob([this.response]);
thisImg.src = window.URL.createObjectURL(blob);
};
xmlHTTP.onprogress = function (e) {
var percLoaded = parseInt((e.loaded / e.total) * 100);
thisImg.completedPercentage = percLoaded;
};
xmlHTTP.onloadstart = function () {
thisImg.completedPercentage = 0;
};
xmlHTTP.onloadend = function() {
thisImg.completedPercentage = 100;
// put the image blob we just created in the dom
createImgElement(index, img);
};
xmlHTTP.onabort = function() {
console.log('abort called.');
};
xmlHTTP.send();
};

Image.prototype.completedPercentage = 0;

var imgURL = '/folder/example.jpg';
var img = new Image();
img.load(imgURL);

Safari 报告说:

jQuery.Deferred exception: img.load is not a function. (In 'img.load(imgURL)', 'img.load' is undefined)

我不明白,因为 Image.prototype.load 非常明显地在其上方的几行中声明。在 Safari 上研究 jquery load 问题时,我遇到了一些似乎已在更新中解决的问题。我还没有遇到任何显示 Image 对象之上的 load 函数被归类为 undefined 的东西。

MDN 网络文档建议object.prototype is compatible使用 Safari

我很困惑。似乎没有提及这方面与 Safari 的不兼容性。 SO 和其他地方的类似问题通常以范围或顺序问题告终。这仍然是我最好的预感,但我已经一次又一次地检查这个并尝试切换订单只是为了经验证据这不是问题。这些都导致了可以理解的 undefined 错误,但这......我无法理解。

jsFiddle 中的工作示例:

https://jsfiddle.net/14no0q12/

如果您在大多数浏览器中检查控制台,它会报告:

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.__proto__) 在同一点显示 load 存在于 ChromeFirefox 但在 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) 但最新版本 (10.1.2)macOS (10.12.6) 的最新版本.

我刚刚将 macOSSafari 升级到这些最新版本,但问题仍然存在。意外但有助于隔离问题所在。我禁用了所有扩展程序,突然它就可以工作了。沮丧的是我最初没有尝试这个(我认为 javascript 的核心方面不会受到影响)我单独尝试了每个扩展并发现罪魁祸首是 uBlock Origin 的当前测试版。。 p>

我还没有解决方案(除了不使用扩展),但至少有一个答案,并且不会向他们提出问题。

关于javascript - 向 Safari 中 undefined object 原型(prototype)新添加的函数/属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46051149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com