Как правильно использовать это во внешнем Javascript?

88
7

У меня есть две javascript-функции, которые отлично работают, пока я храню их в HTML-теге моего заголовка, но я бы хотел переместить их во внешний файл javascript.

function uploadImageSB() {

Shadowbox.init({});

// shadowbox for image upload
Shadowbox.open({

content: 'photo.cgi?function=photo_upload',
player: 'iframe',
title: 'Image Upload',
height: 200,
width: 500,
options: {

onFinish: function () {

// get the iframe
var iframe = document.getElementById('sb-player');

var formName = 'photoForm';

// add an event listener to determine when the sb form is fully loaded
if (iframe.addEventListener) {
// use addEventListener for Safari, Chrome, Firefox
iframe.addEventListener("load", getTA(formName), true);
} else {
// use attachEvent for IE
iframe.attachEvent("onload", getTA(formName));
}
}
}
})
};

Вышеупомянутый javascript вызывает следующую функцию:

function getTA(fn) {

// get the contents of the tinymce editor
var ed = tinymce.activeEditor;
var content = ed.save();

// dynamically create textarea
var ta = document.createElement('textarea');
ta.textContent = content;
ta.name = 'article';
ta.value = ta.textContent;

// get the iframe content
var iframeContent = this.contentDocument || this.contentWindow.document;

// append the textarea to the shadowbox form, but do not display it
var form = iframeContent.getElementById(fn);
form.appendChild(ta);
form.getElementsByTagName('textarea')[0].style.display = 'none';
};

Я думаю, проблема в том, что я использую this здесь:

var iframeContent = this.contentDocument || this.contentWindow.document;

Но я не уверен, как это исправить. Благодарю.

спросил(а) 2021-01-25T18:50:17+03:00 4 месяца, 2 недели назад
1
Решение
77

По моему пониманию ваш код не должен работать, когда вы звоните из головы тоже. Проблема заключается в следующем коде.

            if (iframe.addEventListener) {
// use addEventListener for Safari, Chrome, Firefox
iframe.addEventListener("load", getTA(formName), true);
} else {
// use attachEvent for IE
iframe.attachEvent("onload", getTA(formName));
}

Вы вызываете функцию getTA (formName) там, и потому, что она вызывается в контексте окна, вы не получаете iframe в качестве своего контекста, то есть этого.

Чтобы решить эту проблему, вам необходимо предоставить ее как слушателя как объект функции в качестве аргумента, как указано ниже.
EDIT: использование закрытия для поддержки использования одного и того же fn для нескольких экземпляров.

                if (iframe.addEventListener) {
// use addEventListener for Safari, Chrome, Firefox
iframe.addEventListener("load", (function(){
return function(){
getTa.call(this, formName);
}
})(), true);
} else {
// use attachEvent for IE
iframe.attachEvent("onload", (function(){
return function(){
getTa.call(this, formName);
}
})());
}

Это должно сделать это.

ответил(а) 2021-01-25T18:50:17+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема