Javascript “我怎么能耽搁呢?”;onsubmit“;事件,直到加载了某些内容?

Javascript “我怎么能耽搁呢?”;onsubmit“;事件,直到加载了某些内容?,javascript,events,delay,onsubmit,Javascript,Events,Delay,Onsubmit,在表单的提交事件中,我遇到了一个问题 我正在使用javascriptimage元素向另一个网页发送一些跟踪信息(参数在GET中) 但是,当我尝试加载图像(通过src属性)时,页面刷新的时间比图像请求发生的时间早(或者立即中止) 这样,就不会将任何信息发送到外部跟踪页面。我如何在此提交处理程序中等待该图像的加载 编辑: 还有一点我没有注意到,其他事件可能在同一个地方(例如验证等)。这应该很好: var img = document.getElementById('image'), form

表单的
提交事件中,我遇到了一个问题

我正在使用javascript
image
元素向另一个网页发送一些跟踪信息(参数在
GET
中)

但是,当我尝试加载
图像
(通过
src
属性)时,页面刷新的时间比
图像
请求发生的时间早(或者立即中止)

这样,就不会将任何信息发送到外部跟踪页面。我如何在此
提交
处理程序中等待该
图像的
加载

编辑: 还有一点我没有注意到,其他事件可能在同一个地方(例如验证等)。

这应该很好:

var img = document.getElementById('image'),
    form = document.getElementById('form');

img.addEventListener('load', function (){
    window.imageIsLoaded = true;
    if(window.submitForm === true){
        form.submit();
    }
}, false);

form.addEventListener('submit', function (e){
    window.submitForm = true;
    if(window.imageIsLoaded !== true){
        e.preventDefault();
        return false;
    }
}, false);​

如果需要自动提交表单的另一种方式,无需使用globals:

document.getElementById('yourFrm').addEventListener('submit',(function()
{
    'use strict';
    var imgLoaded,img,tmpImgLoad;
    imgLoaded = false;
    img = document.getElementById('yourImg');
    tmpImgLoad = function ()
    {
        imgLoaded = true;
        img.removeEventListener('load',tmpImgLoad,false);//remove obsolete listener?
    };
    img.addEventListener('load',tmpImgLoad,false);
    return function(e)
    {
        if (!imgLoaded)
        {
            tmpImgLoad = function()
            {
                imgLoaded = true;
                img.removeEventListener('load',tmpImgLoad,false);
                document.getElementById('yourForm').submit();
            };
            e.preventDefault();
            e.stopPropagation();
        }
    };
})(),false);
此代码将加载事件侦听器绑定到image元素,该元素将闭包变量设置为true。如果提交表单时该变量为false,则load事件的回调也会更改为提交表单

我承认这有点复杂,但你要知道:全球化并不是解决这个问题的唯一方法


刚刚也通过了JSLint。几次微小的调整,加上“容忍凌乱的空白”和“asume browser”,这段代码通过时没有任何警告或错误

我担心这会取消提交事件。并将强制用户两次单击“提交”按钮编辑的问题是,几乎所有浏览器都会在弹出窗口拦截器中捕获新提交的表单(如果目标是任何将打开新窗口/选项卡的表单)。请使用同步按钮。@sabithpocker:不,这需要是纯JS(为了与更多页面兼容)@Yoshi:如果我能处理的话,同步请求可以成为解决方案timeouts@sabithpocker:IE中的跨域问题,因为它被发送到外部域名,您有什么线索可以解决吗?@XaReSx为什么您还没有添加您拥有的相关代码。添加您的
submit event listener
和您正在使用
进行跟踪的
code
。即使没有这些,这些家伙也有着如此美妙的答案:)对我来说,问题似乎是:如何在提交时加载跟踪图像。您的解决方案假定给定的图像已经是dom的一部分。我不认为这是正确的。@Yoshi,我有点假设它已经是dom的一部分,因为Amaan提供了答案和问题:但是当我尝试加载该图像时(通过src属性)。但是如果不是这样的话,那么你是对的,当然OP应该求助于ajax来找到解决问题的最简单的方法。@EliasVanOotegem:太好了,但我没有提到还有其他提交事件(见我上次的编辑),所以我个人认为我不能阻止提交和传播。阻止事件传播不应该是一个问题,只要您将事件侦听器附加到一个特定的表单,该表单不应该被提交,除非加载img。如果你是这个意思,当然。如果您想继续验证此表单,即使img未完全加载,那么省略
stopPropagation
可以在不提交表单的情况下进行表单验证。因此,是的,只需删除
stopPropagation()
,但总的来说,代码仍能正常工作