在整个调用堆栈被处理之前,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不会被计算,直到该函数结束。)

问题是它看起来像Window.Location没有被终结/设置/发送/直到ENTIRE JS调用堆栈完成。 所以,当我点击启动这些函数调用的按钮时,堆栈会得到一些Jquery函数(例如'handler','default','each loop'...),然后它会触发我写的JS代码,这反过来又增加了几个函数调用到堆栈; 然后还有几个Jquery函数添加到堆栈中,等等。但是,在我的函数中创建的这些堆叠的window.location定义实际上并不会触发远程系统,除非我一直通过JS调用堆栈并退出所有内容。 所以window.location只是被定义/设置为函数调用中最后一次设置的内容,而不是包含堆栈中出现的所有中介定义/集合。 它就像一个变量在调用堆栈中被多次更改,但最终只读取一次。

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

谢谢,J


你可能想要使用一个iframe:

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

这将允许任何数量的呼叫一次。


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

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

成:

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

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

链接地址: http://www.djcxy.com/p/12423.html

上一篇: window.location not evaluating until entire call stack is processed?

下一篇: onclick tracking on links with a rotating image carousel