小编Jen*_*lly的帖子

如何在Chrome中控制Canvas fillText()的字体字距调整?

我正在尝试创建一个体面的跨浏览器渲染引擎的画布文本.我注意到kerning对在Chrome中无法正常呈现,但在Safari和Firefox中它们可以正常工作.

铬:

在此输入图像描述

火狐:

在此输入图像描述

苹果浏览器:

在此输入图像描述

试试这里的小提琴:http://jsfiddle.net/o1n5014u/

代码示例:

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.font = "40px Arial";
ctx.fillText("VAVA Te", 10, 50);
Run Code Online (Sandbox Code Playgroud)

有没有人有任何解决方法?我找过bug报告,但找不到任何东西.

javascript fonts google-chrome canvas kerning

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

JavaScript 的版本号是多少,对应的 ECMAScript 版本是多少?

我查阅了 JavaScript 的历史,发现 ECMAScript 规范是基于它的。所以 JavaScript 比 ECMAScript 更旧,但似乎后来成为该规范的实现。

所以到目前为止我发现的是:

  • JavaScript 1.0 是第一个版本
  • ECMAScript 3 在 JavaScript 1.5 中实现
  • ECMAScript 4 从未完成
  • ECMAScript 5 在 JavaScript 1.8.5 中实现
  • ECMAScript 6 于 2015 年发布(因此也称为 ECMAScript 2015)
  • ECMAScript 7 于 2016 年发布(因此也称为 ECMAScript 2016)

在 JavaScript 1.8.5 版本之后,我找不到它的任何更高版本号。哪些版本的 JavaScript 实现了 ECMAScript 6 或 7?

javascript

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

为什么我的 FormData 对象总是空的?

我正在尝试向 formData 添加一些数据,如下所示:

params = {'code': 'h1'}
const formData: FormData = new FormData();
formData.append('parameters', JSON.stringify(params));
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样从 formData 获取数据时:formData['parameters']它返回undefined 并且formData.entries.length0。我查看了一些网站,发现这就是这样做的方法。我究竟做错了什么?

谢谢。

form-data typescript

5
推荐指数
2
解决办法
7286
查看次数

为什么"a.push(b)"在我的示例代码中改变了"b"?

我正在尝试将值推送到数组,但这会将值添加到两个数组ab.如何确保b不修改数组?

var a=[[1]];
var b= [2];
document.getElementById("1").innerHTML="a[1] "+a[1];
document.getElementById("2").innerHTML="b "+b;

a.push(b);
document.getElementById("3").innerHTML="a[1] "+a[1];
document.getElementById("4").innerHTML="b "+b;

a[1].push([3]);
document.getElementById("5").innerHTML="a[1] "+a[1];
document.getElementById("6").innerHTML="b "+b+" < why did this value changed?";
Run Code Online (Sandbox Code Playgroud)
<div id="1"></div>
<div id="2"></div><br />
<div id="3"></div>
<div id="4"></div><br />
<div id="5"></div>
<div id="6"></div><br />
Run Code Online (Sandbox Code Playgroud)

javascript arrays

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

正确转换浮点数?

如何转换此字符串以获取1000000?问题是我总是得到10000

console.log(parseFloat('10.000.000,00'.replace('.', ',').replace(/,(?=[^,]*$)/, '.')),'test');
Run Code Online (Sandbox Code Playgroud)

有什么建议么?

javascript

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

为什么1+ +"2"+3在JavaScript中评为6?

任何人都可以告诉我为什么以及1+ +"2"+3JavaScript中的表达式如何产生6,这也是一个数字?我不明白在两个+运算符之间引入单个空格如何将字符串转换为数字.

javascript

4
推荐指数
1
解决办法
1045
查看次数

如何使用我自己的声明文件解决“找不到模块的声明文件”错误?

我有一个测试项目,我在其中测试类型定义文件。该项目有一个名为的文件index.ts,如下所示:

import i18nFu = require("gettext.js");
Run Code Online (Sandbox Code Playgroud)

gettext.js包是如何使用Node.js这样的安装:npm install gettext.js

VS Code 为上面的行显示以下错误消息:

找不到模块“gettext.js”的声明文件。

'SOME_PATH/gettext.js' 隐式具有 'any' 类型。

尝试'npm install @types/gettext.js'(如果它存在)或添加一个包含“declare module 'gettext.js';”的新声明(.d.ts)文件

安装@types/gettext.js模块确实可以解决问题。但我很好奇,所以我并没有就此止步。我@types/gettext.js再次删除了模块并尝试自己创建声明文件。

types/gettext.js在我的项目文件夹中创建了一个子文件夹,并将旧node_modules/@types/gettext.js文件夹的内容复制到其中。我还在typeRoots我的tsconfig.json文件中添加了一个条目,所以它看起来像这样:

{
    "compilerOptions": {
        "lib": ["ES2017"],
        "module": "commonjs",
        "strict": true,
        "target": "es5",
        "typeRoots": ["./types", "./node_modules/@types"],
    },
    "files": ["test.ts"]
}
Run Code Online (Sandbox Code Playgroud)

但错误信息不会消失。用(如错误消息所建议的)替换types/gettext.js/index.d.ts文件的内容(您可以在此处看到declare module 'gettext.js')确实可以消除错误。但这不是拥有类型的解决方案。我错过了什么?

PS:我对解决诸如使用ts-ignore或设置noImplicitAnyfalse.

typescript .d.ts

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

如何在不使用类型断言的情况下检查字符串是否包含在字符串文字类型中?

我经常有这样的字符串文字类型:

const supportedLanguageTags = [
    "de-at",
    "de-ch",
    "de-de",
    "en-gb",
    "en-us",
] as const;

type LanguageTag = typeof supportedLanguageTags[number];

function isSupportedLanguageTag(tag: string): tag is LanguageTag {
    return (supportedLanguageTags as unknown as string[]).includes(tag);
}
Run Code Online (Sandbox Code Playgroud)

在这里,我使用数组来定义类型,但也能够检查文字类型中是否包含随机字符串。

但是我真的不喜欢类型断言。您有摆脱它的建议吗?

一种解决方案是使用对象而不是数组,如下所示:

const supportedLanguageTags = {
    "de-at": 1,
    "de-ch": 1,
    "de-de": 1,
    "en-gb": 1,
    "en-us": 1,
};

type LanguageTag = keyof typeof supportedLanguageTags;

function isSupportedLanguageTag(tag: string): tag is LanguageTag {
    return tag in supportedLanguageTags;
}
Run Code Online (Sandbox Code Playgroud)

但在这里我不喜欢为每个对象属性定义一个随机值。

typescript

4
推荐指数
1
解决办法
2498
查看次数

为什么JavaScript中的function.apply.length 2?

当我在控制台上运行此代码时:

(function test(){
   console.log(function(){}.apply.length);
})();
Run Code Online (Sandbox Code Playgroud)

输出是: 2

我读到了函数长度.我理解MDN上的函数长度部分.但我不明白这一点.功能中没有参数.为什么输出2?

javascript function apply

3
推荐指数
1
解决办法
62
查看次数

用户定义的类型保护函数和类型缩小到更具体的类型

假设我有以下用户定义的类型保护函数,用于检查值是否为上面的数字1000

function isBigNumber(something: unknown): something is number {
    return typeof something === "number" && something > 1000;
}
Run Code Online (Sandbox Code Playgroud)

然后我这样使用它:

const strOrNum: string | number = "asdf";

if (isBigNumber(someVar)) {
    console.log(someVar * 10); // works because of type-guard
} else {
    // here type of strOrNum is "string" and no longer "string | number"
}
Run Code Online (Sandbox Code Playgroud)

strOrNum我的问题是Else 块中的类型。

看起来类型防护检查类型,并且 TS 还使用类型防护来缩小 Else 块的类型范围,在本例中这不是我想要的。类型防护是否仅用于检查类型,而没有传递给它们的值的附加信息?

isBigNumber是否有解决方案,无需更改to的返回类型并且不必再次检查 If 语句的boolean类型?strOrNum

typescript typeguards

3
推荐指数
1
解决办法
1074
查看次数