小编Pre*_*gar的帖子

将.apply()与'new'运算符一起使用.这可能吗?

在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 oop inheritance constructor class

451
推荐指数
11
解决办法
7万
查看次数

解释封装的匿名函数语法

摘要

你能解释一下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)

你能解释一下吗?

javascript syntax anonymous-function

364
推荐指数
4
解决办法
7万
查看次数

是否有关闭HTML select元素时触发的DOM事件?

我正在寻找一个DOM事件,我可以用JavaScript监听当一个已经打开的select元素(但没有更改选项)然后通过单击select元素,在页面上的某个地方(任何地方)关闭.

这不是blur选择的事件,因为选择保留焦点.同样,这不是focus一些其他元素或文档或事件mousedownclick窗口,文档或身体.

这不是change选择的事件,因为选择中的选项没有被更改.

我并不关心传统的Internet Explorer - 只需要符合标准的现代浏览器.专有黑客可能值得知道.

我已经创建了一个JSFiddle来演示这个问题:http://jsfiddle.net/premasagar/FpfnM/

  1. 单击"结果"面板中的选择框
  2. 单击标记为"HERE"(或其他任何地方)的文本,然后查看是否有任何事件添加到日志中.最新的Chrome或Firefox中没有活动.

所以问题是:可以添加什么JavaScript,以便在单击选择框时记录事件?

(我在这里问了一个类似但不同的问题:
iOS上的JavaScript:打开HTML select元素)

html javascript jquery html5 dom

53
推荐指数
1
解决办法
5万
查看次数

与JavaScript的Math.pow相反的是什么?

我在这里有一个心理障碍,而代数并不是我的事,你能告诉我如何重新编写下面的JavaScript代码来推导变量,cab?:

a = Math.pow(b, c);
c = ?
Run Code Online (Sandbox Code Playgroud)

谢谢!

javascript math algebra polynomial-math

22
推荐指数
2
解决办法
1万
查看次数

iOS上的JavaScript:打开HTML select元素

我没有希望,但我会问以防万一.

我希望能够使用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事件?

html javascript iphone ipad ios

15
推荐指数
2
解决办法
1万
查看次数

使用带有IE的JavaScript中的XMLSerializer时,SVG标记上的不需要的命名空间

我正在尝试使用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输出有两个问题:

  1. 有重复的xmlns属性.如果我省略了JavaScript的第二行,那么在IE xmlns中,标记中只有一个属性,但在Firefox,Chrome,Safari和Opera中,该属性缺失.
  2. 它补充道xml:NS1="".为什么是这样?NS1:然后以xmlns:xlink属性为前缀.

我认为我正在以正确的方式创建属性.例如,在这里使用setAttribute而不是setAttributeNS正确(更多信息),并且更改此似乎不能解决问题.

任何见解都表示赞赏.

编辑:一个相关问题讨论了Chrome序列化中导致遗漏名称空间的错误.与第一个问题部分相关(尽管所有其他浏览器的行为相同),但与第二个问题无关.

javascript xml serialization internet-explorer svg

10
推荐指数
1
解决办法
3682
查看次数

可以!在IE的CSS表达式中使用重要的规则吗?

首先,我知道 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)

这可以通过其他方式完成吗?


详细地

我实际上要做的是模仿inheritIE6和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

9
推荐指数
1
解决办法
3792
查看次数

如何取消删除未提交的`svn rm foo`?

我已经使用svn rm foo了许多我现在不想删除的文件.我还没有做出改变.如何svn rm逐个文件或一举取消命令?

我知道如何恢复已从repo中删除的已删除文件,但我不想提交此更改,然后还原.

谢谢.

svn

7
推荐指数
1
解决办法
1449
查看次数

针对第三方JavaScript小部件的分析

我正在尝试为第三方JavaScript小部件找到最佳的分析方法 - 即分发给任意数量的任意用户的工具和内容,这些用户将小部件包含为带有标签的HTML片段.

在同一个域名上

请注意,窗口小部件不会加载到具有从外部站点加载的文档的iframe元素中.相反,它们将内容加载到主机页面的DOM中 - 即它们被视为与主机位于同一域中.

分析主页的片段

所以,基本上,我想跟踪统计信息(例如窗口小部件视图,用户点击和窗口小部件中的自定义交互),但我只想跟踪作为窗口小部件的主机页面片段的统计信息.我不想跟踪窗口小部件外部的主机页面上的点击.

我希望将统计信息整理在一起,以便站点A上的窗口小部件的统计信息将与站点B和站点C上的窗口小部件的统计信息等聚合在一起.

问题

  1. 是否可以以满足这些要求的自定义方式使用Google Analaytics?或者是否无法将GA与主页上收集的其他数据分开?
  2. 如果可以使用Google Analytics,那么如果主页已经使用GA(具有不同的GA个人资料ID),或者是否可以将它们安全地分开,那么会出现问题吗?
  3. 是否还有其他适合小组件统计信息跟踪的分析软件包,以满足这些要求?
  4. 或者,您如何解决获取这些小部件的统计数据的问题?

javascript analytics google-analytics widget

6
推荐指数
1
解决办法
2998
查看次数

渲染性能:样式属性或类名和样式表规则?

我正在构建数据可视化,渲染性能至关重要.我的问题与沼泽标准HTML有关,虽然我碰巧使用SVG和JavaScript.

OK,一个假设的情景:说我有一个10000个DOM节点background-color的" red",并与10,000 DOM节点background-color的" green".每个节点都由JavaScript循环创建.我可以:

  1. style在每个节点上设置一个属性,指定节点的属性background-color:<element style="background-color:red;"/>
  2. class在每个节点上设置一个属性,然后在内联样式或外部样式表中引用该类:

    <head><style>.foo {background-color:red;}</style></head>

    <body><element class="foo"/></body>

下载代码的性能在这里并不重要 - 我只对浏览器的渲染性能感兴趣.我也非常清楚风格属性在日常网站开发中通常不是那么有用或语义,但我在这里有一个特定的用例.

我对逻辑答案感兴趣,但是听到任何人实际测试过这个或者读过别人的测试真的很有用(我搜索了一些信息,但没有找到具体的内容).

谢谢你的帮助!

html css browser performance svg

5
推荐指数
1
解决办法
1853
查看次数

JavaScript:失败的图像请求是否有错误属性?

HTML <img>元素具有布尔complete属性,true如果图像已成功加载(或者尚未分配图像src).它还有一个onload事件,它在图像成功加载时触发,还有一个onerror事件,当图像无法加载时触发(例如由于链接断开,图像损坏或离线网络).

现在......我想知道的是,图像元素上是否有属性表示图像已经无法加载.假设我无法使用该onerror事件,因为脚本可能只有在事件触发后才能访问图像.我们正在寻找的是一个简单的布尔查找属性,如complete"已经尝试加载此图像,并且失败".(我在规范中没有看到,但我想知道我是否遗漏了什么).

html javascript html5 dom image

5
推荐指数
1
解决办法
966
查看次数