Javascript 正在尝试将onClick事件创建/绑定到<;选项>;通过dojo.xhrGet请求生成

Javascript 正在尝试将onClick事件创建/绑定到<;选项>;通过dojo.xhrGet请求生成,javascript,events,dojo,Javascript,Events,Dojo,我正试图让一段dojo代码正常工作,但有点困难。 其背后的意图如下: var callback = function(){ checkPack(opt.target.innerHTML,i); }; dojo.connect(opt,'onclick', callback); 1-具有select fire an onChange事件,该事件通过dojo.xhrGet检索选项列表。 2-使检索到的每个选项都与自己的onclick事件关联/绑定,并且它所激发的函数具有2个参数 问题:此时

我正试图让一段dojo代码正常工作,但有点困难。 其背后的意图如下:

var callback = function(){
    checkPack(opt.target.innerHTML,i);
};
dojo.connect(opt,'onclick', callback);
1-具有select fire an onChange事件,该事件通过dojo.xhrGet检索选项列表。 2-使检索到的每个选项都与自己的onclick事件关联/绑定,并且它所激发的函数具有2个参数

问题:此时,选项上的onClick事件会在通过Ajax检索时立即触发,并且不会传递第一个参数。事件在此之后停止触发(单击不会产生任何结果)

提前感谢您的反馈。代码如下

JS

HTML


选择你的节目
Escolha Um Programa//这是由第一个xhrGet调用填充的节点

编辑:我编辑了代码以反映对它的更改,并通过检查代码添加了html,我可以在函数checkAvailable中看到,在连接到onclick事件的行中,而不是将函数作为回调传递给调用它的函数

你应该这样做:

var callback = function(){
    checkPack(opt.target.innerHTML,i);
};
dojo.connect(opt,'onclick', callback);

根据我的经验,如果你花了一天多的时间来跟踪一个跨浏览器的问题,那么它可能在你的基本html知识或基本Js概念的某个地方

这与只有FF管理直接连接到选项标记的onclick事件有关。对于团队的其他成员,您需要将onchange附加到父级

因此,这里是工作代码的最终版本,以防有人遇到类似的问题

function checkAvailable(i){
    var id_prog = 'programa_'+i;
    var id_coreo = 'coreografia_'+i;

    var prog = dojo.byId(id_prog).value;

    dojo.xhrGet({
        url:"ajaxCoreo.php",
        handleAs:"text",
        content: {
            programa: prog,
            item: i
        }, 
        load: function(data){
            var targetNode = dojo.byId(id_coreo);
            dojo.place(data,targetNode,"only");
            dojo.byId(id_coreo).disabled = false;
            var callback = function(evt){
                var j = evt.target.value;
                checkPack(j,i);
            };
            dojo.query("#coreografia_"+i).connect('onchange', callback);
            setValor(i);
        }

    });

}



    function checkPack(j,i){
    console.log('write me if you fire inside second function');
    console.log(j);
    console.log(i);

    var num = j;
    var id_prog = 'programa_'+i;
    var id_coreo = 'coreografia_'+j;

    var prog = dojo.byId(id_prog).value;

    //Confirma Se não há encomendas previas deste pack (um máximo de 2 anteriores)

    dojo.xhrGet({
        url:"ajaxPack.php",
        handleAs:"text",
        content: {
            programa: prog,
            coreo: j
        },
        load: function(data){

            if(data=="true"){
                dojo.query("#coreografia_"+i+" option[value="+num+"]").forEach(dojo.destroy);
                alert('O Pack escolhido já foi encomendado previamente.');

            }

        }

    });
}

这可以解决部分问题。现在的问题是铬。它适用于FF,但Chrome从不启动已注册的checkPack函数。控制台上也没有。谢谢你的回答!脚本在FF和IE9上工作。不适用于低于9的Chrome、Safari和IE。通过工作,我的意思是,它确实启动了第一个xhrGet函数,检索并填充了所需的de内容,我相信(通过检查DOM),它确实注册了与每个内容相关联的单击事件。不工作意味着它永远不会实际启动已注册的函数。我编辑了代码以反映Juanma的输入和html。我有点相信这是一个事件管理的问题,但我已经没有“尝试”…我已经找到了基于此的解决方案
var callback = function(){
    checkPack(opt.target.innerHTML,i);
};
dojo.connect(opt,'onclick', callback);
function checkAvailable(i){
    var id_prog = 'programa_'+i;
    var id_coreo = 'coreografia_'+i;

    var prog = dojo.byId(id_prog).value;

    dojo.xhrGet({
        url:"ajaxCoreo.php",
        handleAs:"text",
        content: {
            programa: prog,
            item: i
        }, 
        load: function(data){
            var targetNode = dojo.byId(id_coreo);
            dojo.place(data,targetNode,"only");
            dojo.byId(id_coreo).disabled = false;
            var callback = function(evt){
                var j = evt.target.value;
                checkPack(j,i);
            };
            dojo.query("#coreografia_"+i).connect('onchange', callback);
            setValor(i);
        }

    });

}



    function checkPack(j,i){
    console.log('write me if you fire inside second function');
    console.log(j);
    console.log(i);

    var num = j;
    var id_prog = 'programa_'+i;
    var id_coreo = 'coreografia_'+j;

    var prog = dojo.byId(id_prog).value;

    //Confirma Se não há encomendas previas deste pack (um máximo de 2 anteriores)

    dojo.xhrGet({
        url:"ajaxPack.php",
        handleAs:"text",
        content: {
            programa: prog,
            coreo: j
        },
        load: function(data){

            if(data=="true"){
                dojo.query("#coreografia_"+i+" option[value="+num+"]").forEach(dojo.destroy);
                alert('O Pack escolhido já foi encomendado previamente.');

            }

        }

    });
}