0

私は道場コードの一部を機能させようとしていて、少し苦労しています。その背後にある意図は次のようになります。

1-dojo.xhrGetを介してオプションのリストを取得するonChangeイベントをselectが起動するようにします。2-取得した各オプションに、それに関連付けられた/バインドされた独自のonclickイベントを取得させ、起動する関数は2つの引数を取ります

問題:この時点で、オプションのonClickイベントは、Ajaxを介して取得され、最初の引数を渡さないとすぐに発生します。その後、イベントの発生は停止します(クリックしても何も生成されません)。

よろしくお願いします。コードは次のとおりです

JS

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.innerHTML;

                checkPack(j,i);
                console.log('write me if you fire inside first function');
            };
            dojo.query("#coreografia_1>option").connect('click', 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;

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

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

        }

    });

}

HTML

<select name="programa[]" id="programa_1" onChange="checkAvailable(1)" title="obrigatorio">
                <option value="0">Choose your program</option> 

</select>
 <select name="coreografia_1" id="coreografia_1" disabled="disabled" title="obrigatorio">
                <option value="0" selected="selected">Escolha Um Programa</option> //this is the node that is populated by the first xhrGet call
            </select>

編集:変更を反映するようにコードを編集し、htmlを追加しました

4

2 に答える 2

0

コードを調べると、関数checkAvailableで、呼び出しているコールバックとして関数を渡す代わりに、 onclickイベントに接続する行にあることがわかります。

dojo.connect(opt,'onclick', checkPack(opt.target.innerHTML,i));

次のようなことをする必要があります。

var callback = function(){
    checkPack(opt.target.innerHTML,i);
};
dojo.connect(opt,'onclick', callback);
于 2012-04-18T21:09:43.230 に答える
0

私の経験から、クロスブロワーの問題を追跡するために1日以上費やす場合、それはおそらく基本的な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.');

            }

        }

    });
}
于 2012-04-20T14:41:57.900 に答える