在JavaScript中,我想创建一个对象实例(通过new
运算符),但是将任意数量的参数传递给构造函数.这可能吗?
我想做的是这样的事情(但下面的代码不起作用):
function Something(){
// init stuff
}
function createSomething(){
return new Something.apply(null, arguments);
}
var s = createSomething(a,b,c); // 's' is an instance of Something
Run Code Online (Sandbox Code Playgroud)
答案
从这里的回复中可以清楚地看出,没有内置的方式.apply()
与new
运营商通话.然而,人们提出了一些非常有趣的解决方案.
我首选的解决方案是Matthew Crumley的这个解决方案(我已将其修改为通过该arguments
属性):
var createSomething = (function() {
function F(args) {
return Something.apply(this, args);
}
F.prototype = Something.prototype;
return function() {
return new F(arguments);
}
})();
Run Code Online (Sandbox Code Playgroud) 你能解释一下JavaScript中封装的匿名函数语法背后的原因吗?为什么这样做:(function(){})();
但这不是:function(){}();
?
在JavaScript中,可以创建一个这样的命名函数:
function twoPlusTwo(){
alert(2 + 2);
}
twoPlusTwo();
Run Code Online (Sandbox Code Playgroud)
您还可以创建匿名函数并将其分配给变量:
var twoPlusTwo = function(){
alert(2 + 2);
};
twoPlusTwo();
Run Code Online (Sandbox Code Playgroud)
您可以通过创建匿名函数来封装代码块,然后将其包装在括号中并立即执行:
(function(){
alert(2 + 2);
})();
Run Code Online (Sandbox Code Playgroud)
这在创建模块化脚本时非常有用,可以避免使当前作用域或全局作用域混乱,并且可能存在冲突的变量 - 例如Greasemonkey脚本,jQuery插件等.
现在,我理解为什么会这样.括号包含内容并仅公开结果(我确定有更好的方法来描述),例如with (2 + 2) === 4
.
但我不明白为什么这也不起作用:
function(){
alert(2 + 2);
}();
Run Code Online (Sandbox Code Playgroud)
你能解释一下吗?
我正在寻找一个DOM事件,我可以用JavaScript监听当一个已经打开的select元素(但没有更改选项)然后通过单击select元素,在页面上的某个地方(任何地方)关闭.
这不是blur
选择的事件,因为选择保留焦点.同样,这不是focus
一些其他元素或文档或事件mousedown
或click
窗口,文档或身体.
这不是change
选择的事件,因为选择中的选项没有被更改.
我并不关心传统的Internet Explorer - 只需要符合标准的现代浏览器.专有黑客可能值得知道.
我已经创建了一个JSFiddle来演示这个问题:http://jsfiddle.net/premasagar/FpfnM/
所以问题是:可以添加什么JavaScript,以便在单击选择框时记录事件?
(我在这里问了一个类似但不同的问题:
iOS上的JavaScript:打开HTML select元素)
我在这里有一个心理障碍,而代数并不是我的事,你能告诉我如何重新编写下面的JavaScript代码来推导变量,c
用a
和b
?:
a = Math.pow(b, c);
c = ?
Run Code Online (Sandbox Code Playgroud)
谢谢!
我没有希望,但我会问以防万一.
我希望能够使用JavaScript在iPhone/iPad的移动Safari中打开一个选择元素.
广泛的Google/Stack Overflow搜索显示很多人希望能够在浏览器中执行此操作,但不支持(为什么不呢,我想知道?).已经提出了各种黑客攻击,从调用focus()
select元素并更改其size
属性以使更多option
元素可见,或构造带有<div>
和<ul>
元素的完全模拟选择元素.但是,我想在iPad和iPhone中使用本机浏览器选择控件.
我想知道,也许有人可能知道专有的Apple WebKit方法来做到这一点.它会是这样的:
var myselect = document.getElementsByTagName("select")[0];
myselect.open(); // this method doesn't exist
Run Code Online (Sandbox Code Playgroud)
作为奖励,知道一个布尔属性也很方便,该属性说明select元素当前是否打开/活动(即不仅仅是元素是否具有焦点).我知道我可以通过跟踪点击和更改事件来解决这个问题,但是一个简单的属性会很有用.
妄想?
更新:
我还没有答案,但我发现模拟mousedown
成功打开谷歌浏览器中的选择元素,但不是iPad或Firefox等等:
function simulateMouseEvent(eventName, element) {
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent(eventName, true, true, window,
0, 0, 0, 0, 0, false, false, false, false, 0, null);
element.dispatchEvent(evt);
}
simulateMouseEvent("mousedown", select);
Run Code Online (Sandbox Code Playgroud)
更新:
我已经在这里选择了一个相关但不同(并且同样没有答案!)的问题:在关闭HTML select元素时是否会触发一个DOM事件?
我正在尝试使用JavaScript DOM API的XMLSerializer将SVG元素转换为其代表性标记.
这是用于创建元素并将其序列化的基本代码:
var el = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
el.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
el.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
var markup = (new XMLSerializer()).serializeToString(el);
console.log(markup);
Run Code Online (Sandbox Code Playgroud)
在Chrome,Firefox,Safari和Opera中,它可以产生我想要的东西:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"/>
Run Code Online (Sandbox Code Playgroud)
但是在Internet Explorer 9到IE11中,我得到了这个:
<svg xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xml:NS1="" NS1:xmlns:xlink="http://www.w3.org/1999/xlink" />
Run Code Online (Sandbox Code Playgroud)
IE输出有两个问题:
xmlns
属性.如果我省略了JavaScript的第二行,那么在IE xmlns
中,标记中只有一个属性,但在Firefox,Chrome,Safari和Opera中,该属性缺失.xml:NS1=""
.为什么是这样?NS1:
然后以xmlns:xlink
属性为前缀.我认为我正在以正确的方式创建属性.例如,在这里使用setAttribute
而不是setAttributeNS
正确(更多信息),并且更改此似乎不能解决问题.
任何见解都表示赞赏.
编辑:一个相关问题讨论了Chrome序列化中导致遗漏名称空间的错误.与第一个问题部分相关(尽管所有其他浏览器的行为相同),但与第二个问题无关.
首先,我知道 CSS表达式在很多方面都是失效的,也是为了避免!important
在可能的情况下使用.这是一个特殊的案例样式表.
我的问题是......有没有办法让CSS表达式设置!important
标志?
例如,这不起作用:
a { color:expression('red !important'); }
Run Code Online (Sandbox Code Playgroud)
[编辑:感谢MarmaladeToday下面的评论].这也行不通:
a { color:expression('red') !important; }
Run Code Online (Sandbox Code Playgroud)
这可以通过其他方式完成吗?
我实际上要做的是模仿inherit
IE6和7中的值.这有效:
color:expression(
this.parentNode.currentStyle ?
this.parentNode.currentStyle.color: 'red'
);
Run Code Online (Sandbox Code Playgroud)
但我也想设置!important
标志,这不起作用:
color:expression(
(
this.parentNode.currentStyle ?
this.parentNode.currentStyle.color: 'red'
) + ' !important');
Run Code Online (Sandbox Code Playgroud)
我知道,在JavaScript中,不可能!important
通过元素的style
对象进行设置.例如,这不起作用:
element.style.color = 'red !important';
Run Code Online (Sandbox Code Playgroud)
但是,它是可以设置!important
通过元素的style
属性:
element.setAttribute('style', 'color:red !important;');
Run Code Online (Sandbox Code Playgroud)
所以... CSS表达式仅限于与style
对象交互,因此,我想要实现的是不可能的 - 或者表达式是否有任何方式影响元素的属性,或 …
javascript css inheritance internet-explorer css-expressions
我已经使用svn rm foo
了许多我现在不想删除的文件.我还没有做出改变.如何svn rm
逐个文件或一举取消命令?
我知道如何恢复已从repo中删除的已删除文件,但我不想提交此更改,然后还原.
谢谢.
我正在尝试为第三方JavaScript小部件找到最佳的分析方法 - 即分发给任意数量的任意用户的工具和内容,这些用户将小部件包含为带有标签的HTML片段.
请注意,窗口小部件不会加载到具有从外部站点加载的文档的iframe元素中.相反,它们将内容加载到主机页面的DOM中 - 即它们被视为与主机位于同一域中.
所以,基本上,我想跟踪统计信息(例如窗口小部件视图,用户点击和窗口小部件中的自定义交互),但我只想跟踪作为窗口小部件的主机页面片段的统计信息.我不想跟踪窗口小部件外部的主机页面上的点击.
我希望将统计信息整理在一起,以便站点A上的窗口小部件的统计信息将与站点B和站点C上的窗口小部件的统计信息等聚合在一起.
我正在构建数据可视化,渲染性能至关重要.我的问题与沼泽标准HTML有关,虽然我碰巧使用SVG和JavaScript.
OK,一个假设的情景:说我有一个10000个DOM节点background-color
的" red
",并与10,000 DOM节点background-color
的" green
".每个节点都由JavaScript循环创建.我可以:
style
在每个节点上设置一个属性,指定节点的属性background-color
:<element style="background-color:red;"/>
class
在每个节点上设置一个属性,然后在内联样式或外部样式表中引用该类:
<head><style>.foo {background-color:red;}</style></head>
<body><element class="foo"/></body>
下载代码的性能在这里并不重要 - 我只对浏览器的渲染性能感兴趣.我也非常清楚风格属性在日常网站开发中通常不是那么有用或语义,但我在这里有一个特定的用例.
我对逻辑答案很感兴趣,但是听到任何人实际测试过这个或者读过别人的测试真的很有用(我搜索了一些信息,但没有找到具体的内容).
谢谢你的帮助!
HTML <img>
元素具有布尔complete
属性,true
如果图像已成功加载(或者尚未分配图像src
).它还有一个onload
事件,它在图像成功加载时触发,还有一个onerror
事件,当图像无法加载时触发(例如由于链接断开,图像损坏或离线网络).
现在......我想知道的是,图像元素上是否有属性表示图像已经无法加载.假设我无法使用该onerror
事件,因为脚本可能只有在事件触发后才能访问图像.我们正在寻找的是一个简单的布尔查找属性,如complete
"已经尝试加载此图像,并且失败".(我在规范中没有看到,但我想知道我是否遗漏了什么).