CKEDITOR.scriptLoader
, по-видимому, используется для загрузки ресурсов в родительское окно, не в iframe'd document
. Это приводит к тому, что ваш код выше выполняется и повторно применяет шрифт Typekit к родительскому окну вместо iframe.
Мое решение для этого - установить document.domain
в родительском окне, динамически создать <script>
элементы, добавить их к <head>
в iframe document
.
1. Ваш Typekit имеет белый список доменов. CKEditor не будет устанавливать атрибут src
тега <iframe>
, чтобы он возвращал действительное значение в этом белом списке, если вы не укажете document.domain
в родительском окне в качестве домена в этом белом списке.
document.domain = "example.com";
2. Я создал сценарии со строками типа
script1 = document.newElement('script');
script1.src = "https://use.typekit.com/MYKEY.js";
script2 = document.newElement('script');
script2.text = "try{Typekit.load();}catch(e){}";
3. Затем я добавляю их в dom (я использую jQuery в моем проекте, так я и нацеливаюсь на элемент)
head = jQuery('textarea.editor').ckeditorGet().document.getHead().$;
head.appendChild(script1);
head.appendChild(script2);
Шрифты Typekit теперь применяются.
Изменено для использования в настройке CKEditor
editors.ckeditor(function(){
var head = this.document.getHead().$,
script1 = document.newElement("script"),
script2 = document.newElement("script");
script1.src = sprintf("https://use.typekit.com/%s.js", app_typekit_id);
script2.text = "setTimeout(function(){ try{Typekit.load();}catch(e){} }, 0);";
head.appendChild(script1);
head.appendChild(script2);
},
{
//... your custom config
});
Возможно, есть лучший способ, чем setTimeout(function(){ ... }, 0);
(задержка 0 мс) , но оставление только try{Typekit.load();}catch(e){}
не дает script1
достаточно времени для добавления и интерпретации браузером начать блокировку. Также обратите внимание, что мое использование sprintf()
выше происходит из библиотеки (не родной JS) .