window.location直到处理完整个调用堆栈才进行评估?

时间:2014-01-04 19:14:24

标签: javascript jquery callstack window.location

我有一些javascript,从一个HTML按钮触发,调用一个函数。这也是使用Jquery,因此在这个过程中也会有一些基本函数被调用。在我的脚本中,我对window.location进行了一些更改,以便与远程系统进行通信(该系统应该响应这些调用而触发不同的脚本)。这个window.location定义不是使用HTTP协议,而是使用FMP,我的机器上已注册 - FileMaker Pro的协议。

示例代码:

function compareJSON() {
    dataSession=({ //build object for output    });   
    $.each( dataSession.chapters , function( indexC, value ) {  
        //compare objects to some others, testing and changing data
    });
    //Call remote script on other system
    window.location= "fmp://blah.dee.com/Blar?script=SaveJSON&$JSONobject=" + JSON.stringify( dataSession );
   //Call remote script on other system
   window.location="fmp://blah.dee.com/Blar?script=EditJSON";
}

(请记住,因为这是使用Jquery,只需按下调用此compareJSON()函数的按钮就可以在运行我的函数之前创建一个包含2或3个其他函数的堆栈。但是,即使它是直接调用的某种方式,比较函数本身将在堆栈上,因此window.location将不会被评估,直到该函数结束。)

问题是,在ENTIRE JS调用堆栈完成之前,看起来Window.Location没有被最终确定/设置/发送。所以,当我单击启动这些函数调用的按钮时,堆栈会获得一些Jquery函数(例如'handler','default','each loops'...),然后它会触及我写的JS代码,这又为堆栈添加了一些函数调用;然后还有一些Jquery函数添加到堆栈中,等等。但是在我的函数中生成的这些堆栈的window.location定义实际上并没有触发远程系统,直到我一直遍历JS调用堆栈并退出所有内容。因此,window.location仅定义/设置为函数调用中最后设置的内容,而不是包括堆栈中发生的所有介入定义/集。它就像一个变量,在调用堆栈中多次更改,但最后只读取一次。

有没有办法强制window.location在设置时进行评估,而不是等待最后一次设置?

谢谢, Ĵ

2 个答案:

答案 0 :(得分:1)

您可能想要使用iframe:

function callScript(url) {
    var ifr = document.createElement('iframe');
    ifr.src = url;
    // you can even add ifr.onload = function() {doSomething();}; if you want
}

这将允许一次拨打任意数量的电话。

答案 1 :(得分:0)

这可能不起作用,但超时的想法是改变这样的事情:

// code code code ...
window.location = newUrl;
// more code ...

成:

// code code code ...
window.location = newUrl;
setTimeout(function() {
  // more code ...
}, 1);

这允许浏览器在启动计时器处理程序的下一个事件循环之前可以执行某些操作。