- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个检测高级浏览器功能的自包含 javascript 实用程序对象。理想情况下,我的对象看起来像这样:
Support = {
borderRadius : false, // values returned by functions
gradient : false, // i am defining
dataURI : true
};
我当前的问题涉及我从 Weston Ruter's site 改编的一些代码它检测 dataURI 支持。它尝试使用 javascript 创建带有 dataURI 源的图像,并使用 onload/onerror 回调来检查宽度/高度。由于 onload 是异步的,我失去了我的范围并且返回 true/false 不会将 true/false 分配给我的对象。
这是我的尝试:
Support = {
...
dataURI : function(prop) {
prop = prop; // keeps in closure for callback
var data = new Image();
data.onload = data.onerror = function(){
if(this.width != 1 || this.height != 1) {
prop = false;
}
prop = true;
}
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
return -1;
}(this)
};
我立即执行匿名函数,传递它(我希望它是对 Support.dataURI 的引用),但不幸的是引用了窗口对象——因此值始终为 -1。在创建 Support 对象后,我可以通过使用外部定义的函数来分配值来让它工作……但我不认为那样很干净。有没有办法让它独立?对象字面量的函数可以引用分配给它的属性吗?
编辑 ----------------------------------
不完全是我的问题的答案(措辞)所以我不打算发布额外的答案,但是......我决定使用单例对象而不是对象文字。这是工作代码:
Support = new function Support() {
var that = this;
this.dataURI = function() {
var data = new Image();
data.onload = data.onerror = function(){
if(this.width != 1 || this.height != 1) {
that.dataURI = false;
} else {
that.dataURI = true;
}
}
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
return that.dataURI;
}();
};
最佳答案
Can the object literal's function reference the property it's assigned to?
是的,它可以。每个函数都有一个本地 arguments变量,它有一个引用被调用函数的 callee
属性。所以如果你想引用 Support.dataURI,你可以简单地使用它:
var Support = {
...
dataURI: function(prop)
{
// Do whatever here with arguments.callee
}
};
但是,我认为这并不是您真正想要的。看起来您正在尝试引用属性名称,而不是值——在这种情况下,您的答案是否定的。 JavaScript 方法无法知道它存储在哪些属性中;事实上,它可以同时存储在多个属性中。例如:
var Support = {
...
dataURI: function(prop)
{
}
};
Support.somethingElse = Support.dataURI;
这里,Support
有两个属性都指向同一个方法。但是,该方法本身无法知道调用了哪个引用。由于 Support
对象尚未声明,您无法引用它。
事实上(虽然你问“对象文字的函数是否[可以]引用它分配给的属性”),函数甚至没有存储在对象上:它的结果是。因此,该方法本身与 Support
没有任何关联。
恐怕你最好先声明对象,然后设置它的 dataURI
属性。
首先,你不需要在“function”之前加上“new”关键字。不过,我看不出这在任何浏览器中如何工作。如果简化它,代码的第 3-14 行的形式为“this.dataURI = fn();”。以下是这样的语句的工作原理:
fn()
dataURI
属性。在执行 fn()
时,dataURI
尚未分配,因此无法访问其(正确的)值以返回它.
此外,您有一个(至少可能是)异步过程(等待图像加载或出错),因此该值甚至不会被回调设置。基本上,您试图将异步过程(onload
事件)包装在同步过程(函数调用)中。
最后,您无需在此处创建和执行函数。摆脱它:
var Support = function() {
var that = this;
var data = new Image();
data.onload = data.onerror = function(){
if(this.width != 1 || this.height != 1) {
that.dataURI = false;
} else {
that.dataURI = true;
}
}
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
};
但请记住:仍然无法保证(至少我知道)onload
和 onerror
处理程序会在您设置源时同步(立即)触发——事实上,甚至可以保证他们不会!因此,您可能会向 Support
对象添加回调,并在设置 dataURI
后执行它。但是,您必须防止 onload
或 onerror
同步执行的可能性。这样的事情应该有效:
var Support = function() {
var that = this;
this.getDataURI = function()
{
var data = new Image();
data.onload = data.onerror = function(){
if(this.width != 1 || this.height != 1) {
that.dataURI = false;
} else {
that.dataURI = true;
}
if (that.onDataURI)
that.onDataURI();
}
data.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
}
};
var mySupport = new Support();
mySupport.onDataURI = function() { alert(mySupport.dataURI); }
mySupport.getDataURI();
关于javascript - 通过异步回调设置对象文字属性值。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4522167/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!