【问题标题】:How can I delay "onsubmit" event until something is loaded?如何延迟“onsubmit”事件直到加载某些内容?
【发布时间】:2012-08-28 00:03:40
【问题描述】:

我在onSubmitform 事件中遇到问题。

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

但是当我尝试加载 image(通过 src 属性)时,页面会在 image 的请求发生之前刷新(或立即中止)。

这样,不会向外部跟踪页面发送任何信息。我如何在这个submit 处理程序中等待loadimage

编辑: 还有一点我错过了,其他事件可以在同一个地方(例如验证等)

【问题讨论】:

  • 使用同步的xhr
  • @sabithpocker:不,这需要是纯 JS(为了与更多页面兼容)
  • @Yoshi:如果我能处理超时,同步请求可以成为解决方案
  • @sabithpocker: IE跨域问题,既然是发送到外部域名,请问您有什么解决办法吗?
  • @XaReSx 为什么您还没有添加您拥有的相关代码。添加您的submit event listener 和您正在使用的code for tracking。即使没有这些,这些人也给出了如此精彩的答案:)

标签: javascript events delay onsubmit


【解决方案1】:

这应该可以正常工作:

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);​

Demo

【讨论】:

  • 恐怕这只会取消提交事件。并且会强制用户点击提交按钮两次
  • 您编辑的问题是,实际上所有浏览器都会在弹出窗口阻止程序中捕获新提交的表单(如果目标是打开新窗口/标签的任何内容)。
【解决方案2】:

如果需要,不使用全局变量自动提交表单的另一种方法:

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

此代码将加载事件侦听器绑定到您的图像元素,将闭包变量设置为 true。如果在提交表单时该变量为 false,则 load 事件的回调也将更改为提交表单。

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

也刚刚通过 JSLint。一些微小的调整以及“容忍混乱的空白”和“假设浏览器”,这段代码完全没有任何警告或错误就通过了

【讨论】:

  • 对我来说,问题似乎是:如何在提交时加载该跟踪图像。您的解决方案假设给定的图像已经是 dom 的一部分。我不认为这是正确的。
  • @Yoshi,我有点假设它已经是 dom 的一部分,因为 Amaan 提供的答案和问题:但是当我尝试加载该图像时(通过 src 属性)。但如果不是这种情况,那么你是对的,当然,OP 应该转向 ajax 以最简单地解决他的问题。
  • @EliasVanOotegem:很好,但我没有提到可以有其他提交事件(参见我上次的编辑),所以我个人认为我无法阻止提交和传播。
  • 停止传播事件应该不是问题,只要您将事件侦听器附加到一个除非加载 img 否则不应提交的特定表单。如果这就是你的意思,当然。如果您想在 img 未完全加载的情况下继续验证此表单,则省略 stopPropagation 允许表单验证,而无需提交表单。所以是的,只需删除stopPropagation(),但总体而言,代码仍将按预期工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
相关资源
最近更新 更多