gpt4 book ai didi

JavaScript 对象属性为 "sometimes"未定义

转载 作者:行者123 更新时间:2023-11-30 18:02:33 25 4
gpt4 key购买 nike

我很困惑。

我创建了以下位于 http://tapmeister.com/test/dom.html 的脚本.由于某些未知原因,tinymce.editors.ta1 和 tinymce.editors[0] 显示为未定义,尝试使用它们下的方法会导致错误。但是当我使用 FireBug 检查 tinymce 或 tinymce.editors 时,我在 DOM 中看到它们。

因此,我创建了一个 jsfiddle http://jsfiddle.net/JWyWM/在 stackoverflow 上向人们展示。但是当我对其进行测试时,tinymce.editors.ta1 和 tinymce.editors[0] 不再是未定义的,并且这些方法可以正常工作。

这是怎么回事???也许与公共(public)/ protected /私有(private)属性(property)有关?如何访问 tinymce.editors.ta1.hide() 等方法?谢谢!!!

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>Testing</title>
<script src="http://tinymce.cachefly.net/4.0/tinymce.min.js"></script>
<script type="text/javascript">
tinymce.init({selector: "textarea#ta1"});
tinymce.init({selector: "textarea#ta2"});
console.log(tinymce);
console.log(tinymce.editors);
console.log(tinymce.editors.ta1);
console.log(tinymce.editors[0]);
//tinymce.editors.ta1.hide();
//alert('pause');
//tinymce.editors.ta1.show();
</script>
</head>

<body>
<form>
<textarea id="ta1"></textarea>
<textarea id="ta2"></textarea>
</form>
</body>
</html>

最佳答案

当您调用 init 时,TinyMCE 不会立即执行所有设置工作。它提供了一个回调,setup,在工作完成时告诉您。

因此,如果您提供一个setup 回调,您就可以与编辑器实例进行交互了。

这是一个例子(我也把你的脚本移到了最后,which is best practice regardless):

Live Example | Live Source

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<title>Testing</title>
</head>

<body>
<form>
<textarea id="ta1"></textarea>
<textarea id="ta2"></textarea>
</form>
<script src="http://tinymce.cachefly.net/4.0/tinymce.min.js"></script>
<script type="text/javascript">
tinymce.init({
selector: "#ta1, #ta2",
setup: function(e) {
console.log("Editor " + e.id + " is ready");
}
});
</script>
</body>
</html>

现在,如果你想真正访问编辑器实例,奇怪的是 TinyMCE 不会将它添加到 tinymce.editors 直到 after 调用 setup功能。但是,如果您进行短暂的屈服,那么一切就绪。以下是更改后的 setup 函数:

Live Copy | Live Source

setup:    function(e) {
// Bizarrely, TinyMCE calls `setup` *before* adding
// the relevant editor to `tinymce.editors`,
// so we have to yield briefly
console.log("Editor " + e.id + " is ready");
if (e.id === "ta2") {
console.log("It's ta2, I'll hide it in a moment.");
setTimeout(function() {
tinymce.editors[e.id].hide();
}, 0);
}
}

那么为什么它可以在 jsFiddle 上运行?好吧,jsFiddle 有一个真正的脑死亡 令人惊讶 默认设置,即将所有脚本放入 window#load 回调函数中。 window#load 发生在加载过程非常的后期,在所有外部资源都已加载之后。 (您可以在 jsFiddle UI 中看到,它是左侧的第二个下拉列表。)显然 TinyMCE 在那个时候已经完全准备好了,而不是在周期的早期。

旁注:在 99.9% 的情况下,为标签名称提供 id 选择器是绝对没有意义的,例如文本区域#ta1id 值是唯一的,因此您不必对它们进行限定,除非您明确希望避免匹配有时可能具有一个标签名称或有时具有另一个标签名称的元素,这是一种非常不寻常的用法案例。

关于JavaScript 对象属性为 "sometimes"未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16590419/

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