如何在外部Javascript中正确使用它?

时间:2013-05-25 16:24:17

标签: javascript html

我有两个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;

但我不确定如何解决它。感谢。

1 个答案:

答案 0 :(得分:2)

根据我的理解,当您从头部打电话时,您的代码也不起作用。问题在于您的以下代码。

            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);
                         }
                    })());
                }

应该这样做。