如何在外部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

我有两个javascript函数,只要我将它们保存在head标记的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;

但我不知道该怎么解决。谢谢。

据我所知,当您从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未定义).我想我可以写两个不同的函数,但我不明白为什么不能使用同一个?更新了我的答案,应该可以了。