如何在外部Javascript中正确使用它?
我有两个javascript函数,只要我将它们保存在head标记的HTML中,它们就可以正常工作,但我希望将它们移动到外部javascript文件中如何在外部Javascript中正确使用它?,javascript,html,Javascript,Html,我有两个javascript函数,只要我将它们保存在head标记的HTML中,它们就可以正常工作,但我希望将它们移动到外部javascript文件中 function uploadImageSB() { Shadowbox.init({}); // shadowbox for image upload Shadowbox.open({ content: 'photo.cgi?function=photo_upload', player
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;
但我不知道该怎么解决。谢谢。据我所知,当您从head打来电话时,您的代码不应该工作。问题在于您的以下代码
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作为您的上下文
要解决此问题,您需要将其作为侦听器作为函数对象作为参数提供,如下所示。编辑:使用闭包支持对多个实例使用相同的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);
}
})());
}
应该可以了。那么问题是什么?你有没有把它放在一个外部文件中,但它不起作用,或者你想知道如何把它放在一个外部文件中?当我把它放在一个外部文件中时,它就不起作用了。我怀疑这是因为我不正确地使用了我共享的代码行(尽管我不确定这一点)。是的,我想知道我需要做哪些更改才能让它在外部文件中工作。只要正确引用JS文件,将JavaScript放入外部JS文件不会有任何区别。在这种情况下,我能想到的唯一一件事是在Shadowbox之前引用外部文件,因此当调用它时,
Shadowbox
将是未定义的。你有JS错误吗?是的,我有javascript错误。Firefox报告此.contentWindow未定义。谢谢。这实际上就是我一直在使用的代码——而且它非常有效。但是,我需要传递两个不同的formName,因为我需要多次使用同一个函数(唯一的区别是每个表单都有一个唯一的id(photoForm和viewForm)。当我尝试传递其中一个id时,我会收到一个错误(this.contentWindow未定义).我想我可以写两个不同的函数,但我不明白为什么不能使用同一个?更新了我的答案,应该可以了。