Javascript 为什么我使用的“onload”事件处理程序只能偶尔工作?

Javascript 为什么我使用的“onload”事件处理程序只能偶尔工作?,javascript,html,Javascript,Html,下面的代码,工作。。。有时候,但我不知道为什么它总是不起作用 我试图确定有多少人按下了不同网页上的Buy Now PayPal按钮 目前,该站点上的每个页面都会从独特的位置获取一个43字节的1x1 gif,这要归功于mod_rewrite,它可以在Apache访问日志中轻松地显示出来。我的想法是,如果我可以用javascript更改该图像的URL,我就可以跟踪访问日志中的点击,同时保持浏览器的前进和后退按钮正常工作 下面的代码Override\u Form\u OnClick在页面上查找一个表单

下面的代码,工作。。。有时候,但我不知道为什么它总是不起作用

我试图确定有多少人按下了不同网页上的Buy Now PayPal按钮

目前,该站点上的每个页面都会从独特的位置获取一个43字节的1x1 gif,这要归功于mod_rewrite,它可以在Apache访问日志中轻松地显示出来。我的想法是,如果我可以用javascript更改该图像的URL,我就可以跟踪访问日志中的点击,同时保持浏览器的前进和后退按钮正常工作

下面的代码Override\u Form\u OnClick在页面上查找一个表单(只有一个)并将处理程序my\u shopping附加到表单的OnClick处理程序

然后,my_shopping处理程序再次更新名为my_stats的图像资源(只有一个),将表单元素的提交函数附加到图像的onload处理程序,然后返回false,以便在加载新图像之前表单不会被提交

这就是目的,但它并不总是将新映像记录在访问日志中。当然,我只在Chrome上使用开发工具测试过它,所以可能是其他浏览器的问题

<script>
function my_shopping(onload_handler, shopping_tag) {
    'use strict';
    var my_img_elements = document.getElementsByName('my_stats'),
        my_img_url,
        i,
        len;
    len = my_img_elements.length;
    if (len > 1) {
        alert("Multiple my_stats elemetns on page: only expected 1.");
    }
    for (i = 0; i < len; i += 1) {
        my_img_url = my_img_elements[i].src;
        my_img_url = my_img_url.replace(".gif", "." + shopping_tag + ".gif");
        my_img_elements[i].onload = onload_handler;
        my_img_elements[i].src = my_img_url;
    }
    return false;
}

function Override_Form_OnClick() {
    'use strict';
    var elements = document.getElementsByTagName('form'),
        element,
        i,
        len;
    len = elements.length;

    if (len > 1) {
        alert("Multiple 'form' elements on page: only expected 1.");
    }
    for (i = 0; i < len; i += 1) {
        element = elements[i];
        element.onclick = function () { my_shopping(element.submit, "shopping.PayPal") };
    }
    return true;
}

Override_Form_OnClick();
</script>

该网站的政策强烈倾向于只使用javascript。

也许这会奏效。让我知道

for(var i=0,l=my_img_elements.length; i<l; i++){
  var mi = my_img_elements[i], ni = new Image;
  ni.src = mi.src = mi.src.replace(".gif", "." + shopping_tag + ".gif");
  ni.onload = onload_handler;
}

是否可能缓存了图像?请尝试在.onload之前分配.src。在您更改其.src之前,这些图像可能已经加载,因为它们有一个.src。顺便说一下,你听说过i++吗。for循环应该更像forvar i=0,l=my\u image\u elements.length;i@PHPglue您能否详细说明一下“可能已经加载”。。。至于awkard i++=1,一个在线lint程序抱怨i++,len在循环开始之前被评估。@stevemarvell我不知道怎么做:用户必须已经点击表单/链接才能在缓存中获取图像。购买是一次性的东西,不会让人们一直点击。my_img_url=my_img_elements[i]。srcPedantic,但是:即使它将被提升,我发现只声明一次变量更干净;“我会把这个声明放在循环之外。”托马斯说。哪个变量?mi必须在循环内才能工作。@phpglue mi。但这种重新声明不会导致错误。这只是语义学@托马斯。是的,只要循环中的mi=my\u img\u元素[i],你是对的。切换顺序会使代码在大约3-5%的时间内工作。不幸的是,这不是一个解决办法。