0

我有一个大型机和一个 iframe:

  1. 我将一个函数 beforeIframe 传递给 mainFrame。
  2. mainFrame 将 beforeIframe 的 URL 更改为 changedIFrame。
  3. 加载 changedIFrame 后,执行匿名函数。

下面的代码是我想要做的:

主框架.jsp

function randerLeftMenu(callBack) {
    $("#ifrm").attr("src", "<ui:context />/changedIframe")
    if(callBack) {
        $("#ifrm").load(function() { callBack(); });
    }
}

beforeIframe.jsp

(我必须操作 DOM 对象。)

parent.randerLeftMenu(function() {$("#docType").val("aaa"); });

改变Iframe.jsp

<input type="text" value="testVal" id="docType" class="input width2">

我已经尝试了很多事情,但我无法做到这一点。

主框架

function randerLeftMenu(callBack) {
    if(callBack) {
        $("#ifrm").load(function() {
            with(this.contentWindow) { callBack(); }
            callBack.apply(this);
            eval(callBack());
            callBack.call(this);
            $.proxy(callBack(),this.contentWindow);
        });
    }
}
4

1 回答 1

0

在您的示例中,$您在randerLeftMenu“beforeIframe.jsp”的调用中包含的内容将始终限于调用它的上下文。只有this变量可以动态绑定到不同的范围。您应该能够通过将函数作为字符串传递(或依赖Function'stoString()方法)并动态评估字符串来解决此问题。

更新以包含工作示例(经过测试的 Firefox 和 IE):

function randerLeftMenu(callBack) {
    $("#ifrm").attr("src", "<ui:context />/changedIframe");
    if(callBack) {
        $("#ifrm").load(function(e) {
            try {
                // This script injection and setTimeout is only necessary
                //  if you don't want to change the iframe source to add jQuery;
                //  otherwise, you only need the eval().
                var script = document.createElement('script');
                script.src = "http://code.jquery.com/jquery-latest.js";
                e.target.contentWindow.document.body.appendChild(script);
                setTimeout(function () {
                    // var evalStr = 'e.target.contentWindow.eval(\'('+callBack.toString().replace(/\n/g, ' ')+')()\')'; // You can pass the function and convert to a string for Firefox, but IE of course doesn't support it, so you will need to pass the function as a string
                    var evalStr = 'e.target.contentWindow.eval(\'('+callBack.replace(/[\r\n]/g, ' ')+')()\')';
                    eval(evalStr);
                }, 500);
            }
            catch(e) {
                alert(e);
            }
        });
    }
}
于 2012-09-20T01:59:46.267 回答